diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index e69de29b..00000000 diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 50ed4d30..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint", - "react-hooks" - ], - "extends": [ - "plugin:react/recommended", - "plugin:@typescript-eslint/recommended" - ], - "rules": { - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn", - "react/prop-types": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/no-require-imports": "off", - "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/no-empty-object-type": "off", - "@typescript-eslint/no-unused-expressions": "off", - "@typescript-eslint/prefer-as-const": "off", - "semi": [ - "error", - "always" - ] - }, - "settings": { - "react": { - "pragma": "React", - "version": "detect" - } - } -} diff --git a/.github/workflows/add-to-backlog.yml b/.github/workflows/add-to-backlog.yaml similarity index 100% rename from .github/workflows/add-to-backlog.yml rename to .github/workflows/add-to-backlog.yaml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yaml similarity index 69% rename from .github/workflows/node.js.yml rename to .github/workflows/node.js.yaml index 6d03085d..2e0fc395 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yaml @@ -9,11 +9,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: Use Node.js 18 - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - name: Use Node.Js + uses: actions/setup-node@v4 with: - node-version: 18 + node-version: lts/* - name: Install dependencies run: npm ci - name: Build the app diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..49f037b0 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,34 @@ +import eslint from "@eslint/js"; +import prettierConfig from "eslint-config-prettier"; +import stylisticTs from "@stylistic/eslint-plugin-ts"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + eslint.configs.recommended, + tseslint.configs.strict, + tseslint.configs.stylistic, + { + plugins: { + "@stylistic/ts": stylisticTs + }, + ignores: [ + "node_modules", + "dist", + "webpack.config.js", + ], + rules: { + "@stylistic/ts/indent": ["error", 2], + "@stylistic/ts/semi": ["error", "always"], + "@typescript-eslint/no-unused-vars": ["error", { + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + caughtErrorsIgnorePattern: "^_", + destructuredArrayIgnorePattern: "^_", + }], + "@typescript-eslint/no-empty-object-type": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/prefer-literal-enum-member": "off", + } + }, + prettierConfig, +); diff --git a/examples/common.ts b/examples/common.ts index 31fb2402..2f72734f 100644 --- a/examples/common.ts +++ b/examples/common.ts @@ -1,12 +1,12 @@ import { SerializedDiagram, convertToSerializedDiagram, -} from '../src/graph-explorer/index'; +} from "../src/graph-explorer/index"; export function onPageLoad(callback: (container: HTMLDivElement) => void) { - document.addEventListener('DOMContentLoaded', () => { - const container = document.createElement('div'); - container.id = 'root'; + document.addEventListener("DOMContentLoaded", () => { + const container = document.createElement("div"); + container.id = "root"; document.body.appendChild(container); callback(container); }); @@ -21,7 +21,7 @@ export function tryLoadLayoutFromLocalStorage(): SerializedDiagram | undefined { // backward compatibility test. If we encounder old diagram, // wrap it into Diagram interface, jsonld - pass through - if (entry['@context']) { + if (entry["@context"]) { return entry; } else { return convertToSerializedDiagram({ @@ -29,7 +29,7 @@ export function tryLoadLayoutFromLocalStorage(): SerializedDiagram | undefined { linkTypeOptions: [], }); } - } catch (e) { + } catch (_e) { /* ignore */ } } diff --git a/examples/dbpedia.ts b/examples/dbpedia.ts index cf027a4a..88836183 100644 --- a/examples/dbpedia.ts +++ b/examples/dbpedia.ts @@ -1,5 +1,5 @@ -import { createElement, ClassAttributes } from 'react'; -import * as ReactDOM from 'react-dom'; +import { createElement, ClassAttributes } from "react"; +import * as ReactDOM from "react-dom"; import { Workspace, @@ -7,13 +7,13 @@ import { SparqlDataProvider, SparqlQueryMethod, DBPediaSettings, -} from '../src/graph-explorer/index'; +} from "../src/graph-explorer/index"; import { onPageLoad, tryLoadLayoutFromLocalStorage, saveLayoutToLocalStorage, -} from './common'; +} from "./common"; function onWorkspaceMounted(workspace: Workspace) { if (!workspace) { @@ -26,16 +26,17 @@ function onWorkspaceMounted(workspace: Workspace) { validateLinks: true, dataProvider: new SparqlDataProvider( { - endpointUrl: 'https://dbpedia.org/sparql', + endpointUrl: "https://dbpedia.org/sparql", imagePropertyUris: [ - 'http://xmlns.com/foaf/0.1/depiction', - 'http://xmlns.com/foaf/0.1/img', + "http://xmlns.com/foaf/0.1/depiction", + "http://xmlns.com/foaf/0.1/img", ], queryMethod: SparqlQueryMethod.GET, }, - {...DBPediaSettings, - ...{ - classTreeQuery: ` + { + ...DBPediaSettings, + ...{ + classTreeQuery: ` PREFIX rdfs: PREFIX rdf: PREFIX owl: @@ -44,8 +45,8 @@ function onWorkspaceMounted(workspace: Workspace) { ?class a owl:Class. ?class rdfs:label ?label. OPTIONAL {?class rdfs:subClassOf ?parent} - }` - } + }`, + }, } ), }); diff --git a/examples/demo.ts b/examples/demo.ts index 96d6b728..f721c943 100644 --- a/examples/demo.ts +++ b/examples/demo.ts @@ -1,22 +1,24 @@ -import { createElement, ClassAttributes } from 'react'; -import * as ReactDOM from 'react-dom'; +/* eslint-disable @typescript-eslint/no-require-imports */ + +import { createElement, ClassAttributes } from "react"; +import * as ReactDOM from "react-dom"; import { Workspace, WorkspaceProps, DemoDataProvider, -} from '../src/graph-explorer/index'; +} from "../src/graph-explorer/index"; import { onPageLoad, tryLoadLayoutFromLocalStorage, saveLayoutToLocalStorage, -} from './common'; +} from "./common"; -const CLASSES = require('./resources/classes.json'); -const LINK_TYPES = require('./resources/linkTypes.json'); -const ELEMENTS = require('./resources/elements.json'); -const LINKS = require('./resources/links.json'); +const CLASSES = require("./resources/classes.json"); +const LINK_TYPES = require("./resources/linkTypes.json"); +const ELEMENTS = require("./resources/elements.json"); +const LINKS = require("./resources/links.json"); function onWorkspaceMounted(workspace: Workspace) { if (!workspace) { diff --git a/examples/edit.ts b/examples/edit.ts index ed89363c..dfc6b1ab 100644 --- a/examples/edit.ts +++ b/examples/edit.ts @@ -1,10 +1,11 @@ -import { createElement, ClassAttributes } from 'react'; -import * as ReactDOM from 'react-dom'; -const SparqlGenerator = require('sparqljs').Generator; -const SparqlClient = require('sparql-http-client'); +import { createElement, ClassAttributes } from "react"; +import * as ReactDOM from "react-dom"; +import * as SparqlJS from "sparqljs"; +const SparqlGenerator = SparqlJS.Generator; +import SparqlClient from "sparql-http-client"; -const RDFS_PREFIX = 'http://www.w3.org/2000/01/rdf-schema#'; -const RDF_PREFIX = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; +const RDFS_PREFIX = "http://www.w3.org/2000/01/rdf-schema#"; +const RDF_PREFIX = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; import { Workspace, @@ -18,235 +19,253 @@ import { SparqlQueryMethod, OWLRDFSSettings, AuthoringState, -} from '../src/graph-explorer/index'; +} from "../src/graph-explorer/index"; -import { - ExampleMetadataApi, -} from './resources/exampleMetadataApi'; +import { ExampleMetadataApi } from "./resources/exampleMetadataApi"; import { onPageLoad, tryLoadLayoutFromLocalStorage, saveLayoutToLocalStorage, -} from './common'; +} from "./common"; const rdfs = { - subClassOf: (RDFS_PREFIX + 'subClassOf') as LinkTypeIri, - label: (RDFS_PREFIX + 'label') as LinkTypeIri, - subPropertyOf: (RDFS_PREFIX + 'subPropertyOf') as LinkTypeIri, + subClassOf: (RDFS_PREFIX + "subClassOf") as LinkTypeIri, + label: (RDFS_PREFIX + "label") as LinkTypeIri, + subPropertyOf: (RDFS_PREFIX + "subPropertyOf") as LinkTypeIri, }; const rdf = { - class: (RDF_PREFIX + 'Class') as ElementTypeIri, - a: (RDF_PREFIX + 'type') as LinkTypeIri + class: (RDF_PREFIX + "Class") as ElementTypeIri, + a: (RDF_PREFIX + "type") as LinkTypeIri, }; function onWorkspaceMounted(workspace: Workspace) { if (!workspace) { return; } - + const SparqlDialect = OWLRDFSSettings; - SparqlDialect.fullTextSearch = { - prefix: '', - queryPattern: ` + SparqlDialect.fullTextSearch = { + prefix: "", + queryPattern: ` ?inst rdfs:label ?searchLabel. (?searchLabel ?score) "\${text}". - `}; - SparqlDialect.filterTypePattern = '?inst a ?class'; - - const sparqlDataProvider = new SparqlDataProvider({ - endpointUrl: "/sparql", - queryMethod: SparqlQueryMethod.GET - }, SparqlDialect); - - const diagram = tryLoadLayoutFromLocalStorage(); - workspace.getModel().importLayout({ - diagram, - validateLinks: true, - dataProvider : sparqlDataProvider, - }); + `, + }; + SparqlDialect.filterTypePattern = "?inst a ?class"; + + const sparqlDataProvider = new SparqlDataProvider( + { + endpointUrl: "/sparql", + queryMethod: SparqlQueryMethod.GET, + }, + SparqlDialect + ); + + const diagram = tryLoadLayoutFromLocalStorage(); + workspace.getModel().importLayout({ + diagram, + validateLinks: true, + dataProvider: sparqlDataProvider, + }); } const props: WorkspaceProps & ClassAttributes = { - ref: onWorkspaceMounted, - onSaveDiagram: (workspace) => { - const diagram = workspace.getModel().exportLayout(); - window.location.hash = saveLayoutToLocalStorage(diagram); - window.location.reload(); - }, - onPersistChanges: generateSparqlUpdate, - metadataApi: new ExampleMetadataApi(), - - elementTemplateResolver: (types) => { - return undefined; - }, + ref: onWorkspaceMounted, + onSaveDiagram: (workspace) => { + const diagram = workspace.getModel().exportLayout(); + window.location.hash = saveLayoutToLocalStorage(diagram); + window.location.reload(); + }, + onPersistChanges: generateSparqlUpdate, + metadataApi: new ExampleMetadataApi(), + + elementTemplateResolver: (_types) => { + return undefined; + }, }; onPageLoad((container) => { - ReactDOM.render(createElement(Workspace, props), container); + ReactDOM.render(createElement(Workspace, props), container); }); function generateSparqlUpdate(workspace: Workspace) { - const state = workspace.getEditor().authoringState; - const model = workspace.getModel(); - const elementUpdateStructure = { - "type": "update", - "updates": [] as any - }; - const deletedElements: string[] = []; - const deletedLinks: string[] = []; - state.elements.forEach(element => { - - if(element.deleted) { - deletedElements.push(element.after.id); - elementUpdateStructure.updates.push({ updateType: "delete", - delete: [{type:'bgp',triples: triplesFromElementState(element.after)}] - }); - } else if(!element.before){ - // simple insert data - elementUpdateStructure.updates.push({ updateType: "insert", - insert: [{type:'bgp',triples: triplesFromElementState(element.after)}] - }); - } - else { - elementUpdateStructure.updates.push({ updateType: "insertdelete", - delete: [{type:'bgp',triples: triplesFromElementState(element.before)}], - where: [{type:'bgp',triples: triplesFromElementState(element.before)}], - insert: [{type:'bgp',triples: triplesFromElementState(element.after)}] - }); - } + const state = workspace.getEditor().authoringState; + const model = workspace.getModel(); + const elementUpdateStructure = { + type: "update" as const, + updates: [] as any, + prefixes: {}, + }; + const deletedElements: string[] = []; + const deletedLinks: string[] = []; + state.elements.forEach((element) => { + if (element.deleted) { + deletedElements.push(element.after.id); + elementUpdateStructure.updates.push({ + updateType: "delete", + delete: [ + { type: "bgp", triples: triplesFromElementState(element.after) }, + ], + }); + } else if (!element.before) { + // simple insert data + elementUpdateStructure.updates.push({ + updateType: "insert", + insert: [ + { type: "bgp", triples: triplesFromElementState(element.after) }, + ], + }); + } else { + elementUpdateStructure.updates.push({ + updateType: "insertdelete", + delete: [ + { type: "bgp", triples: triplesFromElementState(element.before) }, + ], + where: [ + { type: "bgp", triples: triplesFromElementState(element.before) }, + ], + insert: [ + { type: "bgp", triples: triplesFromElementState(element.after) }, + ], + }); + } + }); + state.links.forEach((link) => { + if (link.deleted) { + deletedLinks.push( + model.findLink( + link.after.linkTypeId, + model.elements.find((element) => element.iri == link.after.sourceId) + .id, + model.elements.find((element) => element.iri == link.after.targetId) + .id + ).id + ); + elementUpdateStructure.updates.push({ + updateType: "delete", + delete: [{ type: "bgp", triples: triplesFromLinkState(link.after) }], + }); + } else { + elementUpdateStructure.updates.push({ + updateType: "insert", + insert: [{ type: "bgp", triples: triplesFromLinkState(link.after) }], + }); + } + }); + const parser = new SparqlGenerator({ newline: "" }); + if (elementUpdateStructure.updates.length > 0) { + const updateQuery = parser.stringify(elementUpdateStructure); + const client = new SparqlClient({ + endpointUrl: window.location.origin + "/query", + updateUrl: window.location.origin + "/update", }); - state.links.forEach(link => { - if (link.deleted) { - deletedLinks.push(model.findLink( - link.after.linkTypeId, - model.elements.find(element => element.iri == link.after.sourceId).id, - model.elements.find(element => element.iri == link.after.targetId).id - ).id); - elementUpdateStructure.updates.push({ updateType: "delete", - delete: [{type:'bgp',triples: triplesFromLinkState(link.after)}] - }); - } else { - elementUpdateStructure.updates.push({ updateType: "insert", - insert: [{type:'bgp',triples: triplesFromLinkState(link.after)}] - }); - } + client.query.update(updateQuery); + + workspace.getEditor().setAuthoringState(AuthoringState.empty); + + deletedElements.forEach((iri) => { + console.log(model.elements.find((element) => element.iri == iri).id); + model.removeElement( + model.elements.find((element) => element.iri == iri).id + ); }); - const parser = new SparqlGenerator({newline:''}); - if(elementUpdateStructure.updates.length >0 ) - { - const updateQuery = parser.stringify(elementUpdateStructure); - const client = new SparqlClient({ - endpointUrl: window.location.origin + '/query', - updateUrl: window.location.origin + '/update', - }); - client.query.update(updateQuery); - - - workspace.getEditor().setAuthoringState(AuthoringState.empty); - - deletedElements.forEach( iri => { - console.log(model.elements.find(element => element.iri == iri).id); - model.removeElement(model.elements.find(element => element.iri == iri).id); - }); - - deletedLinks.forEach(id => { - model.removeLink(id); - }); - } + deletedLinks.forEach((id) => { + model.removeLink(id); + }); + } } /** - * + * * @param elementState the state of an element, either before or after * @returns a arrary of triples in BGP format for SparqlJS */ -function triplesFromElementState(elementState: ElementModel){ - const triples = [] as any; - - // grab types - elementState.types.forEach(type => { - triples.push({ - "subject": { - "termType": "NamedNode", - "value": elementState.id - }, - "predicate": { - "termType": "NamedNode", - "value": rdf.a - }, - "object": { - "termType": "NamedNode", - "value": type - } - }); - }); +function triplesFromElementState(elementState: ElementModel) { + const triples = [] as any; + // grab types + elementState.types.forEach((type) => { + triples.push({ + subject: { + termType: "NamedNode", + value: elementState.id, + }, + predicate: { + termType: "NamedNode", + value: rdf.a, + }, + object: { + termType: "NamedNode", + value: type, + }, + }); + }); - // grab label - elementState.label.values.forEach(label => { - triples.push({ - "subject": { - "termType": "NamedNode", - "value": elementState.id - }, - "predicate": { - "termType": "NamedNode", - "value": rdfs.label - }, - "object": { - "termType": "Literal", - "value": label.value, - "language": label.language - } - }); + // grab label + elementState.label.values.forEach((label) => { + triples.push({ + subject: { + termType: "NamedNode", + value: elementState.id, + }, + predicate: { + termType: "NamedNode", + value: rdfs.label, + }, + object: { + termType: "Literal", + value: label.value, + language: label.language, + }, }); + }); - // grab all properties - for(const [key,property ] of Object.entries(elementState.properties)){ - property.values.forEach( (value) => { - const v = value as LocalizedString; - triples.push({ - "subject": { - "termType": "NamedNode", - "value": elementState.id - }, - "predicate": { - "termType": "NamedNode", - "value": key - }, - "object": { - "termType": "Literal", - "value": v.value, - "language": v.language - } - }); - }); - } - return triples; + // grab all properties + for (const [key, property] of Object.entries(elementState.properties)) { + property.values.forEach((value) => { + const v = value as LocalizedString; + triples.push({ + subject: { + termType: "NamedNode", + value: elementState.id, + }, + predicate: { + termType: "NamedNode", + value: key, + }, + object: { + termType: "Literal", + value: v.value, + language: v.language, + }, + }); + }); + } + return triples; } /** - * + * * @param linkState the state of a link, either before or after * @returns a array of triples in BGP format for SparqlJS - */ -function triplesFromLinkState(linkState: LinkModel){ - const triples = []; - triples.push({ - "subject": { - "termType": "NamedNode", - "value": linkState.sourceId - }, - "predicate": { - "termType": "NamedNode", - "value": linkState.linkTypeId - }, - "object": { - "termType": "NamedNode", - "value": linkState.targetId - } - }); - return triples; + */ +function triplesFromLinkState(linkState: LinkModel) { + const triples = []; + triples.push({ + subject: { + termType: "NamedNode", + value: linkState.sourceId, + }, + predicate: { + termType: "NamedNode", + value: linkState.linkTypeId, + }, + object: { + termType: "NamedNode", + value: linkState.targetId, + }, + }); + return triples; } diff --git a/examples/envendpoint.ts b/examples/envendpoint.ts index 5c2ca927..aa7afe51 100644 --- a/examples/envendpoint.ts +++ b/examples/envendpoint.ts @@ -1,5 +1,5 @@ -import { createElement, ClassAttributes } from 'react'; -import * as ReactDOM from 'react-dom'; +import { createElement, ClassAttributes } from "react"; +import * as ReactDOM from "react-dom"; import { Workspace, @@ -7,13 +7,13 @@ import { SparqlDataProvider, SparqlQueryMethod, OWLRDFSSettings, -} from '../src/graph-explorer/index'; +} from "../src/graph-explorer/index"; import { onPageLoad, tryLoadLayoutFromLocalStorage, saveLayoutToLocalStorage, -} from './common'; +} from "./common"; function onWorkspaceMounted(workspace: Workspace) { if (!workspace) { @@ -26,25 +26,25 @@ function onWorkspaceMounted(workspace: Workspace) { validateLinks: true, dataProvider: new SparqlDataProvider( { - // this goes to process.env.SPARQL_ENDPOINT via devServer proxy rule in webpack.demo.config.js - endpointUrl: '../sparql', - + endpointUrl: "../sparql", + imagePropertyUris: [ - 'http://xmlns.com/foaf/0.1/depiction', - 'http://xmlns.com/foaf/0.1/img', + "http://xmlns.com/foaf/0.1/depiction", + "http://xmlns.com/foaf/0.1/img", ], queryMethod: SparqlQueryMethod.GET, }, - {...OWLRDFSSettings, - ...{ - classTreeQuery: ` + { + ...OWLRDFSSettings, + ...{ + classTreeQuery: ` SELECT distinct ?class ?label ?parent WHERE { ?class a owl:Class. OPTIONAL {?class rdfs:label ?label.} OPTIONAL {?class rdfs:subClassOf ?parent} - }` - } + }`, + }, } ), }); diff --git a/examples/resources/elements.json b/examples/resources/elements.json index 8cea291b..ae10a5e8 100644 --- a/examples/resources/elements.json +++ b/examples/resources/elements.json @@ -1,2641 +1,2641 @@ { - "http://ailab.ifmo.ru/dialog/tv/schema": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema", - "types": [ - "http://www.w3.org/2002/07/owl#Ontology" - ], - "label": { - "values": [ - { - "value": "schema", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2002/07/owl#versionInfo": { - "type": "string", - "values": [ - { - "value": "Created with TopBraid Composer", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#ortChannel": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#ortChannel", - "types": [ - "http://ailab.ifmo.ru/dialog/tv/schema#TVChannel" - ], - "label": { - "values": [ - { - "value": "ortChannel", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "орт", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Battery": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Battery", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Battery", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "батарейка", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#rostelekom": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#rostelekom", - "types": [ - "http://ailab.ifmo.ru/dialog/tv/schema#ServiceProvider" - ], - "label": { - "values": [ - { - "value": "rostelekom", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "ростелеком", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#problemStated": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#problemStated", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "problemStated", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#hdPremiumChannelPack": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#hdPremiumChannelPack", - "types": [ - "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack" - ], - "label": { - "values": [ - { - "value": "hdPremiumChannelPack", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "эйчди-премиум", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#subscriberName": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#subscriberName", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "subscriberName", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Имя человека, на которого оформлен договор.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "оформлять", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#encryptedSignal": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#encryptedSignal", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "encryptedSignal", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "На экаране показывается, что сигнал зашифрован ил нет доступа", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToAccounts": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToAccounts", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "forwardedToAccounts", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#TVService": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#TVService", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "TVService", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Услуга телевидения. Пока нахождение на этом уровне определяется только необходимостью преобразования в онто-факты.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "телевидение", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Address": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Address", - "types": [ - "http://www.w3.org/2000/01/rdf-schema#Datatype" - ], - "label": { - "values": [ - { - "value": "Address", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#TurnOff": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#TurnOff", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "TurnOff", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "выключать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#TVChannel": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#TVChannel", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "TVChannel", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Телевизионный канал.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "канал", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#ServiceDevice": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#ServiceDevice", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "ServiceDevice", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Устройство у пользователя, отвечающее за предоставление услуг", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Connect": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Connect", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Соединение", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "втыкать", - "language": "" - }, - { - "value": "вставлять", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy", - "types": [ - "http://www.w3.org/1999/02/22-rdf-syntax-ns#Property" - ], - "label": { - "values": [ - { - "value": "falseExpressedBy", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#changedSpeed": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#changedSpeed", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "changedSpeed", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "уменьшать", - "language": "" - }, - { - "value": "увеличивать", - "language": "" - }, - { - "value": "снижать", - "language": "" - }, - { - "value": "поднимать", - "language": "" - }, - { - "value": "изменять", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#kinoChannelPack": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#kinoChannelPack", - "types": [ - "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack" - ], - "label": { - "values": [ - { - "value": "kinoChannelPack", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "кино", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Subscription": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Subscription", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Subscription", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#switchedOn": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#switchedOn", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "switchedOn", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Включено ли устройство.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { - "type": "string", - "values": [ - { - "value": "tv:TurnOff", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#trueExpressedBy": { - "type": "string", - "values": [ - { - "value": "tv:TurnOn", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Contact": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Contact", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Contact", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#canHelp": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#canHelp", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "canHelp", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Система спрашивает 'Я могу еще чем-либо помочь?'", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#trueExpressedBy": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#trueExpressedBy", - "types": [ - "http://www.w3.org/1999/02/22-rdf-syntax-ns#Property" - ], - "label": { - "values": [ - { - "value": "trueExpressedBy", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#inserted": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#inserted", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "inserted", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Вставлен ли Cam-модуль в ТВ или приставку", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { - "type": "string", - "values": [ - { - "value": "tv:Disconnect", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#trueExpressedBy": { - "type": "string", - "values": [ - { - "value": "tv:Connect", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#operational": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#operational", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "operational", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Работает в смысле 'Не сломано и может выполняет основные фунции'", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { - "type": "string", - "values": [ - { - "value": "tv:Disappear", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "работать", - "language": "" - }, - { - "value": "показывать", - "language": "" - }, - { - "value": "включаться", - "language": "" - }, - { - "value": "включать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Name": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Name", - "types": [ - "http://www.w3.org/2000/01/rdf-schema#Datatype" - ], - "label": { - "values": [ - { - "value": "Name", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Router": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Router", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Router", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Роутер - устройство маршрутизации между сетями, компонент услуги предоставление доступа в интернет или интерактивного телевидения.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "роутер", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Disconnect": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Disconnect", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Disconnect", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "извлекать", - "language": "" - }, - { - "value": "вытаскивать", - "language": "" - }, - { - "value": "вынимать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Unsubscribe": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Unsubscribe", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Unsubscribe", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "отписываться", - "language": "" - }, - { - "value": "отключать", - "language": "" - }, - { - "value": "отказываться", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#CamModule": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#CamModule", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "CamModule", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Cam-модуль, отвечает за декодирование платных каналов DVB. Может вставляться в телевизор или в теле-приставку.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "к-модуль", - "language": "" - }, - { - "value": "cam-модуль", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Subscribe": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Subscribe", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Subscribe", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "устанавливать", - "language": "" - }, - { - "value": "подключать", - "language": "" - }, - { - "value": "переходить", - "language": "" - }, - { - "value": "настраивать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Internet": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Internet", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Internet", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "интернет", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#sufficientFunds": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#sufficientFunds", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "sufficientFunds", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#ServiceProvider": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#ServiceProvider", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "ServiceProvider", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Поставщик услуг.", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#suspended": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#suspended", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "suspended", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Приостановлено ли предоставление услуги из-за отсутствия оплаты или еще каких причин.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "отключать", - "language": "" - }, - { - "value": "заблокировать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#SimpleProperty": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#SimpleProperty", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "SimpleProperty", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#RTService": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#RTService", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "RTService", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Услуга ростелекома как элемент оплаты, биллинга, части договора.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "услуга", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#serviceNumber": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#serviceNumber", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "serviceNumber", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Номер услуги клиента. Используется для идентификации клиента.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "номер", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Disappear": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Disappear", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Disappear", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "отключаться", - "language": "" - }, - { - "value": "пропадать", - "language": "" - }, - { - "value": "исчезать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Operation": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Operation", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Operation", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#WiFiRouter": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#WiFiRouter", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "WiFiRouter", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "WiFi", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Service": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Service", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Service", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Сервис, класс всех сущностей, ответственных за предоставление услуг клиентам.", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#DigitalTVChannel": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#DigitalTVChannel", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "DigitalTVChannel", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Цифровой телевизионный канал.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "цифровой", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#rent": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#rent", - "types": [ - "http://www.w3.org/2002/07/owl#ObjectProperty" - ], - "label": { - "values": [ - { - "value": "rent", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Арендовать указанное имущество", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "арендовать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#ServiceDesk": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#ServiceDesk", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "ServiceDesk", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Служба поддержки.", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#filedRequest": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#filedRequest", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "filedRequest", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Пользователь оставил заявку", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#isClientOf": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#isClientOf", - "types": [ - "http://www.w3.org/2002/07/owl#ObjectProperty" - ], - "label": { - "values": [ - { - "value": "isClientOf", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Являться клиентом указанного оператора", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "клиент", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#came": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#came", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "came", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Был ли мастер у клиента.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "приходить", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Observe": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Observe", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Observe", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#PropertyAsGoods": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#PropertyAsGoods", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "PropertyAsGoods", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Собственность пользователя в виде материальных или нематериальных объектов.", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#expressedBy": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#expressedBy", - "types": [ - "http://www.w3.org/1999/02/22-rdf-syntax-ns#Property" - ], - "label": { - "values": [ - { - "value": "expressedBy", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#modified": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#modified", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "modified", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Перенастроено ли устройство, были ли изменены настройки.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "настраивать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "ChannelPack", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "тариф", - "language": "" - }, - { - "value": "план", - "language": "" - }, - { - "value": "пакет", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#deviceModel": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#deviceModel", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "deviceModel", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Название модели устройства.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "модель", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#popularChannelPack": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#popularChannelPack", - "types": [ - "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack" - ], - "label": { - "values": [ - { - "value": "popularChannelPack", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "популярный", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#canHangUp": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#canHangUp", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "canHangUp", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Можно ли клиенту повесить трубку и продложить решать проблему автономно.", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#canSolve": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#canSolve", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "canSolve", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Может ли служба поддержки решить проблему пользователя. Нет - в случае неработающего телевизора, например.", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#userCanSwitchChannel": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#userCanSwitchChannel", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "userCanSwitchChannel", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "переключаться", - "language": "" - }, - { - "value": "переключать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#rebooted": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#rebooted", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "rebooted", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Перезагружено ли устройство", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "перезагружать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#own": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#own", - "types": [ - "http://www.w3.org/2002/07/owl#ObjectProperty" - ], - "label": { - "values": [ - { - "value": "own", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Владеть указанным имуществом", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "есть", - "language": "" - }, - { - "value": "иметь", - "language": "" - }, - { - "value": "владеть", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#DigitalTVService": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#DigitalTVService", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "DigitalTVService", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Услуга цифрового телевидения.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "цифровой", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#PhoneNumber": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#PhoneNumber", - "types": [ - "http://www.w3.org/2000/01/rdf-schema#Datatype" - ], - "label": { - "values": [ - { - "value": "PhoneNumber", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#User": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#User", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "User", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Пользователь. Пока и клиент Ростелекома и позвонивший человек в одном лице.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "мы", - "language": "" - }, - { - "value": "я", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#subscribed": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#subscribed", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "subscribed", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Подписан ли пользователь на эту услугу.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { - "type": "string", - "values": [ - { - "value": "tv:Unsubscribe", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#trueExpressedBy": { - "type": "string", - "values": [ - { - "value": "tv:Subscribe", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#baseChannelPack": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#baseChannelPack", - "types": [ - "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack" - ], - "label": { - "values": [ - { - "value": "baseChannelPack", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "стартовый", - "language": "" - }, - { - "value": "начальный", - "language": "" - }, - { - "value": "базовый", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#TVSet": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#TVSet", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "TVSet", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Телевизор. Может иметь возможность декодирования платных каналов услуги цифрового телевидения с использованием CAM-модуля.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "телевизор", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToInfoSupport": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToInfoSupport", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "forwardedToInfoSupport", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#lemma", - "types": [ - "http://www.w3.org/2002/07/owl#AnnotationProperty" - ], - "label": { - "values": [ - { - "value": "lemma", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#identified": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#identified", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "identified", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToSecondSupport": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToSecondSupport", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "forwardedToSecondSupport", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#callsAgain": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#callsAgain", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "callsAgain", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Пользователь обращается повторно", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#ControlPanel": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#ControlPanel", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "ControlPanel", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Пульт от телевизора", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "пульт", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#hasNetworkConnection": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#hasNetworkConnection", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "hasNetworkConnection", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Есть ли подключение к роутеру со стороны провайдера услуг.", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Image": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Image", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Image", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "сигнал", - "language": "" - }, - { - "value": "картинка", - "language": "" - }, - { - "value": "изображение", - "language": "" - }, - { - "value": "видео", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#phoneNumber": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#phoneNumber", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "phoneNumber", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Номер телефона", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "номер", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#deviceAppearance": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#deviceAppearance", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "deviceAppearance", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Описание внешнего вида устройства.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "внешний вид", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#TurnOn": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#TurnOn", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "TurnOn", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "включать", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#tvoeTV": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#tvoeTV", - "types": [ - "http://ailab.ifmo.ru/dialog/tv/schema#ServiceProvider" - ], - "label": { - "values": [ - { - "value": "tvoeTV", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "твой интернет", - "language": "" - }, - { - "value": "твое тв", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#HomePhone": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#HomePhone", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "HomePhone", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Домашний телефон. Один из способов идентифицировать клиента. Другой - по номеру услуги.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "домашний", - "language": "" - }, - { - "value": "городской", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#All": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#All", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "All", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Концепт для обработки 'а потом все отвалилось'", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "всё", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Home": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Home", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Home", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Дом клиента в смысле места, где установлено такое оборудование, как роутер.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "дом", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Appear": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Appear", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Appear", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "появляться", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Cable": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Cable", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Cable", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Кабель - нужен для подключения кабельного телевидения.", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#homeAddress": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#homeAddress", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "homeAddress", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Домашний адрес", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "адрес", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Flat": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Flat", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Flat", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Квартира (уточнение дома).", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "квартира", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#operationalBad": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#operationalBad", - "types": [ - "http://www.w3.org/2002/07/owl#DatatypeProperty" - ], - "label": { - "values": [ - { - "value": "operationalBad", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { - "type": "string", - "values": [ - { - "value": "tv:Disappear", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "тормозить", - "language": "" - }, - { - "value": "расползаться", - "language": "" - }, - { - "value": "портиться", - "language": "" - }, - { - "value": "барахлить", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#AnalogueTVChannel": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#AnalogueTVChannel", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "AnalogueTVChannel", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Аналоговый телевизионный канал.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "аналоговый", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#ServiceMan": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#ServiceMan", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "ServiceMan", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Квалифицированный работник", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "мастер", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Phone": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Phone", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Phone", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Телефон. Здесь пока только для образование сущности 'домашний телефон'", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "телефон", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#Speed": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#Speed", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "Speed", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "скорость", - "language": "" - }, - { - "value": "производительность", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#SubscribableService": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#SubscribableService", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "SubscribableService", - "language": "" - } - ] - }, - "properties": {} - }, - "http://ailab.ifmo.ru/dialog/tv/schema#hdChannelPack": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#hdChannelPack", - "types": [ - "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack" - ], - "label": { - "values": [ - { - "value": "hdChannelPack", - "language": "" - } - ] - }, - "properties": { - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "эйчди", - "language": "" - } - ] - } - } - }, - "http://ailab.ifmo.ru/dialog/tv/schema#SetTopBox": { - "id": "http://ailab.ifmo.ru/dialog/tv/schema#SetTopBox", - "types": [ - "http://www.w3.org/2002/07/owl#Class" - ], - "label": { - "values": [ - { - "value": "SetTopBox", - "language": "" - } - ] - }, - "properties": { - "http://www.w3.org/2000/01/rdf-schema#comment": { - "type": "string", - "values": [ - { - "value": "Телеприставка, осуществляющая декодирование цифрового сигнала и подключаемая к телевизору.", - "language": "" - } - ] - }, - "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { - "type": "string", - "values": [ - { - "value": "приставка", - "language": "" - } - ] - } - } + "http://ailab.ifmo.ru/dialog/tv/schema": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema", + "types": [ + "http://www.w3.org/2002/07/owl#Ontology" + ], + "label": { + "values": [ + { + "value": "schema", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2002/07/owl#versionInfo": { + "type": "string", + "values": [ + { + "value": "Created with TopBraid Composer", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#ortChannel": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#ortChannel", + "types": [ + "http://ailab.ifmo.ru/dialog/tv/schema#TVChannel" + ], + "label": { + "values": [ + { + "value": "ortChannel", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "орт", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Battery": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Battery", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Battery", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "батарейка", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#rostelekom": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#rostelekom", + "types": [ + "http://ailab.ifmo.ru/dialog/tv/schema#ServiceProvider" + ], + "label": { + "values": [ + { + "value": "rostelekom", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "ростелеком", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#problemStated": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#problemStated", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "problemStated", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#hdPremiumChannelPack": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#hdPremiumChannelPack", + "types": [ + "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack" + ], + "label": { + "values": [ + { + "value": "hdPremiumChannelPack", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "эйчди-премиум", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#subscriberName": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#subscriberName", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "subscriberName", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Имя человека, на которого оформлен договор.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "оформлять", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#encryptedSignal": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#encryptedSignal", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "encryptedSignal", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "На экаране показывается, что сигнал зашифрован ил нет доступа", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToAccounts": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToAccounts", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "forwardedToAccounts", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#TVService": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#TVService", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "TVService", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Услуга телевидения. Пока нахождение на этом уровне определяется только необходимостью преобразования в онто-факты.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "телевидение", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Address": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Address", + "types": [ + "http://www.w3.org/2000/01/rdf-schema#Datatype" + ], + "label": { + "values": [ + { + "value": "Address", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#TurnOff": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#TurnOff", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "TurnOff", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "выключать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#TVChannel": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#TVChannel", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "TVChannel", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Телевизионный канал.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "канал", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#ServiceDevice": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#ServiceDevice", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "ServiceDevice", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Устройство у пользователя, отвечающее за предоставление услуг", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Connect": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Connect", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Соединение", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "втыкать", + "language": "" + }, + { + "value": "вставлять", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy", + "types": [ + "http://www.w3.org/1999/02/22-rdf-syntax-ns#Property" + ], + "label": { + "values": [ + { + "value": "falseExpressedBy", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#changedSpeed": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#changedSpeed", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "changedSpeed", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "уменьшать", + "language": "" + }, + { + "value": "увеличивать", + "language": "" + }, + { + "value": "снижать", + "language": "" + }, + { + "value": "поднимать", + "language": "" + }, + { + "value": "изменять", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#kinoChannelPack": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#kinoChannelPack", + "types": [ + "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack" + ], + "label": { + "values": [ + { + "value": "kinoChannelPack", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "кино", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Subscription": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Subscription", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Subscription", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#switchedOn": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#switchedOn", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "switchedOn", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Включено ли устройство.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { + "type": "string", + "values": [ + { + "value": "tv:TurnOff", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#trueExpressedBy": { + "type": "string", + "values": [ + { + "value": "tv:TurnOn", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Contact": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Contact", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Contact", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#canHelp": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#canHelp", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "canHelp", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Система спрашивает 'Я могу еще чем-либо помочь?'", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#trueExpressedBy": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#trueExpressedBy", + "types": [ + "http://www.w3.org/1999/02/22-rdf-syntax-ns#Property" + ], + "label": { + "values": [ + { + "value": "trueExpressedBy", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#inserted": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#inserted", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "inserted", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Вставлен ли Cam-модуль в ТВ или приставку", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { + "type": "string", + "values": [ + { + "value": "tv:Disconnect", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#trueExpressedBy": { + "type": "string", + "values": [ + { + "value": "tv:Connect", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#operational": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#operational", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "operational", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Работает в смысле 'Не сломано и может выполняет основные фунции'", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { + "type": "string", + "values": [ + { + "value": "tv:Disappear", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "работать", + "language": "" + }, + { + "value": "показывать", + "language": "" + }, + { + "value": "включаться", + "language": "" + }, + { + "value": "включать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Name": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Name", + "types": [ + "http://www.w3.org/2000/01/rdf-schema#Datatype" + ], + "label": { + "values": [ + { + "value": "Name", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Router": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Router", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Router", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Роутер - устройство маршрутизации между сетями, компонент услуги предоставление доступа в интернет или интерактивного телевидения.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "роутер", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Disconnect": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Disconnect", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Disconnect", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "извлекать", + "language": "" + }, + { + "value": "вытаскивать", + "language": "" + }, + { + "value": "вынимать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Unsubscribe": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Unsubscribe", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Unsubscribe", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "отписываться", + "language": "" + }, + { + "value": "отключать", + "language": "" + }, + { + "value": "отказываться", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#CamModule": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#CamModule", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "CamModule", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Cam-модуль, отвечает за декодирование платных каналов DVB. Может вставляться в телевизор или в теле-приставку.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "к-модуль", + "language": "" + }, + { + "value": "cam-модуль", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Subscribe": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Subscribe", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Subscribe", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "устанавливать", + "language": "" + }, + { + "value": "подключать", + "language": "" + }, + { + "value": "переходить", + "language": "" + }, + { + "value": "настраивать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Internet": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Internet", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Internet", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "интернет", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#sufficientFunds": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#sufficientFunds", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "sufficientFunds", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#ServiceProvider": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#ServiceProvider", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "ServiceProvider", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Поставщик услуг.", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#suspended": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#suspended", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "suspended", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Приостановлено ли предоставление услуги из-за отсутствия оплаты или еще каких причин.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "отключать", + "language": "" + }, + { + "value": "заблокировать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#SimpleProperty": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#SimpleProperty", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "SimpleProperty", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#RTService": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#RTService", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "RTService", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Услуга ростелекома как элемент оплаты, биллинга, части договора.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "услуга", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#serviceNumber": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#serviceNumber", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "serviceNumber", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Номер услуги клиента. Используется для идентификации клиента.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "номер", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Disappear": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Disappear", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Disappear", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "отключаться", + "language": "" + }, + { + "value": "пропадать", + "language": "" + }, + { + "value": "исчезать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Operation": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Operation", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Operation", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#WiFiRouter": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#WiFiRouter", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "WiFiRouter", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "WiFi", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Service": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Service", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Service", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Сервис, класс всех сущностей, ответственных за предоставление услуг клиентам.", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#DigitalTVChannel": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#DigitalTVChannel", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "DigitalTVChannel", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Цифровой телевизионный канал.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "цифровой", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#rent": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#rent", + "types": [ + "http://www.w3.org/2002/07/owl#ObjectProperty" + ], + "label": { + "values": [ + { + "value": "rent", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Арендовать указанное имущество", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "арендовать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#ServiceDesk": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#ServiceDesk", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "ServiceDesk", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Служба поддержки.", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#filedRequest": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#filedRequest", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "filedRequest", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Пользователь оставил заявку", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#isClientOf": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#isClientOf", + "types": [ + "http://www.w3.org/2002/07/owl#ObjectProperty" + ], + "label": { + "values": [ + { + "value": "isClientOf", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Являться клиентом указанного оператора", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "клиент", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#came": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#came", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "came", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Был ли мастер у клиента.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "приходить", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Observe": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Observe", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Observe", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#PropertyAsGoods": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#PropertyAsGoods", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "PropertyAsGoods", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Собственность пользователя в виде материальных или нематериальных объектов.", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#expressedBy": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#expressedBy", + "types": [ + "http://www.w3.org/1999/02/22-rdf-syntax-ns#Property" + ], + "label": { + "values": [ + { + "value": "expressedBy", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#modified": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#modified", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "modified", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Перенастроено ли устройство, были ли изменены настройки.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "настраивать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "ChannelPack", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "тариф", + "language": "" + }, + { + "value": "план", + "language": "" + }, + { + "value": "пакет", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#deviceModel": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#deviceModel", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "deviceModel", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Название модели устройства.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "модель", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#popularChannelPack": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#popularChannelPack", + "types": [ + "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack" + ], + "label": { + "values": [ + { + "value": "popularChannelPack", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "популярный", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#canHangUp": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#canHangUp", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "canHangUp", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Можно ли клиенту повесить трубку и продложить решать проблему автономно.", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#canSolve": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#canSolve", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "canSolve", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Может ли служба поддержки решить проблему пользователя. Нет - в случае неработающего телевизора, например.", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#userCanSwitchChannel": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#userCanSwitchChannel", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "userCanSwitchChannel", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "переключаться", + "language": "" + }, + { + "value": "переключать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#rebooted": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#rebooted", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "rebooted", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Перезагружено ли устройство", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "перезагружать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#own": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#own", + "types": [ + "http://www.w3.org/2002/07/owl#ObjectProperty" + ], + "label": { + "values": [ + { + "value": "own", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Владеть указанным имуществом", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "есть", + "language": "" + }, + { + "value": "иметь", + "language": "" + }, + { + "value": "владеть", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#DigitalTVService": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#DigitalTVService", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "DigitalTVService", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Услуга цифрового телевидения.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "цифровой", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#PhoneNumber": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#PhoneNumber", + "types": [ + "http://www.w3.org/2000/01/rdf-schema#Datatype" + ], + "label": { + "values": [ + { + "value": "PhoneNumber", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#User": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#User", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "User", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Пользователь. Пока и клиент Ростелекома и позвонивший человек в одном лице.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "мы", + "language": "" + }, + { + "value": "я", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#subscribed": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#subscribed", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "subscribed", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Подписан ли пользователь на эту услугу.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { + "type": "string", + "values": [ + { + "value": "tv:Unsubscribe", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#trueExpressedBy": { + "type": "string", + "values": [ + { + "value": "tv:Subscribe", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#baseChannelPack": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#baseChannelPack", + "types": [ + "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack" + ], + "label": { + "values": [ + { + "value": "baseChannelPack", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "стартовый", + "language": "" + }, + { + "value": "начальный", + "language": "" + }, + { + "value": "базовый", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#TVSet": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#TVSet", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "TVSet", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Телевизор. Может иметь возможность декодирования платных каналов услуги цифрового телевидения с использованием CAM-модуля.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "телевизор", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToInfoSupport": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToInfoSupport", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "forwardedToInfoSupport", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#lemma", + "types": [ + "http://www.w3.org/2002/07/owl#AnnotationProperty" + ], + "label": { + "values": [ + { + "value": "lemma", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#identified": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#identified", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "identified", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToSecondSupport": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#forwardedToSecondSupport", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "forwardedToSecondSupport", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#callsAgain": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#callsAgain", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "callsAgain", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Пользователь обращается повторно", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#ControlPanel": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#ControlPanel", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "ControlPanel", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Пульт от телевизора", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "пульт", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#hasNetworkConnection": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#hasNetworkConnection", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "hasNetworkConnection", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Есть ли подключение к роутеру со стороны провайдера услуг.", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Image": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Image", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Image", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "сигнал", + "language": "" + }, + { + "value": "картинка", + "language": "" + }, + { + "value": "изображение", + "language": "" + }, + { + "value": "видео", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#phoneNumber": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#phoneNumber", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "phoneNumber", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Номер телефона", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "номер", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#deviceAppearance": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#deviceAppearance", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "deviceAppearance", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Описание внешнего вида устройства.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "внешний вид", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#TurnOn": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#TurnOn", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "TurnOn", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "включать", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#tvoeTV": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#tvoeTV", + "types": [ + "http://ailab.ifmo.ru/dialog/tv/schema#ServiceProvider" + ], + "label": { + "values": [ + { + "value": "tvoeTV", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "твой интернет", + "language": "" + }, + { + "value": "твое тв", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#HomePhone": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#HomePhone", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "HomePhone", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Домашний телефон. Один из способов идентифицировать клиента. Другой - по номеру услуги.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "домашний", + "language": "" + }, + { + "value": "городской", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#All": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#All", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "All", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Концепт для обработки 'а потом все отвалилось'", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "всё", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Home": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Home", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Home", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Дом клиента в смысле места, где установлено такое оборудование, как роутер.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "дом", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Appear": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Appear", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Appear", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "появляться", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Cable": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Cable", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Cable", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Кабель - нужен для подключения кабельного телевидения.", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#homeAddress": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#homeAddress", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "homeAddress", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Домашний адрес", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "адрес", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Flat": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Flat", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Flat", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Квартира (уточнение дома).", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "квартира", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#operationalBad": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#operationalBad", + "types": [ + "http://www.w3.org/2002/07/owl#DatatypeProperty" + ], + "label": { + "values": [ + { + "value": "operationalBad", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#falseExpressedBy": { + "type": "string", + "values": [ + { + "value": "tv:Disappear", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "тормозить", + "language": "" + }, + { + "value": "расползаться", + "language": "" + }, + { + "value": "портиться", + "language": "" + }, + { + "value": "барахлить", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#AnalogueTVChannel": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#AnalogueTVChannel", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "AnalogueTVChannel", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Аналоговый телевизионный канал.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "аналоговый", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#ServiceMan": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#ServiceMan", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "ServiceMan", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Квалифицированный работник", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "мастер", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Phone": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Phone", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Phone", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Телефон. Здесь пока только для образование сущности 'домашний телефон'", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "телефон", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#Speed": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#Speed", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "Speed", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "скорость", + "language": "" + }, + { + "value": "производительность", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#SubscribableService": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#SubscribableService", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "SubscribableService", + "language": "" + } + ] + }, + "properties": {} + }, + "http://ailab.ifmo.ru/dialog/tv/schema#hdChannelPack": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#hdChannelPack", + "types": [ + "http://ailab.ifmo.ru/dialog/tv/schema#ChannelPack" + ], + "label": { + "values": [ + { + "value": "hdChannelPack", + "language": "" + } + ] + }, + "properties": { + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "эйчди", + "language": "" + } + ] + } + } + }, + "http://ailab.ifmo.ru/dialog/tv/schema#SetTopBox": { + "id": "http://ailab.ifmo.ru/dialog/tv/schema#SetTopBox", + "types": [ + "http://www.w3.org/2002/07/owl#Class" + ], + "label": { + "values": [ + { + "value": "SetTopBox", + "language": "" + } + ] + }, + "properties": { + "http://www.w3.org/2000/01/rdf-schema#comment": { + "type": "string", + "values": [ + { + "value": "Телеприставка, осуществляющая декодирование цифрового сигнала и подключаемая к телевизору.", + "language": "" + } + ] + }, + "http://ailab.ifmo.ru/dialog/tv/schema#lemma": { + "type": "string", + "values": [ + { + "value": "приставка", + "language": "" + } + ] + } } + } } diff --git a/examples/resources/exampleMetadataApi.ts b/examples/resources/exampleMetadataApi.ts index 0b46a040..1027f962 100644 --- a/examples/resources/exampleMetadataApi.ts +++ b/examples/resources/exampleMetadataApi.ts @@ -11,25 +11,23 @@ import { ValidationEvent, ElementError, LinkError, - Property, LiteralProperty, - LocalizedString, DirectedLinkType, CancellationToken, -} from '../../src/graph-explorer/index'; +} from "../../src/graph-explorer/index"; -const OWL_PREFIX = 'http://www.w3.org/2002/07/owl#'; -const RDFS_PREFIX = 'http://www.w3.org/2000/01/rdf-schema#'; +const OWL_PREFIX = "http://www.w3.org/2002/07/owl#"; +const RDFS_PREFIX = "http://www.w3.org/2000/01/rdf-schema#"; const owl = { - class: (OWL_PREFIX + 'Class') as ElementTypeIri, - objectProperty: (OWL_PREFIX + 'ObjectProperty') as ElementTypeIri, - domain: (OWL_PREFIX + 'domain') as LinkTypeIri, - range: (OWL_PREFIX + 'range') as LinkTypeIri, + class: (OWL_PREFIX + "Class") as ElementTypeIri, + objectProperty: (OWL_PREFIX + "ObjectProperty") as ElementTypeIri, + domain: (OWL_PREFIX + "domain") as LinkTypeIri, + range: (OWL_PREFIX + "range") as LinkTypeIri, }; const rdfs = { - subClassOf: (RDFS_PREFIX + 'subClassOf') as LinkTypeIri, - subPropertyOf: (RDFS_PREFIX + 'subPropertyOf') as LinkTypeIri, + subClassOf: (RDFS_PREFIX + "subClassOf") as LinkTypeIri, + subPropertyOf: (RDFS_PREFIX + "subPropertyOf") as LinkTypeIri, }; function hasType(model: ElementModel, type: ElementTypeIri) { @@ -102,8 +100,8 @@ export class ExampleMetadataApi implements MetadataApi { } async propertiesForType( - type: ElementTypeIri, - ct: CancellationToken + _type: ElementTypeIri, + _ct: CancellationToken ): Promise { //await delay(SIMULATED_DELAY, ct); return []; @@ -119,7 +117,7 @@ export class ExampleMetadataApi implements MetadataApi { async filterConstructibleTypes( types: ReadonlySet, - ct: CancellationToken + _ct: CancellationToken ): Promise> { //await delay(SIMULATED_DELAY, ct); const result = new Set(); @@ -140,35 +138,35 @@ export class ExampleMetadataApi implements MetadataApi { } async canLinkElement( - element: ElementModel, - ct: CancellationToken + _element: ElementModel, + _ct: CancellationToken ): Promise { //await delay(SIMULATED_DELAY, ct); return true; } async canDeleteLink( - link: LinkModel, - source: ElementModel, - target: ElementModel, - ct: CancellationToken + _link: LinkModel, + _source: ElementModel, + _target: ElementModel, + _ct: CancellationToken ): Promise { //await delay(SIMULATED_DELAY, ct); return true; } async canEditLink( - link: LinkModel, - source: ElementModel, - target: ElementModel, - ct: CancellationToken + _link: LinkModel, + _source: ElementModel, + _target: ElementModel, + _ct: CancellationToken ): Promise { //await delay(SIMULATED_DELAY, ct); return true; } async generateNewElement( - types: ReadonlyArray, + types: readonly ElementTypeIri[], ct: CancellationToken ): Promise { await delay(SIMULATED_DELAY, ct); @@ -178,8 +176,13 @@ export class ExampleMetadataApi implements MetadataApi { return { id: `${types[0]}_${random32BitDigits}` as ElementIri, types: [...types], - label: { values: [{ value: 'New Entity', language: '' }] }, - properties: {"http://xmlns.com/foaf/0.1/name": {type: 'string', values: [{language:"",value:"helo"}]} as LiteralProperty}, + label: { values: [{ value: "New Entity", language: "" }] }, + properties: { + "http://xmlns.com/foaf/0.1/name": { + type: "string", + values: [{ language: "", value: "helo" }], + } as LiteralProperty, + }, }; } } @@ -187,19 +190,19 @@ export class ExampleMetadataApi implements MetadataApi { export class ExampleValidationApi implements ValidationApi { async validate( event: ValidationEvent - ): Promise> { - const errors: Array = []; + ): Promise<(ElementError | LinkError)[]> { + const errors: (ElementError | LinkError)[] = []; if (event.target.types.indexOf(owl.class) >= 0) { event.state.links.forEach((e) => { if (!e.before && e.after.sourceId === event.target.id) { errors.push({ - type: 'link', + type: "link", target: e.after, - message: 'Cannot add any new link from a Class', + message: "Cannot add any new link from a Class", }); const linkType = event.model.createLinkType(e.after.linkTypeId); errors.push({ - type: 'element', + type: "element", target: event.target.id, message: `Cannot create <${linkType.id}> link from a Class`, }); diff --git a/examples/toolbarCustomization.tsx b/examples/toolbarCustomization.tsx index 24f666ed..14159c75 100644 --- a/examples/toolbarCustomization.tsx +++ b/examples/toolbarCustomization.tsx @@ -1,28 +1,30 @@ -import * as React from 'react'; -import * as ReactDOM from 'react-dom'; +/* eslint-disable @typescript-eslint/no-require-imports */ + +import * as React from "react"; +import * as ReactDOM from "react-dom"; import { Workspace, WorkspaceProps, DemoDataProvider, ToolbarProps, -} from '../src/graph-explorer/index'; +} from "../src/graph-explorer/index"; import { onPageLoad, tryLoadLayoutFromLocalStorage, saveLayoutToLocalStorage, -} from './common'; +} from "./common"; -const CLASSES = require('./resources/classes.json'); -const LINK_TYPES = require('./resources/linkTypes.json'); -const ELEMENTS = require('./resources/elements.json'); -const LINKS = require('./resources/links.json'); +const CLASSES = require("./resources/classes.json"); +const LINK_TYPES = require("./resources/linkTypes.json"); +const ELEMENTS = require("./resources/elements.json"); +const LINKS = require("./resources/links.json"); export interface Props extends ToolbarProps { onExampleClick?: () => void; } -const CLASS_NAME = 'graph-explorer-toolbar'; +const CLASS_NAME = "graph-explorer-toolbar"; export class Toolbar extends React.Component { render() { @@ -85,7 +87,7 @@ const props: WorkspaceProps & React.ClassAttributes = { toolbar: ( { - alert('Example button has been pressed!'); + alert("Example button has been pressed!"); }} /> ), diff --git a/examples/wikidata.ts b/examples/wikidata.ts index 46ec80c7..581f1d54 100644 --- a/examples/wikidata.ts +++ b/examples/wikidata.ts @@ -1,23 +1,22 @@ -import { createElement, ClassAttributes } from 'react'; -import * as ReactDOM from 'react-dom'; +import { createElement, ClassAttributes } from "react"; +import * as ReactDOM from "react-dom"; import { Workspace, WorkspaceProps, SparqlDataProvider, WikidataSettings, - SparqlQueryMethod, PropertySuggestionParams, PropertyScore, -} from '../src/graph-explorer/index'; +} from "../src/graph-explorer/index"; import { onPageLoad, tryLoadLayoutFromLocalStorage, saveLayoutToLocalStorage, -} from './common'; +} from "./common"; -const WIKIDATA_PREFIX = 'http://www.wikidata.org/prop/direct/'; +const WIKIDATA_PREFIX = "http://www.wikidata.org/prop/direct/"; let workspace: Workspace; @@ -27,11 +26,11 @@ function getElementLabel(id: string): string { const element = model.getElement(id); return element ? view.formatLabel(element.data.label.values, element.iri) - : ''; + : ""; } function wikidataSuggestProperties(params: PropertySuggestionParams) { - const idMap: { [id: string]: string } = {}; + const idMap: Record = {}; const properties = params.properties.map((id) => { let resultID; @@ -47,15 +46,15 @@ function wikidataSuggestProperties(params: PropertySuggestionParams) { const requestBody = { threshold: 0.1, term, - + instance_properties: properties, }; - return fetch('/wikidata-prop-suggest', { - method: 'POST', + return fetch("/wikidata-prop-suggest", { + method: "POST", body: JSON.stringify(requestBody), - credentials: 'same-origin', - mode: 'cors', - cache: 'default', + credentials: "same-origin", + mode: "cors", + cache: "default", }) .then((response) => { if (response.ok) { @@ -67,7 +66,7 @@ function wikidataSuggestProperties(params: PropertySuggestionParams) { } }) .then((json) => { - const dictionary: { [id: string]: PropertyScore } = {}; + const dictionary: Record = {}; for (const scoredItem of json.data) { const propertyIri = idMap[scoredItem.id]; const item = dictionary[propertyIri]; @@ -103,10 +102,10 @@ function onWorkspaceMounted(wspace: Workspace) { const diagram = tryLoadLayoutFromLocalStorage(); const dataProvider = new SparqlDataProvider( { - endpointUrl: 'https://query.wikidata.org/bigdata/namespace/wdq/sparql', + endpointUrl: "https://query.wikidata.org/bigdata/namespace/wdq/sparql", imagePropertyUris: [ - 'http://www.wikidata.org/prop/direct/P18', - 'http://www.wikidata.org/prop/direct/P154', + "http://www.wikidata.org/prop/direct/P18", + "http://www.wikidata.org/prop/direct/P154", ], }, WikidataSettings diff --git a/examples/wikidataGraph.ts b/examples/wikidataGraph.ts index 48e572dc..ed12cb0f 100644 --- a/examples/wikidataGraph.ts +++ b/examples/wikidataGraph.ts @@ -1,5 +1,5 @@ -import { createElement, ClassAttributes } from 'react'; -import * as ReactDOM from 'react-dom'; +import { createElement, ClassAttributes } from "react"; +import * as ReactDOM from "react-dom"; import { Workspace, @@ -7,9 +7,9 @@ import { SparqlDataProvider, SparqlGraphBuilder, WikidataSettings, -} from '../src/graph-explorer/index'; +} from "../src/graph-explorer/index"; -import { onPageLoad } from './common'; +import { onPageLoad } from "./common"; function onWorkspaceMounted(workspace: Workspace) { if (!workspace) { @@ -18,10 +18,10 @@ function onWorkspaceMounted(workspace: Workspace) { const dataProvider = new SparqlDataProvider( { - endpointUrl: 'https://query.wikidata.org/bigdata/namespace/wdq/sparql', + endpointUrl: "https://query.wikidata.org/bigdata/namespace/wdq/sparql", imagePropertyUris: [ - 'http://www.wikidata.org/prop/direct/P18', - 'http://www.wikidata.org/prop/direct/P154', + "http://www.wikidata.org/prop/direct/P18", + "http://www.wikidata.org/prop/direct/P154", ], }, WikidataSettings diff --git a/package-lock.json b/package-lock.json index c2d608d3..1f40b941 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,14 +15,12 @@ "@types/rdfjs__data-model": "^2.0.9", "@types/sparqljs": "^3.1.3", "d3-color": "^3.1.0", - "eslint": "^8.57.1", "file-saverjs": "~1.3.6", "lodash": "~4.17.21", "n3": "^1.23.1", - "sparql-http-client": "^2.4.2", + "sparql-http-client": "^3.0.1", "sparqljs": "^3.6.2", - "webcola": "^3.4.0", - "whatwg-fetch": "^3.6.20" + "webcola": "^3.4.0" }, "devDependencies": { "@babel/core": "^7.13.10", @@ -31,28 +29,31 @@ "@babel/preset-react": "^7.12.13", "@babel/preset-typescript": "^7.13.0", "@babel/runtime": "^7.13.10", + "@eslint/js": "^9.21.0", + "@stylistic/eslint-plugin": "^4.2.0", + "@stylistic/eslint-plugin-ts": "^4.2.0", "@types/d3-color": "^1.2.2", "@types/lodash": "^4.14.191", - "@types/node": "^22.13.5", + "@types/node": "^22.13.9", "@types/react-dom": "^16.0.0", + "@types/sparql-http-client": "^3.0.5", "@typescript-eslint/eslint-plugin": "^8.25.0", - "canvg-fixed": "1.0.0", "css-loader": "^3.4.0", "dts-bundle": "^0.7.3", - "eslint-plugin-react": "^7.37.4", - "eslint-plugin-react-hooks": "^4.2.0", + "eslint": "^9.21.0", + "eslint-config-prettier": "^10.0.2", "html-webpack-plugin": "^5.6.3", "node-polyfill-webpack-plugin": "^4.1.0", - "prettier": "^2.8.1", "raw-loader": "0.5.1", "react": "^16.0.0", "react-dom": "^16.0.0", "sass": "^1.50.1", "sass-loader": "^12.6.0", "style-loader": "0.23.0", - "ts-loader": "9.4.2", - "tslib": "2.4.1", - "typescript": "^5.7.3", + "ts-loader": "9.5.2", + "tslib": "2.8.1", + "typescript": "^5.8.2", + "typescript-eslint": "^8.26.0", "url-loader": "4.1.1", "webpack": "^5.98.0", "webpack-cli": "^6.0.1", @@ -1771,6 +1772,18 @@ "node": ">=6.9.0" } }, + "node_modules/@bergos/jsonparse": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@bergos/jsonparse/-/jsonparse-1.4.2.tgz", + "integrity": "sha512-qUt0QNJjvg4s1zk+AuLM6s/zcsQ8MvGn7+1f0vPuxvpCYa08YtTryuDInngbEyW5fNGGYe2znKt61RMGd5HnXg==", + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -1785,6 +1798,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -1803,21 +1817,75 @@ "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", + "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1825,7 +1893,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1835,6 +1903,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1842,15 +1911,13 @@ } }, "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==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1860,6 +1927,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -1868,68 +1936,83 @@ "node": "*" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", + "node_modules/@eslint/js": { + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz", + "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "license": "MIT", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.12.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^1.1.7" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": "*" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -1939,12 +2022,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "license": "BSD-3-Clause" + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", @@ -2078,6 +2168,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -2091,6 +2182,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -2100,6 +2192,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -2428,70 +2521,130 @@ "rdfjs-data-model-test": "bin/test.js" } }, + "node_modules/@rdfjs/dataset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rdfjs/dataset/-/dataset-2.0.2.tgz", + "integrity": "sha512-6YJx+5n5Uxzq9dd9I0GGcIo6eopZOPfcsAfxSGX5d+YBzDgVa1cbtEBFnaPyPKiQsOm4+Cr3nwypjpg02YKPlA==", + "license": "MIT", + "bin": { + "rdfjs-dataset-test": "bin/test.js" + } + }, + "node_modules/@rdfjs/environment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rdfjs/environment/-/environment-1.0.0.tgz", + "integrity": "sha512-+S5YjSvfoQR5r7YQCRCCVHvIEyrWia7FJv2gqM3s5EDfotoAQmFeBagApa9c/eQFi5EiNhmBECE5nB8LIxTaHg==", + "license": "MIT" + }, "node_modules/@rdfjs/parser-n3": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rdfjs/parser-n3/-/parser-n3-1.1.4.tgz", - "integrity": "sha512-PUKSNlfD2Zq3GcQZuOF2ndfrLbc+N96FUe2gNIzARlR2er0BcOHBHEFUJvVGg1Xmsg3hVKwfg0nwn1JZ7qKKMw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rdfjs/parser-n3/-/parser-n3-2.0.2.tgz", + "integrity": "sha512-rrrvyh+kkj9ndwep2h6nYmugIfggDOC9uGpmDAHn/I/z52K7dHxi7xOkPPrezTsIbgNvFhV3zS7mzyObRxcLWA==", "license": "MIT", "dependencies": { - "@rdfjs/data-model": "^1.0.1", - "@rdfjs/sink": "^1.0.2", - "n3": "^1.3.5", - "readable-stream": "^3.6.0", - "readable-to-readable": "^0.1.0" + "@rdfjs/data-model": "^2.0.2", + "@rdfjs/sink": "^2.0.1", + "duplex-to": "^2.0.0", + "n3": "^1.17.2", + "readable-stream": "^4.5.2" } }, - "node_modules/@rdfjs/parser-n3/node_modules/@rdfjs/data-model": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-1.3.4.tgz", - "integrity": "sha512-iKzNcKvJotgbFDdti7GTQDCYmL7GsGldkYStiP0K8EYtN7deJu5t7U11rKTz+nR7RtesUggT+lriZ7BakFv8QQ==", + "node_modules/@rdfjs/sink": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/sink/-/sink-2.0.1.tgz", + "integrity": "sha512-smzIFGF6EH1sLAJR9F3p2wMNrN44JjPeYAoITTJLqtuNC319K7IXaJ+qNLBGTtapZ/jvpx2Tks0TjcH9KrAvEA==", + "license": "MIT" + }, + "node_modules/@rdfjs/to-ntriples": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/to-ntriples/-/to-ntriples-3.0.1.tgz", + "integrity": "sha512-gjoPAvh4j7AbGMjcDn/8R4cW+d/FPtbfbMM0uQXkyfBFtNUW2iVgrqsgJ65roLc54Y9A2TTFaeeTGSvY9a0HCQ==", + "license": "MIT" + }, + "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==", "license": "MIT", "dependencies": { - "@rdfjs/types": ">=1.0.1" - }, - "bin": { - "rdfjs-data-model-test": "bin/test.js" + "@types/node": "*" } }, - "node_modules/@rdfjs/parser-n3/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/@stylistic/eslint-plugin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.2.0.tgz", + "integrity": "sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@typescript-eslint/utils": "^8.23.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" }, "engines": { - "node": ">= 6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" } }, - "node_modules/@rdfjs/sink": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rdfjs/sink/-/sink-1.0.3.tgz", - "integrity": "sha512-2KfYa8mAnptRNeogxhQqkWNXqfYVWO04jQThtXKepySrIwYmz83+WlevQtA4VDLFe+kFd2TwgL29ekPe5XVUfA==", + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-4.2.0.tgz", + "integrity": "sha512-j2o2GvOx9v66x8hmp/HJ+0T+nOppiO5ycGsCkifh7JPGgjxEhpkGmIGx3RWsoxpWbad3VCX8e8/T8n3+7ze1Zg==", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.23.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0" + }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" } }, - "node_modules/@rdfjs/to-ntriples": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rdfjs/to-ntriples/-/to-ntriples-1.0.2.tgz", - "integrity": "sha512-ngw5XAaGHjgGiwWWBPGlfdCclHftonmbje5lMys4G2j4NvfExraPIuRZgjSnd5lg4dnulRVUll8tRbgKO+7EDA==", - "license": "MIT", + "node_modules/@stylistic/eslint-plugin-ts/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@types/body-parser": { @@ -2757,6 +2910,17 @@ "@rdfjs/types": "*" } }, + "node_modules/@types/rdfjs__environment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/rdfjs__environment/-/rdfjs__environment-1.0.0.tgz", + "integrity": "sha512-MDcnv3qfJvbHoEpUQXj5muT8g3e+xz1D8sGevrq3+Q4TzeEvQf5ijGX5l8485XFYrN/OBApgzXkHMZC04/kd5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rdfjs/types": "*", + "@types/node": "*" + } + }, "node_modules/@types/react": { "version": "16.14.62", "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.62.tgz", @@ -2838,6 +3002,17 @@ "@types/node": "*" } }, + "node_modules/@types/sparql-http-client": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/sparql-http-client/-/sparql-http-client-3.0.5.tgz", + "integrity": "sha512-Af35Iop5zrOjObTo64Xx8IBs73Nf+dHWqnhulGWF9cTtF+BUUBz8pDiUyiq3wMrKqhiljSyrT6WYcRGb3DVAKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rdfjs/types": ">=1.0.0", + "@types/rdfjs__environment": "*" + } + }, "node_modules/@types/sparqljs": { "version": "3.1.12", "resolved": "https://registry.npmjs.org/@types/sparqljs/-/sparqljs-3.1.12.tgz", @@ -2893,7 +3068,6 @@ "integrity": "sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.26.0", "@typescript-eslint/types": "8.26.0", @@ -3064,12 +3238,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -3292,18 +3460,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/@zazuko/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@zazuko/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-mrEqq7BJyNBlK5oT7U1S0EfLbFPpVHLXQJswhrN8Mv/3BKmWIBtMBaphK8AXF7XEhgK9vzRs/f3AIG8oHlPdpg==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -3344,6 +3500,7 @@ "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3356,6 +3513,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -3365,6 +3523,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -3446,6 +3605,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3455,6 +3615,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3484,24 +3645,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "Python-2.0" }, "node_modules/array-flatten": { "version": "1.1.1", @@ -3510,125 +3655,6 @@ "dev": true, "license": "MIT" }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -3662,16 +3688,6 @@ "util": "^0.12.5" } }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -3734,6 +3750,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -4104,6 +4121,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, "license": "MIT" }, "node_modules/buffer-xor": { @@ -4200,6 +4218,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -4247,21 +4266,11 @@ ], "license": "CC-BY-4.0" }, - "node_modules/canvg-fixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canvg-fixed/-/canvg-fixed-1.0.0.tgz", - "integrity": "sha512-rdLa4hyl6yNWnzKy2EsE5rGXAbEyZhTqltcf0WGZoAspGJufelh88HX6CeX7Ebimm3Dru/4CWQd2++5zWZ4tqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "rgbcolor": "0.0.4", - "stackblur": "^1.0.0" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -4346,6 +4355,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4358,6 +4368,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/colorette": { @@ -4427,59 +4438,9 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, "license": "MIT" }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/concat-stream/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==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/concat-stream/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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -4568,6 +4529,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, "license": "MIT" }, "node_modules/create-ecdh": { @@ -4624,19 +4586,11 @@ "dev": true, "license": "MIT" }, - "node_modules/cross-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -4809,64 +4763,20 @@ "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", "license": "BSD-3-Clause" }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 12" } }, "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==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4884,6 +4794,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, "license": "MIT" }, "node_modules/default-browser": { @@ -5067,18 +4978,6 @@ "node": ">=6" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -5216,6 +5115,12 @@ "node": ">= 0.4" } }, + "node_modules/duplex-to": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/duplex-to/-/duplex-to-2.0.0.tgz", + "integrity": "sha512-f2nMnk11mwDptEFBTv2mcWHpF4ENAbuQ63yTiSy/99rG4Exsxsf0GJhJYq/AHF2cdMYswSx23LPuoijBflpquQ==", + "license": "MIT" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -5273,15 +5178,6 @@ "node": ">= 0.8" } }, - "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==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", @@ -5319,72 +5215,6 @@ "node": ">=4" } }, - "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==", - "dev": true, - "license": "MIT", - "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", - "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-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-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -5405,34 +5235,6 @@ "node": ">= 0.4" } }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-module-lexer": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", @@ -5453,57 +5255,10 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "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, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -5521,6 +5276,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -5530,173 +5286,90 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz", + "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", + "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.2", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "9.21.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", - "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "jiti": "*" }, - "engines": { - "node": "*" + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "node_modules/eslint-config-prettier": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.2.tgz", + "integrity": "sha512-1105/17ZIMjmCOJOPNfVdbXafLCLj3hPmkmB7dLgt7XsQ/zkxSuDerE/xgO3RxoHysR1N1whmquY0lSn2O0VLg==", "dev": true, "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, "bin": { - "resolve": "bin/resolve" + "eslint-config-prettier": "build/bin/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": ">=7.0.0" } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5706,6 +5379,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5718,31 +5392,31 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "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==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -5751,30 +5425,32 @@ "node": "*" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5784,6 +5460,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -5796,6 +5473,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -5808,6 +5486,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -5817,6 +5496,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -5952,6 +5632,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -5988,12 +5669,14 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, "license": "MIT" }, "node_modules/fast-uri": { @@ -6027,6 +5710,7 @@ "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -6045,16 +5729,40 @@ "node": ">=0.8.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-saverjs": { @@ -6116,6 +5824,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -6139,23 +5848,24 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { @@ -6195,6 +5905,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6215,12 +5937,6 @@ "node": ">= 0.6" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -6246,37 +5962,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6336,39 +6021,6 @@ "node": ">=0.10.0" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/glob": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", @@ -6391,6 +6043,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -6440,23 +6093,6 @@ "node": ">=4" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -6481,6 +6117,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, "license": "MIT" }, "node_modules/handle-thing": { @@ -6490,24 +6127,12 @@ "dev": true, "license": "MIT" }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -6525,22 +6150,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -6906,6 +6515,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -6922,6 +6532,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -7027,6 +6638,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -7037,6 +6649,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -7047,22 +6660,8 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } + "license": "ISC" }, "node_modules/interpret": { "version": "3.1.1", @@ -7101,60 +6700,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -7168,23 +6713,6 @@ "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -7214,41 +6742,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", @@ -7269,25 +6762,10 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, "node_modules/is-generator-function": { @@ -7313,6 +6791,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -7340,19 +6819,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -7360,148 +6826,8 @@ "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-network-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -7510,61 +6836,66 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.12.0" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -7573,15 +6904,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -7606,17 +6936,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/isobject": { @@ -7639,24 +6963,6 @@ "node": ">=10" } }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -7699,6 +7005,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -7724,6 +7031,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -7737,12 +7045,14 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, "license": "MIT" }, "node_modules/json5": { @@ -7758,52 +7068,11 @@ "node": ">=6" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/jsonstream2": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonstream2/-/jsonstream2-3.0.0.tgz", - "integrity": "sha512-8ngq2XB8NjYrpe3+Xtl9lFJl6RoV2dNT4I7iyaHwxUpTBwsj0AlAR7epGfeYVP0z4Z7KxMoSxRgJWrd2jmBT/Q==", - "license": "MIT", - "dependencies": { - "jsonparse": "1.3.1", - "through2": "^3.0.1", - "type-component": "0.0.1" - }, - "bin": { - "jsonstream": "bin/jsonstream.js" - }, - "engines": { - "node": ">=5.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" @@ -7844,6 +7113,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -7905,6 +7175,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -7933,6 +7204,7 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, "license": "MIT" }, "node_modules/loose-envify": { @@ -8192,6 +7464,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, "node_modules/multicast-dns": { @@ -8226,6 +7499,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, "license": "MIT" }, "node_modules/negotiator": { @@ -8264,24 +7538,41 @@ "license": "MIT", "optional": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/node-forge": { @@ -8398,30 +7689,15 @@ } }, "node_modules/nodeify-fetch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/nodeify-fetch/-/nodeify-fetch-2.2.2.tgz", - "integrity": "sha512-4b1Jysy9RGyya0wJpseTQyxUgSbx6kw9ocHTY0OFRXWlxa2Uy5PrSo/P/nwoUn59rBR9YKty2kd7g4LKXmsZVA==", - "license": "MIT", - "dependencies": { - "@zazuko/node-fetch": "^2.6.6", - "concat-stream": "^1.6.0", - "cross-fetch": "^3.0.4", - "readable-error": "^1.0.0", - "readable-stream": "^3.5.0" - } - }, - "node_modules/nodeify-fetch/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodeify-fetch/-/nodeify-fetch-3.1.0.tgz", + "integrity": "sha512-ZV81vM//sEgTgXwVZlOONzcOCdTGQ53mV65FVSNXgPQHa8oCwRLtLbnGxL/1S/Yw90bcXUDKMz00jEnaeazo+A==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "lodash": "^4.17.21", + "node-fetch": "^3.2.10", + "readable-stream": "^4.2.0", + "stream-chunks": "^1.0.0" } }, "node_modules/normalize-path": { @@ -8518,59 +7794,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "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", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -8605,6 +7828,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -8633,6 +7857,7 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, "license": "MIT", "dependencies": { "deep-is": "^0.1.3", @@ -8653,28 +7878,11 @@ "dev": true, "license": "MIT" }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -8690,6 +7898,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -8751,6 +7960,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -8809,6 +8019,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8818,6 +8029,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8827,6 +8039,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9010,25 +8223,10 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">= 0.8.0" } }, "node_modules/pretty-error": { @@ -9055,12 +8253,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/promise-the-world": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-the-world/-/promise-the-world-1.0.1.tgz", - "integrity": "sha512-eAXctcYU0ksq9YT5LT0N3e8yvdEAp0aYuzIiaJo9CpZwga45i08MW05GMXZIow7N05d1o4EBoR5hjkb7jhzqKg==", + "dev": true, "license": "MIT" }, "node_modules/prop-types": { @@ -9121,16 +8314,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -9239,55 +8422,29 @@ "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/rdf-transform-triple-to-quad": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/rdf-transform-triple-to-quad/-/rdf-transform-triple-to-quad-1.0.2.tgz", - "integrity": "sha512-cr8wgJcj+SvPLichNhWhUTyXHcoD1EVgajVmvbtwYbMRw479KAaW03TTviQaJAUqgcWzIzkrWLtWkrY2FgwryQ==", + "integrity": "sha512-ny6CI7m2bq4lfQQmDYvcb2l1F9KtGwz9chipX4oWu2aAtVoXjb7k3d8J1EsgAsEbMXnBipB/iuRen5H2fwRWWQ==", "license": "MIT", "dependencies": { - "@rdfjs/data-model": "^1.1.2", - "readable-stream": "^3.5.0" + "@rdfjs/types": "^1.0.0" } }, - "node_modules/rdf-transform-triple-to-quad/node_modules/@rdfjs/data-model": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-1.3.4.tgz", - "integrity": "sha512-iKzNcKvJotgbFDdti7GTQDCYmL7GsGldkYStiP0K8EYtN7deJu5t7U11rKTz+nR7RtesUggT+lriZ7BakFv8QQ==", + "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==", "license": "MIT", "dependencies": { - "@rdfjs/types": ">=1.0.1" - }, - "bin": { - "rdfjs-data-model-test": "bin/test.js" + "@types/node": "*" } }, - "node_modules/rdf-transform-triple-to-quad/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/rdf-transform-triple-to-quad": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rdf-transform-triple-to-quad/-/rdf-transform-triple-to-quad-2.0.1.tgz", + "integrity": "sha512-OknvjzZSwstm120ugeeXpzS8o8jZNK+qc9lNmKOtndc7t2J17i62h3BVccUh4M0dBZk/sKhgaXaALaEHbPuWPg==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "@rdfjs/data-model": "^2.0.2", + "readable-stream": "^4.5.2" } }, "node_modules/react": { @@ -9328,51 +8485,6 @@ "dev": true, "license": "MIT" }, - "node_modules/readable-error": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/readable-error/-/readable-error-1.0.0.tgz", - "integrity": "sha512-CLnInu5bUphmFiZ3pD/BC6+Cg4/BzK6ZMvWfd0b2QMzYo159Z/f/nVFQ9L5IeMrqUxy0EFsp3XJ+BRfLfY13IQ==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.3.3" - } - }, - "node_modules/readable-error/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/readable-error/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==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-error/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/readable-error/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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -9389,30 +8501,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/readable-to-readable": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/readable-to-readable/-/readable-to-readable-0.1.3.tgz", - "integrity": "sha512-G+0kz01xJM/uTuItKcqC73cifW8S6CZ7tp77NLN87lE5mrSU+GC8geoSAlfmp0NocmXckQ7W8s8ns73HYsIA3w==", - "deprecated": "This package is no longer maintained", - "license": "MIT", - "dependencies": { - "readable-stream": "^3.6.0" - } - }, - "node_modules/readable-to-readable/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -9440,29 +8528,6 @@ "node": ">= 10.13.0" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -9500,27 +8565,6 @@ "@babel/runtime": "^7.8.4" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpu-core": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", @@ -9661,6 +8705,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -9680,81 +8725,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rgbcolor": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-0.0.4.tgz", - "integrity": "sha512-fG8I3S9oe435NsIa3bAcavWhr0ioN+m5qRfjidB1vn5rU2D69Ain0N0aiTtXggZJnsV7Fo/poCI0NnkkhtcRgw==", - "dev": true, - "license": "Public Domain", - "engines": { - "node": ">= 0.8.15" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "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", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -9783,6 +8760,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -9802,26 +8780,6 @@ "queue-microtask": "^1.2.2" } }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -9842,23 +8800,6 @@ ], "license": "MIT" }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", @@ -10057,29 +8998,6 @@ "node": ">= 0.8" } }, - "node_modules/separate-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/separate-stream/-/separate-stream-1.0.1.tgz", - "integrity": "sha512-UKFCzmddW2akOq40YdGehllv5gu6AD3y6nGSVuZuwI1kify2CiW7Zwsxx4ioaNLxx4LZaZMkcjdICHtSxpEpaA==", - "license": "MIT", - "dependencies": { - "readable-stream": "^3.6.0" - } - }, - "node_modules/separate-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -10210,37 +9128,6 @@ "node": ">= 0.4" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -10286,6 +9173,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -10298,6 +9186,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10436,48 +9325,22 @@ } }, "node_modules/sparql-http-client": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/sparql-http-client/-/sparql-http-client-2.4.2.tgz", - "integrity": "sha512-b7KBjs3BEJVQJAbWeaTx4EdBSOU1L0KfWLVgnkeRyBUoSTI8F1kTHuX7wzme/+UlfCS2zYsKGdpma5DwdaVRBQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^1.1.2", - "@rdfjs/parser-n3": "^1.1.3", - "@rdfjs/to-ntriples": "^1.0.2", - "get-stream": "^5.1.0", - "jsonstream2": "^3.0.0", - "lodash": "^4.17.15", - "nodeify-fetch": "^2.2.0", - "promise-the-world": "^1.0.1", - "rdf-transform-triple-to-quad": "^1.0.2", - "readable-stream": "^3.5.0", - "separate-stream": "^1.0.0" - } - }, - "node_modules/sparql-http-client/node_modules/@rdfjs/data-model": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-1.3.4.tgz", - "integrity": "sha512-iKzNcKvJotgbFDdti7GTQDCYmL7GsGldkYStiP0K8EYtN7deJu5t7U11rKTz+nR7RtesUggT+lriZ7BakFv8QQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.1" - }, - "bin": { - "rdfjs-data-model-test": "bin/test.js" - } - }, - "node_modules/sparql-http-client/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sparql-http-client/-/sparql-http-client-3.0.1.tgz", + "integrity": "sha512-efsgs0Dq6SvQ3Ag4l5GhayTINN3zNlKo99WoA1SYS7iJ1T1tSJjM9ZadTJYK5T6LJayrLllPCILI5fkpn7tY7Q==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "@bergos/jsonparse": "^1.4.1", + "@rdfjs/data-model": "^2.0.2", + "@rdfjs/dataset": "^2.0.2", + "@rdfjs/environment": "^1.0.0", + "@rdfjs/parser-n3": "^2.0.2", + "@rdfjs/to-ntriples": "^3.0.1", + "duplex-to": "^2.0.0", + "nodeify-fetch": "^3.1.0", + "rdf-transform-triple-to-quad": "^2.0.0", + "readable-stream": "^4.5.2", + "stream-chunks": "^1.0.0" } }, "node_modules/sparqljs": { @@ -10542,13 +9405,6 @@ "node": ">= 6" } }, - "node_modules/stackblur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stackblur/-/stackblur-1.0.0.tgz", - "integrity": "sha512-K92JX8alrs0pTox5U2arVBqB8tJmak9dh9i4Xausy94TnnGMdLfTn7P2Dp/NOzlmxvEs7lDzeryo8YqOy0BHRQ==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -10585,6 +9441,16 @@ "node": ">= 6" } }, + "node_modules/stream-chunks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-chunks/-/stream-chunks-1.0.0.tgz", + "integrity": "sha512-/G+kinLx3pKXChtuko82taA4gZo56zFG2b2BbhmugmS0TUPBL40c5b2vjonS+gAHYK/cSKM9m0WTvAJYgDUeNw==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "string_decoder": "^1.3.0" + } + }, "node_modules/stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", @@ -10622,108 +9488,11 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -10736,6 +9505,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10776,6 +9546,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -10918,12 +9689,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "license": "MIT" - }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -10937,30 +9702,6 @@ "tslib": "^2" } }, - "node_modules/through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -11004,12 +9745,6 @@ "node": ">=0.6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, "node_modules/tree-dump": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", @@ -11041,16 +9776,17 @@ } }, "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" @@ -11073,10 +9809,20 @@ "node": ">=10" } }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, @@ -11091,6 +9837,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -11099,11 +9846,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-component": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/type-component/-/type-component-0.0.1.tgz", - "integrity": "sha512-mDZRBQS2yZkwRQKfjJvQ8UIYJeBNNWCq+HBNstl9N5s9jZ4dkVYXEGkVPsSCEh5Ld4JM1kmrZTzjnrqSAIQ7dw==" - }, "node_modules/type-fest": { "version": "4.36.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.36.0.tgz", @@ -11131,90 +9873,6 @@ "node": ">= 0.6" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, "node_modules/typescript": { "version": "5.8.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", @@ -11229,23 +9887,27 @@ "node": ">=14.17" } }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "node_modules/typescript-eslint": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.26.0.tgz", + "integrity": "sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" + "@typescript-eslint/eslint-plugin": "8.26.0", + "@typescript-eslint/parser": "8.26.0", + "@typescript-eslint/utils": "8.26.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/undici-types": { @@ -11343,6 +10005,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -11352,6 +10015,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -11451,6 +10115,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, "license": "MIT" }, "node_modules/utila": { @@ -11521,6 +10186,15 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/webcola": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/webcola/-/webcola-3.4.0.tgz", @@ -11533,12 +10207,6 @@ "d3-timer": "^1.0.5" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, "node_modules/webpack": { "version": "5.98.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", @@ -12022,26 +10690,11 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -12053,73 +10706,6 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-typed-array": { "version": "1.1.18", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", @@ -12152,6 +10738,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12161,6 +10748,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/ws": { @@ -12206,6 +10794,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" diff --git a/package.json b/package.json index 50aedf05..4cbc9fac 100644 --- a/package.json +++ b/package.json @@ -39,17 +39,13 @@ "@types/n3": "^1.21.1", "@types/rdfjs__data-model": "^2.0.9", "@types/sparqljs": "^3.1.3", - "d3-color": "^3.1.0", - "eslint": "^8.57.1", "file-saverjs": "~1.3.6", "lodash": "~4.17.21", - "n3": "^1.23.1", - "sparql-http-client": "^2.4.2", + "sparql-http-client": "^3.0.1", "sparqljs": "^3.6.2", - "webcola": "^3.4.0", - "whatwg-fetch": "^3.6.20" + "webcola": "^3.4.0" }, "peerDependencies": { "react": "^16.0.0", @@ -62,28 +58,31 @@ "@babel/preset-react": "^7.12.13", "@babel/preset-typescript": "^7.13.0", "@babel/runtime": "^7.13.10", + "@eslint/js": "^9.21.0", + "@stylistic/eslint-plugin": "^4.2.0", + "@stylistic/eslint-plugin-ts": "^4.2.0", "@types/d3-color": "^1.2.2", "@types/lodash": "^4.14.191", - "@types/node": "^22.13.5", + "@types/node": "^22.13.9", "@types/react-dom": "^16.0.0", + "@types/sparql-http-client": "^3.0.5", "@typescript-eslint/eslint-plugin": "^8.25.0", - "canvg-fixed": "1.0.0", "css-loader": "^3.4.0", "dts-bundle": "^0.7.3", - "eslint-plugin-react": "^7.37.4", - "eslint-plugin-react-hooks": "^4.2.0", + "eslint": "^9.21.0", + "eslint-config-prettier": "^10.0.2", "html-webpack-plugin": "^5.6.3", "node-polyfill-webpack-plugin": "^4.1.0", - "prettier": "^2.8.1", "raw-loader": "0.5.1", "react": "^16.0.0", "react-dom": "^16.0.0", "sass": "^1.50.1", "sass-loader": "^12.6.0", "style-loader": "0.23.0", - "ts-loader": "9.4.2", - "tslib": "2.4.1", - "typescript": "^5.7.3", + "ts-loader": "9.5.2", + "tslib": "2.8.1", + "typescript": "^5.8.2", + "typescript-eslint": "^8.26.0", "url-loader": "4.1.1", "webpack": "^5.98.0", "webpack-cli": "^6.0.1", diff --git a/src/graph-explorer/customization/defaultLinkStyles.ts b/src/graph-explorer/customization/defaultLinkStyles.ts index 9dc8e71a..4936e05b 100644 --- a/src/graph-explorer/customization/defaultLinkStyles.ts +++ b/src/graph-explorer/customization/defaultLinkStyles.ts @@ -1,5 +1,5 @@ -import { LinkTemplate, LinkTemplateResolver } from './props'; -import { PLACEHOLDER_LINK_TYPE } from '../data/schema'; +import { LinkTemplate, LinkTemplateResolver } from "./props"; +import { PLACEHOLDER_LINK_TYPE } from "../data/schema"; export const LINK_SHOW_IRI: LinkTemplate = { renderLink: (link) => ({ @@ -11,12 +11,12 @@ export const LINK_SHOW_IRI: LinkTemplate = { text: [ { value: link.typeId, - language: '', + language: "", }, ], - fill: 'gray', - 'font-size': 12, - 'font-weight': 'lighter', + fill: "gray", + "font-size": 12, + "font-weight": "lighter", }, }, }, @@ -26,67 +26,67 @@ export const LINK_SHOW_IRI: LinkTemplate = { const LINK_SUB_CLASS_OF: LinkTemplate = { markerTarget: { - fill: '#f8a485', - stroke: '#cf8e76', + fill: "#f8a485", + stroke: "#cf8e76", }, renderLink: () => ({ connection: { - stroke: '#f8a485', - 'stroke-width': 2, + stroke: "#f8a485", + "stroke-width": 2, }, }), }; const LINK_DOMAIN: LinkTemplate = { markerTarget: { - fill: '#34c7f3', - stroke: '#38b5db', + fill: "#34c7f3", + stroke: "#38b5db", }, renderLink: () => ({ connection: { - stroke: '#34c7f3', - 'stroke-width': 2, + stroke: "#34c7f3", + "stroke-width": 2, }, }), }; const LINK_RANGE: LinkTemplate = { markerTarget: { - fill: '#34c7f3', - stroke: '#38b5db', + fill: "#34c7f3", + stroke: "#38b5db", }, renderLink: () => ({ connection: { - stroke: '#34c7f3', - 'stroke-width': 2, + stroke: "#34c7f3", + "stroke-width": 2, }, }), }; const LINK_TYPE_OF: LinkTemplate = { markerTarget: { - fill: '#8cd965', - stroke: '#5b9a3b', + fill: "#8cd965", + stroke: "#5b9a3b", }, renderLink: () => ({ connection: { - stroke: '#8cd965', - 'stroke-width': 2, + stroke: "#8cd965", + "stroke-width": 2, }, }), }; export const DefaultLinkTemplateBundle: LinkTemplateResolver = (type) => { - if (type === 'http://www.w3.org/2000/01/rdf-schema#subClassOf') { + if (type === "http://www.w3.org/2000/01/rdf-schema#subClassOf") { return LINK_SUB_CLASS_OF; - } else if (type === 'http://www.w3.org/2000/01/rdf-schema#domain') { + } else if (type === "http://www.w3.org/2000/01/rdf-schema#domain") { return LINK_DOMAIN; - } else if (type === 'http://www.w3.org/2000/01/rdf-schema#range') { + } else if (type === "http://www.w3.org/2000/01/rdf-schema#range") { return LINK_RANGE; - } else if (type === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type') { + } else if (type === "http://www.w3.org/1999/02/22-rdf-syntax-ns#type") { return LINK_TYPE_OF; } else if (type === PLACEHOLDER_LINK_TYPE) { - return { markerTarget: { fill: 'none' } }; + return { markerTarget: { fill: "none" } }; } else { return undefined; } diff --git a/src/graph-explorer/customization/defaultTypeStyles.ts b/src/graph-explorer/customization/defaultTypeStyles.ts index ae0799a3..756f60f6 100644 --- a/src/graph-explorer/customization/defaultTypeStyles.ts +++ b/src/graph-explorer/customization/defaultTypeStyles.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-require-imports */ + import { TypeStyleResolver } from "./props"; const classIcon = require("../../../images/icons/class.svg").default as string; diff --git a/src/graph-explorer/customization/props.ts b/src/graph-explorer/customization/props.ts index 6e43aaa4..33ea1dec 100644 --- a/src/graph-explorer/customization/props.ts +++ b/src/graph-explorer/customization/props.ts @@ -1,5 +1,5 @@ -import { ComponentClass } from 'react'; -import { DiagramModel } from '../diagram/model'; +import { ComponentClass } from "react"; +import { DiagramModel } from "../diagram/model"; import { ElementIri, @@ -7,8 +7,8 @@ import { Dictionary, LocalizedString, Property, -} from '../data/model'; -import { Link } from '../diagram/elements'; +} from "../data/model"; +import { Link } from "../diagram/elements"; export type TypeStyleResolver = ( types: string[] @@ -39,11 +39,11 @@ export interface TemplateProps { props?: Dictionary; } -export type PropArray = Array<{ +export type PropArray = { id: string; name: string; property: Property; -}>; +}[]; export interface LinkTemplate { markerSource?: LinkMarkerStyle; @@ -56,8 +56,8 @@ export interface LinkStyle { connection?: { fill?: string; stroke?: string; - 'stroke-width'?: number; - 'stroke-dasharray'?: string; + "stroke-width"?: number; + "stroke-dasharray"?: string; }; label?: LinkLabel; properties?: LinkLabel[]; @@ -72,8 +72,8 @@ export type RoutedLinks = Map; export interface RoutedLink { linkId: string; - vertices: ReadonlyArray; - labelTextAnchor?: 'start' | 'middle' | 'end'; + vertices: readonly Vertex[]; + labelTextAnchor?: "start" | "middle" | "end"; } export interface Vertex { @@ -97,15 +97,15 @@ export interface LinkLabel { rect?: { fill?: string; stroke?: string; - 'stroke-width'?: number; + "stroke-width"?: number; }; text?: { fill?: string; stroke?: string; - 'stroke-width'?: number; - 'font-family'?: string; - 'font-size'?: string | number; - 'font-weight'?: 'normal' | 'bold' | 'lighter' | 'bolder' | number; + "stroke-width"?: number; + "font-family"?: string; + "font-size"?: string | number; + "font-weight"?: "normal" | "bold" | "lighter" | "bolder" | number; text?: LocalizedString[]; }; }; diff --git a/src/graph-explorer/customization/templates/default.tsx b/src/graph-explorer/customization/templates/default.tsx index 9e1cc41e..05475f3b 100644 --- a/src/graph-explorer/customization/templates/default.tsx +++ b/src/graph-explorer/customization/templates/default.tsx @@ -1,10 +1,10 @@ -import * as React from 'react'; +import * as React from "react"; -import { TemplateProps } from '../props'; +import { TemplateProps } from "../props"; -import { getPropertyValues } from './utils'; +import { getPropertyValues } from "./utils"; -const CLASS_NAME = 'graph-explorer-default-template'; +const CLASS_NAME = "graph-explorer-default-template"; export class DefaultElementTemplate extends React.Component { render() { @@ -104,7 +104,7 @@ export class DefaultElementTemplate extends React.Component { className="graph-explorer-default-template_body_expander_property-table_row" >
{prop.name} diff --git a/src/graph-explorer/customization/templates/group.tsx b/src/graph-explorer/customization/templates/group.tsx index 2cdc41a7..bcb746db 100644 --- a/src/graph-explorer/customization/templates/group.tsx +++ b/src/graph-explorer/customization/templates/group.tsx @@ -1,9 +1,9 @@ -import * as React from 'react'; +import * as React from "react"; -import { TemplateProps } from '../props'; -import { EmbeddedLayer } from '../../diagram/embeddedLayer'; +import { TemplateProps } from "../props"; +import { EmbeddedLayer } from "../../diagram/embeddedLayer"; -const CLASS = 'graph-explorer-group-template'; +const CLASS = "graph-explorer-group-template"; export class GroupTemplate extends React.Component { render() { diff --git a/src/graph-explorer/customization/templates/index.ts b/src/graph-explorer/customization/templates/index.ts index 9c15f090..33677099 100644 --- a/src/graph-explorer/customization/templates/index.ts +++ b/src/graph-explorer/customization/templates/index.ts @@ -1,8 +1,8 @@ -import { TemplateResolver } from '../props'; +import { TemplateResolver } from "../props"; -export * from './default'; -export * from './group'; -export * from './standard'; +export * from "./default"; +export * from "./group"; +export * from "./standard"; -export const DefaultElementTemplateBundle: TemplateResolver = (types) => +export const DefaultElementTemplateBundle: TemplateResolver = (_types) => undefined; diff --git a/src/graph-explorer/customization/templates/standard.tsx b/src/graph-explorer/customization/templates/standard.tsx index dbe067eb..16da988f 100644 --- a/src/graph-explorer/customization/templates/standard.tsx +++ b/src/graph-explorer/customization/templates/standard.tsx @@ -1,24 +1,24 @@ -import * as React from 'react'; -import { Component } from 'react'; +import * as React from "react"; +import { Component } from "react"; -import { isEncodedBlank } from '../../data/sparql/blankNodes'; +import { isEncodedBlank } from "../../data/sparql/blankNodes"; -import { TemplateProps, PropArray } from '../props'; -import { getProperty, getPropertyValues } from './utils'; +import { TemplateProps, PropArray } from "../props"; +import { getProperty, getPropertyValues } from "./utils"; -import { TemplateProperties } from '../../data/schema'; +import { TemplateProperties } from "../../data/schema"; import { AuthoredEntity, AuthoredEntityContext, -} from '../../editor/authoredEntity'; -import { AuthoringState } from '../../editor/authoringState'; +} from "../../editor/authoredEntity"; +import { AuthoringState } from "../../editor/authoringState"; -import { HtmlSpinner } from '../../viewUtils/spinner'; +import { HtmlSpinner } from "../../viewUtils/spinner"; -const FOAF_NAME = 'http://xmlns.com/foaf/0.1/name'; +const FOAF_NAME = "http://xmlns.com/foaf/0.1/name"; -const CLASS_NAME = 'graph-explorer-standard-template'; +const CLASS_NAME = "graph-explorer-standard-template"; export class StandardTemplate extends Component { render() { @@ -38,7 +38,7 @@ export class StandardTemplate extends Component { editor.authoringState, iri ); - const leftStripeColor = isNewElement ? 'white' : color; + const leftStripeColor = isNewElement ? "white" : color; const pinnedProperties = this.findPinnedProperties(context); return ( @@ -171,7 +171,7 @@ export class StandardTemplate extends Component {
- IRI{context.editedIri ? '\u00A0(edited)' : ''}: + IRI{context.editedIri ? "\u00A0(edited)" : ""}:
{isEncodedBlank(finalIri) ? ( @@ -216,7 +216,7 @@ export class StandardTemplate extends Component { aria-hidden="true" style={{ color }} > - {typeLabel.length > 0 ? typeLabel.charAt(0).toUpperCase() : '✳'} + {typeLabel.length > 0 ? typeLabel.charAt(0).toUpperCase() : "✳"}
); } @@ -241,8 +241,8 @@ export class StandardTemplate extends Component { className="graph-explorer-btn graph-explorer-btn-default" title={ canDelete - ? 'Delete entity' - : 'Deletion is unavailable for the selected element' + ? "Delete entity" + : "Deletion is unavailable for the selected element" } disabled={!canDelete} onClick={onDelete} @@ -252,7 +252,7 @@ export class StandardTemplate extends Component { {canEdit === undefined ? ( ) : ( - 'Delete' + "Delete" )}
@@ -279,6 +279,4 @@ export class StandardTemplate extends Component { } } -interface PinnedProperties { - [propertyId: string]: boolean; -} +type PinnedProperties = Record; diff --git a/src/graph-explorer/customization/templates/utils.ts b/src/graph-explorer/customization/templates/utils.ts index 4a1a8b18..85588ef5 100644 --- a/src/graph-explorer/customization/templates/utils.ts +++ b/src/graph-explorer/customization/templates/utils.ts @@ -3,11 +3,11 @@ import { Property, isIriProperty, isLiteralProperty, -} from '../../data/model'; +} from "../../data/model"; export function getProperty(props: Dictionary, id: string) { if (props && props[id]) { - return getPropertyValues(props[id]).join(', '); + return getPropertyValues(props[id]).join(", "); } else { return undefined; } diff --git a/src/graph-explorer/data/composite/composite.ts b/src/graph-explorer/data/composite/composite.ts index 85a94e9e..8cc8bd87 100644 --- a/src/graph-explorer/data/composite/composite.ts +++ b/src/graph-explorer/data/composite/composite.ts @@ -1,4 +1,4 @@ -import { DataProvider, LinkElementsParams, FilterParams } from '../provider'; +import { DataProvider, LinkElementsParams, FilterParams } from "../provider"; import { Dictionary, ClassModel, @@ -6,14 +6,12 @@ import { ElementModel, LinkModel, LinkCount, - Property, PropertyModel, - LocalizedString, ElementIri, ElementTypeIri, LinkTypeIri, PropertyTypeIri, -} from '../model'; +} from "../model"; import { CompositeResponse, mergeClassTree, @@ -26,7 +24,7 @@ import { mergeLinkTypesOf, mergeLinkElements, mergeFilter, -} from './mergeUtils'; +} from "./mergeUtils"; export interface DPDefinition { name: string; @@ -39,11 +37,11 @@ function isDefinition(dp: DataProvider | DPDefinition): dp is DPDefinition { return definition.name !== undefined && definition.dataProvider !== undefined; } -export type MergeMode = 'fetchAll' | 'sequentialFetching'; +export type MergeMode = "fetchAll" | "sequentialFetching"; export class CompositeDataProvider implements DataProvider { public dataProviders: DPDefinition[]; - public mergeMode: MergeMode = 'fetchAll'; + public mergeMode: MergeMode = "fetchAll"; constructor( dataProviders: (DataProvider | DPDefinition)[], @@ -57,7 +55,7 @@ export class CompositeDataProvider implements DataProvider { return dp; } else { return { - name: 'dataProvider_' + dpCounter++, + name: "dataProvider_" + dpCounter++, dataProvider: dp, }; } @@ -69,14 +67,14 @@ export class CompositeDataProvider implements DataProvider { } classTree(): Promise { - return this.fetchSequentially('classTree', mergeClassTree, undefined); + return this.fetchSequentially("classTree", mergeClassTree, undefined); } propertyInfo(params: { propertyIds: PropertyTypeIri[]; }): Promise> { - if (this.mergeMode === 'fetchAll') { - return this.fetchSequentially('propertyInfo', mergePropertyInfo, params); + if (this.mergeMode === "fetchAll") { + return this.fetchSequentially("propertyInfo", mergePropertyInfo, params); } else { let propertyIds = params.propertyIds; return this.queueProcessResults( @@ -93,8 +91,8 @@ export class CompositeDataProvider implements DataProvider { } classInfo(params: { classIds: ElementTypeIri[] }): Promise { - if (this.mergeMode === 'fetchAll') { - return this.fetchSequentially('classInfo', mergeClassInfo, params); + if (this.mergeMode === "fetchAll") { + return this.fetchSequentially("classInfo", mergeClassInfo, params); } else { let classIds = params.classIds; return this.queueProcessResults( @@ -113,9 +111,9 @@ export class CompositeDataProvider implements DataProvider { } linkTypesInfo(params: { linkTypeIds: LinkTypeIri[] }): Promise { - if (this.mergeMode === 'fetchAll') { + if (this.mergeMode === "fetchAll") { return this.fetchSequentially( - 'linkTypesInfo', + "linkTypesInfo", mergeLinkTypesInfo, params ); @@ -137,14 +135,14 @@ export class CompositeDataProvider implements DataProvider { } linkTypes(): Promise { - return this.fetchSequentially('linkTypes', mergeLinkTypes, undefined); + return this.fetchSequentially("linkTypes", mergeLinkTypes, undefined); } elementInfo(params: { elementIds: ElementIri[]; }): Promise> { - if (this.mergeMode === 'fetchAll') { - return this.fetchSequentially('elementInfo', mergeElementInfo, params); + if (this.mergeMode === "fetchAll") { + return this.fetchSequentially("elementInfo", mergeElementInfo, params); } else { let elementIds = params.elementIds; return this.queueProcessResults( @@ -164,8 +162,8 @@ export class CompositeDataProvider implements DataProvider { elementIds: ElementIri[]; linkTypeIds: LinkTypeIri[]; }): Promise { - if (this.mergeMode === 'fetchAll') { - return this.fetchSequentially('linksInfo', mergeLinksInfo, params); + if (this.mergeMode === "fetchAll") { + return this.fetchSequentially("linksInfo", mergeLinksInfo, params); } else { let elementIds = params.elementIds; return this.queueProcessResults( @@ -192,8 +190,8 @@ export class CompositeDataProvider implements DataProvider { } linkTypesOf(params: { elementId: ElementIri }): Promise { - if (this.mergeMode === 'fetchAll') { - return this.fetchSequentially('linkTypesOf', mergeLinkTypesOf, params); + if (this.mergeMode === "fetchAll") { + return this.fetchSequentially("linkTypesOf", mergeLinkTypesOf, params); } else { return this.queueProcessResults( (previousResult: LinkCount[], dp: DPDefinition) => { @@ -211,8 +209,8 @@ export class CompositeDataProvider implements DataProvider { } linkElements(params: LinkElementsParams): Promise> { - if (this.mergeMode === 'fetchAll') { - return this.fetchSequentially('linkElements', mergeLinkElements, params); + if (this.mergeMode === "fetchAll") { + return this.fetchSequentially("linkElements", mergeLinkElements, params); } else { return this.queueProcessResults( (previousResult: Dictionary, dp: DPDefinition) => { @@ -230,8 +228,8 @@ export class CompositeDataProvider implements DataProvider { } filter(params: FilterParams): Promise> { - if (this.mergeMode === 'fetchAll') { - return this.fetchSequentially('filter', mergeFilter, params); + if (this.mergeMode === "fetchAll") { + return this.fetchSequentially("filter", mergeFilter, params); } else { return this.queueProcessResults( (previousResult: Dictionary, dp: DPDefinition) => { @@ -260,7 +258,6 @@ export class CompositeDataProvider implements DataProvider { response: response, })) .catch((error) => { - // tslint:disable-next-line:no-console console.error(error); return { dataSourceName: dpName, @@ -298,7 +295,6 @@ export class CompositeDataProvider implements DataProvider { return recursiveCall(newResult); }) .catch((error) => { - // tslint:disable-next-line:no-console console.error(error); return recursiveCall(result); }); @@ -317,7 +313,7 @@ export class CompositeDataProvider implements DataProvider { params: OperationParams ) { const resultPromises = this.dataProviders.map((dp: DPDefinition) => { - const providerMethod = (dp.dataProvider[functionName] as any) as ( + const providerMethod = dp.dataProvider[functionName] as any as ( this: DataProvider, params: OperationParams ) => Promise>; diff --git a/src/graph-explorer/data/composite/mergeUtils.ts b/src/graph-explorer/data/composite/mergeUtils.ts index 37935f1d..c1174faf 100644 --- a/src/graph-explorer/data/composite/mergeUtils.ts +++ b/src/graph-explorer/data/composite/mergeUtils.ts @@ -8,10 +8,10 @@ import { Property, PropertyModel, LocalizedString, -} from '../model'; +} from "../model"; const DATA_PROVIDER_PROPERTY = - 'http://graph-explorer.org/property/DataProvider'; + "http://graph-explorer.org/property/DataProvider"; export interface CompositeResponse { dataSourceName: string; @@ -63,6 +63,7 @@ export function mergeClassTree( for (const m of models) { m.children = (childrenMap[m.id] || []).map((id) => { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete topLevelModels[id]; return dictionary[id]; }); @@ -180,9 +181,6 @@ export function mergeElementInfo( }; }; - const dictionaries = response - .filter((r) => r.response) - .map((r) => r.response); const dictionary: Dictionary = {}; for (const resp of response) { @@ -194,8 +192,8 @@ export function mergeElementInfo( for (const em of list) { em.sources = [resp.dataSourceName]; em.properties[DATA_PROVIDER_PROPERTY] = { - type: 'string', - values: [{ value: resp.dataSourceName, language: '' }], + type: "string", + values: [{ value: resp.dataSourceName, language: "" }], }; if (!dictionary[em.id]) { dictionary[em.id] = em; @@ -218,10 +216,10 @@ export function mergeProperties( function createIdForProperty(baseId: string): string { let counter = 1; - while (result[baseId + '_' + counter]) { + while (result[baseId + "_" + counter]) { counter++; } - return baseId + '_' + counter; + return baseId + "_" + counter; } for (const pKey of aLists) { diff --git a/src/graph-explorer/data/demo/provider.ts b/src/graph-explorer/data/demo/provider.ts index 03b07903..db978ab8 100644 --- a/src/graph-explorer/data/demo/provider.ts +++ b/src/graph-explorer/data/demo/provider.ts @@ -1,5 +1,5 @@ -import { cloneDeep, keyBy, map, each } from 'lodash'; -import { DataProvider, LinkElementsParams, FilterParams } from '../provider'; +import { cloneDeep, keyBy, map, each } from "lodash"; +import { DataProvider, LinkElementsParams, FilterParams } from "../provider"; import { Dictionary, ClassModel, @@ -10,8 +10,7 @@ import { ElementIri, ElementTypeIri, LinkTypeIri, - PropertyTypeIri, -} from '../model'; +} from "../model"; export class DemoDataProvider implements DataProvider { constructor( @@ -81,7 +80,11 @@ export class DemoDataProvider implements DataProvider { const linkCount = counts[link.linkTypeId]; const isSource = link.sourceId === params.elementId; if (linkCount) { - isSource ? linkCount.outCount++ : linkCount.inCount++; + if (isSource) { + linkCount.outCount++; + } else { + linkCount.inCount++; + } } else { counts[link.linkTypeId] = isSource ? { id: link.linkTypeId, inCount: 0, outCount: 1 } @@ -100,7 +103,7 @@ export class DemoDataProvider implements DataProvider { linkDirection: params.direction, limit: params.limit, offset: params.offset, - languageCode: '', + languageCode: "", }); } @@ -129,9 +132,9 @@ export class DemoDataProvider implements DataProvider { const nodeId = params.refElementId; for (const link of filteredLinks) { let linkedElementId: string; - if (link.sourceId === nodeId && params.linkDirection !== 'in') { + if (link.sourceId === nodeId && params.linkDirection !== "in") { linkedElementId = link.targetId; - } else if (link.targetId === nodeId && params.linkDirection !== 'out') { + } else if (link.targetId === nodeId && params.linkDirection !== "out") { linkedElementId = link.sourceId; } if (linkedElementId !== undefined) { @@ -145,7 +148,7 @@ export class DemoDataProvider implements DataProvider { filtered = this.allElements; // filtering by text is done below } else { return Promise.reject( - new Error('This type of filter is not implemented') + new Error("This type of filter is not implemented") ); } diff --git a/src/graph-explorer/data/metadataApi.ts b/src/graph-explorer/data/metadataApi.ts index 1b21010d..7362c70c 100644 --- a/src/graph-explorer/data/metadataApi.ts +++ b/src/graph-explorer/data/metadataApi.ts @@ -4,10 +4,9 @@ import { LinkTypeIri, PropertyTypeIri, LinkModel, - ElementIri, -} from './model'; -import { LinkDirection } from '../diagram/elements'; -import { CancellationToken } from '../viewUtils/async'; +} from "./model"; +import { LinkDirection } from "../diagram/elements"; +import { CancellationToken } from "../viewUtils/async"; export interface MetadataApi { /** @@ -87,7 +86,7 @@ export interface MetadataApi { ): Promise; generateNewElement( - types: ReadonlyArray, + types: readonly ElementTypeIri[], ct: CancellationToken ): Promise; } diff --git a/src/graph-explorer/data/model.ts b/src/graph-explorer/data/model.ts index edf592db..9ca98499 100644 --- a/src/graph-explorer/data/model.ts +++ b/src/graph-explorer/data/model.ts @@ -1,9 +1,7 @@ -import { hashFnv32a } from './utils'; -import { RdfIri } from './sparql/sparqlModels'; +import { hashFnv32a } from "./utils"; +import { RdfIri } from "./sparql/sparqlModels"; -export interface Dictionary { - [key: string]: T; -} +export type Dictionary = Record; export interface LocalizedString { readonly value: string; @@ -13,33 +11,33 @@ export interface LocalizedString { } export interface IriProperty { - type: 'uri'; - values: ReadonlyArray; + type: "uri"; + values: readonly RdfIri[]; } export interface LiteralProperty { - type: 'string'; - values: ReadonlyArray; + type: "string"; + values: readonly LocalizedString[]; } export type Property = IriProperty | LiteralProperty; export function isIriProperty(e: Property): e is IriProperty { - return e && e.type === 'uri'; + return e && e.type === "uri"; } export function isLiteralProperty(e: Property): e is LiteralProperty { - return e && e.type === 'string'; + return e && e.type === "string"; } -export type ElementIri = string & { readonly elementBrand: void }; -export type ElementTypeIri = string & { readonly classBrand: void }; -export type LinkTypeIri = string & { readonly linkTypeBrand: void }; -export type PropertyTypeIri = string & { readonly propertyTypeBrand: void }; +export type ElementIri = string & { readonly elementBrand: any }; +export type ElementTypeIri = string & { readonly classBrand: any }; +export type LinkTypeIri = string & { readonly linkTypeBrand: any }; +export type PropertyTypeIri = string & { readonly propertyTypeBrand: any }; export interface ElementModel { id: ElementIri; types: ElementTypeIri[]; label: { values: LocalizedString[] }; image?: string; - properties: { [id: string]: Property }; + properties: Record; sources?: string[]; } @@ -47,7 +45,7 @@ export interface LinkModel { linkTypeId: LinkTypeIri; sourceId: ElementIri; targetId: ElementIri; - properties?: { [id: string]: Property }; + properties?: Record; } export interface ClassModel { @@ -117,8 +115,8 @@ function isArraysEqual(left: string[], right: string[]): boolean { } function isLiteralsEqual( - left: ReadonlyArray, - right: ReadonlyArray + left: readonly LocalizedString[], + right: readonly LocalizedString[] ): boolean { if (left.length !== right.length) { return false; @@ -161,8 +159,8 @@ function isLiteralPropertiesEqual(left: Property, right: Property): boolean { } function isPropertiesEqual( - left: { [id: string]: Property }, - right: { [id: string]: Property } + left: Record, + right: Record ) { if (Object.keys(left).length !== Object.keys(right).length) { return false; diff --git a/src/graph-explorer/data/provider.ts b/src/graph-explorer/data/provider.ts index b3e36921..5f373b4c 100644 --- a/src/graph-explorer/data/provider.ts +++ b/src/graph-explorer/data/provider.ts @@ -10,7 +10,7 @@ import { ElementTypeIri, LinkTypeIri, PropertyTypeIri, -} from './model'; +} from "./model"; /** * DataProvider is responsible for getting data into Graph Explorer @@ -107,7 +107,7 @@ export interface LinkElementsParams { linkId: LinkTypeIri; limit?: number; offset: number; - direction?: 'in' | 'out'; + direction?: "in" | "out"; } export interface FilterParams { @@ -134,7 +134,7 @@ export interface FilterParams { /** * Reference element link type direction ('in' | 'out'). Is used only when refElementLinkId is set. */ - linkDirection?: 'in' | 'out'; + linkDirection?: "in" | "out"; /** * Limit number of elements returned. Defaults depend on data provider implementation diff --git a/src/graph-explorer/data/schema.ts b/src/graph-explorer/data/schema.ts index 0a291e5c..3dd15159 100644 --- a/src/graph-explorer/data/schema.ts +++ b/src/graph-explorer/data/schema.ts @@ -1,13 +1,15 @@ -import { ElementTypeIri, LinkTypeIri } from './model'; -import { generate128BitID } from './utils'; +import { ElementTypeIri, LinkTypeIri } from "./model"; +import { generate128BitID } from "./utils"; // context could be imported directly from NPM package, e.g. export const DIAGRAM_CONTEXT_URL_V1 = - 'https://graph-explorer.org/context/v1.json'; + "https://graph-explorer.org/context/v1.json"; -export const PLACEHOLDER_ELEMENT_TYPE = 'http://graph-explorer.org/NewEntity' as ElementTypeIri; -export const PLACEHOLDER_LINK_TYPE = 'http://graph-explorer.org/NewLink' as LinkTypeIri; -const GRAPH_EXPLORER_ID_URL_PREFIX = 'http://graph-explorer.org/data/'; +export const PLACEHOLDER_ELEMENT_TYPE = + "http://graph-explorer.org/NewEntity" as ElementTypeIri; +export const PLACEHOLDER_LINK_TYPE = + "http://graph-explorer.org/NewLink" as LinkTypeIri; +const GRAPH_EXPLORER_ID_URL_PREFIX = "http://graph-explorer.org/data/"; export const GenerateID = { forElement() { @@ -19,6 +21,6 @@ export const GenerateID = { }; export const TemplateProperties = { - PinnedProperties: 'graph-explorer:pinnedProperties', - CustomLabel: 'graph-explorer:customLabel', + PinnedProperties: "graph-explorer:pinnedProperties", + CustomLabel: "graph-explorer:customLabel", }; diff --git a/src/graph-explorer/data/sparql/blankNodes.ts b/src/graph-explorer/data/sparql/blankNodes.ts index 84eae06d..6a2df0d3 100644 --- a/src/graph-explorer/data/sparql/blankNodes.ts +++ b/src/graph-explorer/data/sparql/blankNodes.ts @@ -1,8 +1,8 @@ -import { Dictionary } from '../model'; -import { FilterParams } from '../provider'; -import { getUriLocalName } from '../utils'; +import { Dictionary } from "../model"; +import { FilterParams } from "../provider"; +import { getUriLocalName } from "../utils"; -import { SparqlDataProviderSettings } from './sparqlDataProviderSettings'; +import { SparqlDataProviderSettings } from "./sparqlDataProviderSettings"; import { ElementBinding, LinkBinding, @@ -15,14 +15,14 @@ import { isRdfIri, isRdfBlank, isBlankBinding, -} from './sparqlModels'; +} from "./sparqlModels"; export const MAX_RECURSION_DEEP = 3; -export const ENCODED_PREFIX = 'sparql-blank:'; +export const ENCODED_PREFIX = "sparql-blank:"; export const BLANK_NODE_QUERY_PARAMETERS = - '?blankTrgProp ?blankTrg ?blankSrc ?blankSrcProp ?listHead'; + "?blankTrgProp ?blankTrg ?blankSrc ?blankSrcProp ?listHead"; export const BLANK_NODE_QUERY = ` OPTIONAL { @@ -71,6 +71,7 @@ export class QueryExecutor { } else { this.queryDictionary[query] = this.queryFunction(query).then( (response) => { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete this.queryDictionary[query]; return response; } @@ -85,8 +86,8 @@ export function updateFilterResults( queryFunction: (query: string) => Promise>, settings: SparqlDataProviderSettings ): Promise> { - const completeBindings: Array = []; - const blankBindings: Array = []; + const completeBindings: (ElementBinding & FilterBinding)[] = []; + const blankBindings: (BlankBinding & FilterBinding)[] = []; for (const binding of result.results.bindings) { if (isBlankBinding(binding)) { @@ -182,7 +183,7 @@ export function encodeId(blankBindings: BlankBinding[]): string { const bindingSet: Dictionary = {}; for (const binding of blankBindings) { // leave out instance unique ID - const { inst, ...exceptInst } = binding; + const { inst: _inst, ...exceptInst } = binding; const encodedBinding = JSON.stringify(exceptInst); bindingSet[encodedBinding] = exceptInst as BlankBinding; } @@ -202,30 +203,30 @@ export function decodeId(id: string): BlankBinding[] { const parsedBindings: BlankBinding[] = JSON.parse(decodeURI(clearId)); const bindings = parsedBindings.map((binding) => { // restore instance unique ID - binding.inst = { type: 'uri', value: id }; + binding.inst = { type: "uri", value: id }; return binding; }); return bindings; - } catch (error) { + } catch (_error) { /* silent */ return undefined; } } export function createLabelForBlankBinding(bn: BlankBinding): RdfLiteral { - if (bn.blankType.value === 'listHead') { + if (bn.blankType.value === "listHead") { return { - type: 'literal', - value: 'RDFList', - 'xml:lang': '', + type: "literal", + value: "RDFList", + "xml:lang": "", }; } else { return { - type: 'literal', + type: "literal", value: bn.class ? getUriLocalName(bn.class.value) || bn.class.value - : 'anonymous', - 'xml:lang': '', + : "anonymous", + "xml:lang": "", }; } } @@ -324,24 +325,24 @@ function getQueryForChain( // if blankNode has type 'listHead' then his target and targetProperty is artificial, // and we can't include this id in chain const trustableTrgProp = - index === 0 || blankNode.blankType.value !== 'listHead'; + index === 0 || blankNode.blankType.value !== "listHead"; const sourceId = - index > 0 ? '?inst' + (index - 1) : '<' + blankNode.blankSrc.value + '>'; + index > 0 ? "?inst" + (index - 1) : "<" + blankNode.blankSrc.value + ">"; const sourcePropId = trustableTrgProp ? index > 0 - ? '?blankTrgProp' + (index - 1) - : '<' + blankNode.blankSrcProp.value + '>' - : '?anyType' + index; + ? "?blankTrgProp" + (index - 1) + : "<" + blankNode.blankSrcProp.value + ">" + : "?anyType" + index; - const instPostfix = index === maxIndex ? '' : index.toString(); + const instPostfix = index === maxIndex ? "" : index.toString(); const targetPropId = trustableTrgProp - ? '<' + blankNode.blankTrgProp.value + '>' - : '?anyType0' + index; + ? "<" + blankNode.blankTrgProp.value + ">" + : "?anyType0" + index; const firstRelation = - index === 0 && blankNode.blankType.value === 'listHead' + index === 0 && blankNode.blankType.value === "listHead" ? ` ?blankSrc${index} rdf:rest*/rdf:first ?inst${instPostfix}. ` @@ -373,7 +374,7 @@ function getQueryForChain( const body = blankNodes .map((bn, index) => getQueryBlock(bn, index, blankNodes.length - 1)) - .join('\n'); + .join("\n"); const query = `${sparqlDataProviderSettings.defaultPrefix} SELECT ?inst ?class ?label ?blankTrgProp ?blankTrg ?blankType WHERE { @@ -443,7 +444,7 @@ export function filter(params: FilterParams): SparqlResponse { } export function getElementTypes( - elementIds: ReadonlyArray + elementIds: readonly string[] ): SparqlResponse { const bindings: ElementTypeBinding[] = []; for (const id of elementIds) { @@ -470,7 +471,7 @@ function getAllRelatedByLinkTypeElements( let bindings: ElementBinding[] = []; if (blankElements.length > 0) { for (const be of blankElements) { - if (linkDirection === 'in') { + if (linkDirection === "in") { if ( be.inst.value === refElementId && (isRdfIri(be.blankSrc) || isRdfBlank(be.blankSrc)) && @@ -604,7 +605,6 @@ function getLinkBinding(ids: string[]): LinkBinding[] { function getLinkCountBinding(id: string): LinkCountBinding[] { const blankElements = decodeId(id); - const bindings: LinkBinding[] = []; const dictionary: Dictionary = {}; for (const be of blankElements) { @@ -621,14 +621,14 @@ function getLinkCountBinding(id: string): LinkCountBinding[] { dictionary[be.blankSrcProp.value] = { link: be.blankSrcProp, inCount: { - type: 'literal', - value: '1', - 'xml:lang': '', + type: "literal", + value: "1", + "xml:lang": "", }, outCount: { - type: 'literal', - value: '0', - 'xml:lang': '', + type: "literal", + value: "0", + "xml:lang": "", }, }; } @@ -637,14 +637,14 @@ function getLinkCountBinding(id: string): LinkCountBinding[] { dictionary[be.blankTrgProp.value] = { link: be.blankTrgProp, inCount: { - type: 'literal', - value: '0', - 'xml:lang': '', + type: "literal", + value: "0", + "xml:lang": "", }, outCount: { - type: 'literal', - value: '1', - 'xml:lang': '', + type: "literal", + value: "1", + "xml:lang": "", }, }; } else { diff --git a/src/graph-explorer/data/sparql/graphBuilder.ts b/src/graph-explorer/data/sparql/graphBuilder.ts index 62ae4d44..e104e58a 100644 --- a/src/graph-explorer/data/sparql/graphBuilder.ts +++ b/src/graph-explorer/data/sparql/graphBuilder.ts @@ -1,13 +1,13 @@ -import { keyBy } from 'lodash'; +import { keyBy } from "lodash"; -import { GenerateID } from '../schema'; +import { GenerateID } from "../schema"; import { LayoutElement, LayoutLink, SerializedDiagram, makeSerializedDiagram, -} from '../../editor/serializedDiagram'; -import { uniformGrid } from '../../viewUtils/layout'; +} from "../../editor/serializedDiagram"; +import { uniformGrid } from "../../viewUtils/layout"; import { Dictionary, @@ -15,10 +15,10 @@ import { LinkModel, ElementIri, LinkTypeIri, -} from '../model'; -import { DataProvider } from '../provider'; -import { Triple } from './sparqlModels'; -import { parseTurtleText } from './turtle'; +} from "../model"; +import { DataProvider } from "../provider"; +import { Triple } from "./sparqlModels"; +import { parseTurtleText } from "./turtle"; const GREED_STEP = 150; @@ -40,9 +40,7 @@ export class GraphBuilder { })); } - getGraphFromRDFGraph( - graph: Triple[] - ): Promise<{ + getGraphFromRDFGraph(graph: Triple[]): Promise<{ preloadedElements: Dictionary; diagram: SerializedDiagram; }> { @@ -50,9 +48,7 @@ export class GraphBuilder { return this.createGraph({ elementIds, links }); } - getGraphFromTurtleGraph( - graph: string - ): Promise<{ + getGraphFromTurtleGraph(graph: string): Promise<{ preloadedElements: Dictionary; diagram: SerializedDiagram; }> { @@ -62,9 +58,7 @@ export class GraphBuilder { } } -export function makeGraphItems( - response: ReadonlyArray -): { +export function makeGraphItems(response: readonly Triple[]): { elementIds: ElementIri[]; links: LinkModel[]; } { @@ -72,15 +66,15 @@ export function makeGraphItems( const links: LinkModel[] = []; for (const { subject, predicate, object } of response) { - if (subject.type === 'uri' && !elements[subject.value]) { + if (subject.type === "uri" && !elements[subject.value]) { elements[subject.value] = true; } - if (object.type === 'uri' && !elements[object.value]) { + if (object.type === "uri" && !elements[object.value]) { elements[object.value] = true; } - if (subject.type === 'uri' && object.type === 'uri') { + if (subject.type === "uri" && object.type === "uri") { links.push({ linkTypeId: predicate.value as LinkTypeIri, sourceId: subject.value as ElementIri, @@ -92,8 +86,8 @@ export function makeGraphItems( } export function makeLayout( - elementsIds: ReadonlyArray, - linksInfo: ReadonlyArray + elementsIds: readonly ElementIri[], + linksInfo: readonly LinkModel[] ): SerializedDiagram { const rows = Math.ceil(Math.sqrt(elementsIds.length)); const grid = uniformGrid({ @@ -105,21 +99,21 @@ export function makeLayout( (id, index) => { const { x, y } = grid(index); return { - '@type': 'Element', - '@id': GenerateID.forElement(), + "@type": "Element", + "@id": GenerateID.forElement(), iri: id, position: { x, y }, }; } ); - const layoutElementsMap: { [iri: string]: LayoutElement } = keyBy( + const layoutElementsMap: Record = keyBy( elements, - 'iri' + "iri" ); const links: LayoutLink[] = []; - linksInfo.forEach((link, index) => { + linksInfo.forEach((link, _index) => { const source = layoutElementsMap[link.sourceId]; const target = layoutElementsMap[link.targetId]; @@ -128,15 +122,15 @@ export function makeLayout( } links.push({ - '@type': 'Link', - '@id': GenerateID.forLink(), + "@type": "Link", + "@id": GenerateID.forLink(), property: link.linkTypeId, - source: { '@id': source['@id'] }, - target: { '@id': target['@id'] }, + source: { "@id": source["@id"] }, + target: { "@id": target["@id"] }, }); }); return makeSerializedDiagram({ - layoutData: { '@type': 'Layout', elements, links }, + layoutData: { "@type": "Layout", elements, links }, linkTypeOptions: [], }); } diff --git a/src/graph-explorer/data/sparql/responseHandler.ts b/src/graph-explorer/data/sparql/responseHandler.ts index ecc43c99..d529a5ec 100644 --- a/src/graph-explorer/data/sparql/responseHandler.ts +++ b/src/graph-explorer/data/sparql/responseHandler.ts @@ -1,7 +1,7 @@ import { LinkConfiguration, PropertyConfiguration, -} from './sparqlDataProviderSettings'; +} from "./sparqlDataProviderSettings"; import { RdfLiteral, isRdfLiteral, @@ -19,7 +19,7 @@ import { ElementTypeBinding, FilterBinding, Triple, -} from './sparqlModels'; +} from "./sparqlModels"; import { Dictionary, LocalizedString, @@ -38,11 +38,11 @@ import { isLiteralProperty, sameLink, hashLink, -} from '../model'; -import { HashMap, getOrCreateSetInMap } from '../../viewUtils/collections'; +} from "../model"; +import { HashMap, getOrCreateSetInMap } from "../../viewUtils/collections"; -const LABEL_URI = 'http://www.w3.org/2000/01/rdf-schema#label'; -const RDF_TYPE_URI = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'; +const LABEL_URI = "http://www.w3.org/2000/01/rdf-schema#label"; +const RDF_TYPE_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"; const EMPTY_MAP: ReadonlyMap = new Map(); @@ -73,9 +73,9 @@ export function getClassTree( return tree; } -export function flattenClassTree(classTree: ReadonlyArray) { +export function flattenClassTree(classTree: readonly ClassModel[]) { const all: ClassModel[] = []; - const visitClasses = (classes: ReadonlyArray) => { + const visitClasses = (classes: readonly ClassModel[]) => { for (const model of classes) { all.push(model); visitClasses(model.children); @@ -187,7 +187,7 @@ function breakCyclesAndCalculateCounts(tree: ClassModel[]): ClassModel[] { export function getClassInfo( response: SparqlResponse ): ClassModel[] { - const classes: { [id: string]: ClassModel } = {}; + const classes: Record = {}; for (const binding of response.results.bindings) { if (!binding.class) { continue; @@ -213,7 +213,7 @@ export function getClassInfo( const classesList: ClassModel[] = []; for (const id in classes) { - if (!classes.hasOwnProperty(id)) { + if (!Object.prototype.hasOwnProperty.call(classes, id)) { continue; } const model = classes[id]; @@ -277,7 +277,7 @@ export function triplesToElementBinding( const map: Dictionary = {}; const convertedResponse: SparqlResponse = { head: { - vars: ['inst', 'class', 'label', 'blankType', 'propType', 'propValue'], + vars: ["inst", "class", "label", "blankType", "propType", "propValue"], }, results: { bindings: [], @@ -374,8 +374,8 @@ function mapPropertiesByConfig( modelTypes: ReadonlySet | undefined, propertyByPredicate: ReadonlyMap, openWorldProperties: boolean -): ElementModel['properties'] { - const mapped: ElementModel['properties'] = {}; +): ElementModel["properties"] { + const mapped: ElementModel["properties"] = {}; for (const propertyIri in model.properties) { if (!Object.hasOwnProperty.call(model.properties, propertyIri)) { continue; @@ -558,7 +558,7 @@ export function getFilteredData( if (!openWorldLinks && binding.link && binding.direction) { const predicates = - binding.direction.value === 'out' ? outPredicates : inPredicates; + binding.direction.value === "out" ? outPredicates : inPredicates; getOrCreateSetInMap(predicates, model.id).add(binding.link.value); } } @@ -579,6 +579,7 @@ export function getFilteredData( linkByPredicateType ); if (!doesMatchesDomain) { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete instancesMap[id]; } } @@ -623,7 +624,7 @@ export function isDirectProperty(property: PropertyConfiguration) { } function typeMatchesDomain( - config: { readonly domain?: ReadonlyArray }, + config: { readonly domain?: readonly string[] }, types: ReadonlySet | undefined ): boolean { if (!config.domain || config.domain.length === 0) { @@ -647,14 +648,14 @@ function typeMatchesDomain( * @param propValue */ function mergeProperties( - properties: { [id: string]: Property }, + properties: Record, propType: RdfIri, propValue: RdfIri | RdfLiteral ) { let property = properties[propType.value]; if (isRdfIri(propValue)) { if (!property) { - property = { type: 'uri', values: [] }; + property = { type: "uri", values: [] }; } if ( isIriProperty(property) && @@ -664,7 +665,7 @@ function mergeProperties( } } else if (isRdfLiteral(propValue)) { if (!property) { - property = { type: 'string', values: [] }; + property = { type: "string", values: [] }; } const propertyValue = getLocalizedString(propValue); if ( @@ -726,7 +727,7 @@ export function getLocalizedString( if (label) { return { value: label.value, - language: label['xml:lang'], + language: label["xml:lang"], datatype: label.datatype ? { value: label.datatype } : undefined, }; } else { diff --git a/src/graph-explorer/data/sparql/sparqlDataProvider.ts b/src/graph-explorer/data/sparql/sparqlDataProvider.ts index 9296f275..e881c95e 100644 --- a/src/graph-explorer/data/sparql/sparqlDataProvider.ts +++ b/src/graph-explorer/data/sparql/sparqlDataProvider.ts @@ -1,8 +1,8 @@ import { objectValues, getOrCreateArrayInMap, -} from '../../viewUtils/collections'; -import { DataProvider, LinkElementsParams, FilterParams } from '../provider'; +} from "../../viewUtils/collections"; +import { DataProvider, LinkElementsParams, FilterParams } from "../provider"; import { Dictionary, ClassModel, @@ -16,7 +16,7 @@ import { LinkTypeIri, PropertyTypeIri, LocalizedString, -} from '../model'; +} from "../model"; import { prependAdditionalBindings, enrichElementsWithImages, @@ -35,7 +35,7 @@ import { triplesToElementBinding, isDirectLink, isDirectProperty, -} from './responseHandler'; +} from "./responseHandler"; import { ClassBinding, ElementBinding, @@ -49,15 +49,15 @@ import { ElementTypeBinding, SparqlResponse, Triple, -} from './sparqlModels'; +} from "./sparqlModels"; import { SparqlDataProviderSettings, OWLStatsSettings, LinkConfiguration, PropertyConfiguration, -} from './sparqlDataProviderSettings'; -import * as BlankNodes from './blankNodes'; -import { parseTurtleText } from './turtle'; +} from "./sparqlDataProviderSettings"; +import * as BlankNodes from "./blankNodes"; +import { parseTurtleText } from "./turtle"; export enum SparqlQueryMethod { GET = 1, @@ -67,7 +67,7 @@ export enum SparqlQueryMethod { export type QueryFunction = (params: { url: string; body?: string; - headers: { [header: string]: string }; + headers: Record; method: string; }) => Promise; @@ -161,11 +161,8 @@ export class SparqlDataProvider implements DataProvider { } async classTree(): Promise { - const { - defaultPrefix, - schemaLabelProperty, - classTreeQuery, - } = this.settings; + const { defaultPrefix, schemaLabelProperty, classTreeQuery } = + this.settings; if (!classTreeQuery) { return []; } @@ -191,18 +188,15 @@ export class SparqlDataProvider implements DataProvider { async propertyInfo(params: { propertyIds: PropertyTypeIri[]; }): Promise> { - const { - defaultPrefix, - schemaLabelProperty, - propertyInfoQuery, - } = this.settings; + const { defaultPrefix, schemaLabelProperty, propertyInfoQuery } = + this.settings; let properties: Dictionary; if (propertyInfoQuery) { const ids = params.propertyIds .map(escapeIri) .map((id) => ` ( ${id} )`) - .join(' '); + .join(" "); const query = defaultPrefix + resolveTemplate(propertyInfoQuery, { @@ -228,18 +222,15 @@ export class SparqlDataProvider implements DataProvider { async classInfo(params: { classIds: ElementTypeIri[]; }): Promise { - const { - defaultPrefix, - schemaLabelProperty, - classInfoQuery, - } = this.settings; + const { defaultPrefix, schemaLabelProperty, classInfoQuery } = + this.settings; let classes: ClassModel[]; if (classInfoQuery) { const ids = params.classIds .map(escapeIri) .map((id) => ` ( ${id} )`) - .join(' '); + .join(" "); const query = defaultPrefix + resolveTemplate(classInfoQuery, { @@ -264,18 +255,15 @@ export class SparqlDataProvider implements DataProvider { async linkTypesInfo(params: { linkTypeIds: LinkTypeIri[]; }): Promise { - const { - defaultPrefix, - schemaLabelProperty, - linkTypesInfoQuery, - } = this.settings; + const { defaultPrefix, schemaLabelProperty, linkTypesInfoQuery } = + this.settings; let linkTypes: LinkType[]; if (linkTypesInfoQuery) { const ids = params.linkTypeIds .map(escapeIri) .map((id) => ` ( ${id} )`) - .join(' '); + .join(" "); const query = defaultPrefix + resolveTemplate(linkTypesInfoQuery, { @@ -339,12 +327,9 @@ export class SparqlDataProvider implements DataProvider { const ids = nonBlankResources .map(escapeIri) .map((id) => ` (${id})`) - .join(' '); - const { - defaultPrefix, - dataLabelProperty, - elementInfoQuery, - } = this.settings; + .join(" "); + const { defaultPrefix, dataLabelProperty, elementInfoQuery } = + this.settings; const query = defaultPrefix + resolveTemplate(elementInfoQuery, { @@ -400,11 +385,11 @@ export class SparqlDataProvider implements DataProvider { .filter((id) => !BlankNodes.isEncodedBlank(id)) .map(escapeIri) .map((id) => ` ( ${id} )`) - .join(' '); + .join(" "); const typesString = types .map(escapeIri) .map((id) => ` ( ${id} )`) - .join(' '); + .join(" "); const query = this.settings.defaultPrefix + @@ -422,7 +407,6 @@ export class SparqlDataProvider implements DataProvider { ); enrichElementsWithImages(bindings, elementsInfo); } catch (err) { - // tslint:disable-next-line:no-console console.error(err); } } @@ -446,7 +430,7 @@ export class SparqlDataProvider implements DataProvider { const ids = nonBlankResources .map(escapeIri) .map((id) => ` ( ${id} )`) - .join(' '); + .join(" "); const linksInfoQuery = this.settings.defaultPrefix + resolveTemplate(this.settings.linksInfoQuery, { @@ -495,8 +479,8 @@ export class SparqlDataProvider implements DataProvider { params.elementId, undefined, undefined, - '?outObject', - '?inObject', + "?outObject", + "?inObject", false ); if (forAll.usePredicatePart) { @@ -508,7 +492,7 @@ export class SparqlDataProvider implements DataProvider { defaultPrefix + resolveTemplate(linkTypesOfQuery, { elementIri, - linkConfigurations: forAll.unionParts.join('\nUNION\n'), + linkConfigurations: forAll.unionParts.join("\nUNION\n"), }); const linkTypeBindings = await this.executeSparqlQuery( @@ -544,11 +528,11 @@ export class SparqlDataProvider implements DataProvider { linkConfigurationOut = this.formatLinkPath( linkConfig.path, elementIri, - '?outObject' + "?outObject" ); linkConfigurationIn = this.formatLinkPath( linkConfig.path, - '?inObject', + "?inObject", elementIri ); } @@ -556,14 +540,14 @@ export class SparqlDataProvider implements DataProvider { if (linkConfig && linkConfig.domain?.length > 0) { const commaSeparatedDomains = linkConfig.domain .map(escapeIri) - .join(', '); + .join(", "); const restrictionOut = filterTypePattern.replace( /[?$]inst\b/g, elementIri ); const restrictionIn = filterTypePattern.replace( /[?$]inst\b/g, - '?inObject' + "?inObject" ); linkConfigurationOut += ` { ${restrictionOut} FILTER(?class IN (${commaSeparatedDomains})) }`; linkConfigurationIn += ` { ${restrictionIn} FILTER(?class IN (${commaSeparatedDomains})) }`; @@ -600,7 +584,7 @@ export class SparqlDataProvider implements DataProvider { linkDirection: params.direction, limit: params.limit, offset: params.offset, - languageCode: '', + languageCode: "", }); } @@ -667,18 +651,18 @@ export class SparqlDataProvider implements DataProvider { private createFilterQuery(params: FilterParams): string { if (!params.refElementId && params.refElementLinkId) { throw new Error( - 'Cannot execute refElementLink filter without refElement' + "Cannot execute refElementLink filter without refElement" ); } - let outerProjection = '?inst ?class ?label ?blankType'; - let innerProjection = '?inst'; + let outerProjection = "?inst ?class ?label ?blankType"; + let innerProjection = "?inst"; - let refQueryPart = ''; - let refQueryTypes = ''; + let refQueryPart = ""; + let refQueryTypes = ""; if (params.refElementId) { - outerProjection += ' ?link ?direction'; - innerProjection += ' ?link ?direction'; + outerProjection += " ?link ?direction"; + innerProjection += " ?link ?direction"; refQueryPart = this.createRefQueryPart({ elementId: params.refElementId, linkId: params.refElementLinkId, @@ -686,31 +670,31 @@ export class SparqlDataProvider implements DataProvider { }); if (this.settings.linkConfigurations.length > 0) { - outerProjection += ' ?classAll'; + outerProjection += " ?classAll"; refQueryTypes = this.settings.filterTypePattern.replace( /[?$]class\b/g, - '?classAll' + "?classAll" ); } } - let elementTypePart = ''; + let elementTypePart = ""; if (params.elementTypeId) { const elementTypeIri = escapeIri(params.elementTypeId); elementTypePart = this.settings.filterTypePattern.replace( /[?$]class\b/g, elementTypeIri ); - elementTypePart += ' .'; + elementTypePart += " ."; } const { defaultPrefix, fullTextSearch, dataLabelProperty } = this.settings; - let textSearchPart = ''; + let textSearchPart = ""; if (params.text) { - innerProjection += ' ?score'; + innerProjection += " ?score"; if (this.settings.fullTextSearch.extractLabel) { - textSearchPart += sparqlExtractLabel('?inst', '?extractedLabel'); + textSearchPart += sparqlExtractLabel("?inst", "?extractedLabel"); } textSearchPart = resolveTemplate(fullTextSearch.queryPattern, { text: params.text, @@ -730,21 +714,21 @@ export class SparqlDataProvider implements DataProvider { WHERE { { SELECT DISTINCT ${innerProjection} WHERE { - ${fullTextSearch.elementFirst ? '' : textSearchPart} + ${fullTextSearch.elementFirst ? "" : textSearchPart} ${elementTypePart} ${refQueryPart} - ${fullTextSearch.elementFirst ? textSearchPart : ''} + ${fullTextSearch.elementFirst ? textSearchPart : ""} ${this.settings.filterAdditionalRestriction} } - ${textSearchPart ? 'ORDER BY DESC(?score)' : ''} + ${textSearchPart ? "ORDER BY DESC(?score)" : ""} LIMIT ${params.limit} OFFSET ${params.offset} } ${refQueryTypes} ${resolveTemplate(this.settings.filterElementInfoPattern, { dataLabelProperty, })} - ${blankNodes ? BlankNodes.BLANK_NODE_QUERY : ''} - } ${textSearchPart ? 'ORDER BY DESC(?score)' : ''} + ${blankNodes ? BlankNodes.BLANK_NODE_QUERY : ""} + } ${textSearchPart ? "ORDER BY DESC(?score)" : ""} `; } @@ -775,7 +759,7 @@ export class SparqlDataProvider implements DataProvider { protected createRefQueryPart(params: { elementId: ElementIri; linkId?: LinkTypeIri; - direction?: 'in' | 'out'; + direction?: "in" | "out"; }) { const { elementId, linkId, direction } = params; @@ -783,8 +767,8 @@ export class SparqlDataProvider implements DataProvider { elementId, linkId, direction, - '?inst', - '?inst', + "?inst", + "?inst", true ); @@ -797,19 +781,19 @@ export class SparqlDataProvider implements DataProvider { link && isDirectLink(link) ? escapeIri(link.path) : escapeIri(linkId); } - const linkPattern = refLinkType || '?link'; - const bindType = refLinkType ? `BIND(${refLinkType} as ?link)` : ''; + const linkPattern = refLinkType || "?link"; + const bindType = refLinkType ? `BIND(${refLinkType} as ?link)` : ""; // FILTER ISIRI is used to prevent blank nodes appearing in results const blankFilter = this.options.acceptBlankNodes - ? 'FILTER(isIri(?inst) || isBlank(?inst))' - : 'FILTER(isIri(?inst))'; + ? "FILTER(isIri(?inst) || isBlank(?inst))" + : "FILTER(isIri(?inst))"; - if (!direction || direction === 'out') { + if (!direction || direction === "out") { unionParts.push( `{ ${refElementIRI} ${linkPattern} ?inst BIND("out" as ?direction) ${bindType} ${blankFilter} }` ); } - if (!direction || direction === 'in') { + if (!direction || direction === "in") { unionParts.push( `{ ?inst ${linkPattern} ${refElementIRI} BIND("in" as ?direction) ${bindType} ${blankFilter} }` ); @@ -817,7 +801,7 @@ export class SparqlDataProvider implements DataProvider { } let resultPattern = - unionParts.length === 0 ? 'FILTER(false)' : unionParts.join(`\nUNION\n`); + unionParts.length === 0 ? "FILTER(false)" : unionParts.join(`\nUNION\n`); const useAllLinksPattern = !linkId && this.settings.filterRefElementLinkPattern.length > 0; @@ -831,7 +815,7 @@ export class SparqlDataProvider implements DataProvider { private formatLinkUnion( refElementIri: ElementIri, linkIri: LinkTypeIri | undefined, - direction: 'in' | 'out' | undefined, + direction: "in" | "out" | undefined, outElementVar: string, inElementVar: string, bindDirection: boolean @@ -850,20 +834,20 @@ export class SparqlDataProvider implements DataProvider { hasDirectLink = true; } else { const linkType = escapeIri(link.id); - if (!direction || direction === 'out') { + if (!direction || direction === "out") { const path = this.formatLinkPath(link.path, fixedIri, outElementVar); const boundedDirection = bindDirection ? `BIND("out" as ?direction) ` - : ''; + : ""; unionParts.push( `{ ${path} BIND(${linkType} as ?link) ${boundedDirection}}` ); } - if (!direction || direction === 'in') { + if (!direction || direction === "in") { const path = this.formatLinkPath(link.path, inElementVar, fixedIri); const boundedDirection = bindDirection ? `BIND("in" as ?direction) ` - : ''; + : ""; unionParts.push( `{ ${path} BIND(${linkType} as ?link) ${boundedDirection}}` ); @@ -886,8 +870,8 @@ export class SparqlDataProvider implements DataProvider { unionParts.push( `{ ${this.formatLinkPath( link.path, - '?source', - '?target' + "?source", + "?target" )} BIND(${linkType} as ?type) }` ); } @@ -898,7 +882,7 @@ export class SparqlDataProvider implements DataProvider { unionParts.push(`{ ?source ?type ?target }`); } - return unionParts.join('\nUNION\n'); + return unionParts.join("\nUNION\n"); } formatLinkPath(path: string, source: string, target: string): string { @@ -917,8 +901,8 @@ export class SparqlDataProvider implements DataProvider { const propType = escapeIri(property.id); const formatted = this.formatPropertyPath( property.path, - '?inst', - '?propValue' + "?inst", + "?propValue" ); unionParts.push(`{ ${formatted} BIND(${propType} as ?propType) }`); } @@ -929,7 +913,7 @@ export class SparqlDataProvider implements DataProvider { unionParts.push(`{ ?inst ?propType ?propValue }`); } - return unionParts.join('\nUNION\n'); + return unionParts.join("\nUNION\n"); } formatPropertyPath(path: string, subject: string, value: string): string { @@ -944,7 +928,7 @@ export class SparqlDataProvider implements DataProvider { } private async queryManyElementTypes( - elements: ReadonlyArray + elements: readonly ElementIri[] ): Promise>> { if (elements.length === 0) { return new Map(); @@ -953,9 +937,11 @@ export class SparqlDataProvider implements DataProvider { const ids = elements .filter((iri) => !BlankNodes.isEncodedBlank(iri)) .map((iri) => `(${escapeIri(iri)})`) - .join(' '); + .join(" "); - const queryTemplate = this.settings.defaultPrefix + `SELECT ?inst ?class { VALUES(?inst) { \${ids} } \${filterTypePattern} }`; + const queryTemplate = + this.settings.defaultPrefix + + `SELECT ?inst ?class { VALUES(?inst) { \${ids} } \${filterTypePattern} }`; const query = resolveTemplate(queryTemplate, { ids, filterTypePattern }); let response = await this.executeSparqlQuery(query); @@ -977,8 +963,8 @@ interface LabeledItem { } async function attachLabels( - items: ReadonlyArray, - fetchLabels: SparqlDataProviderOptions['prepareLabels'] + items: readonly LabeledItem[], + fetchLabels: SparqlDataProviderOptions["prepareLabels"] ): Promise { const resources = new Set(); for (const item of items) { @@ -996,7 +982,7 @@ async function attachLabels( } function prepareElementImages( - fetchImages: SparqlDataProviderOptions['prepareImages'], + fetchImages: SparqlDataProviderOptions["prepareImages"], elementsInfo: Dictionary ): Promise { return fetchImages(elementsInfo).then((images) => { @@ -1014,13 +1000,13 @@ function prepareElementImages( function resolveTemplate(template: string, values: Dictionary) { let result = template; for (const replaceKey in values) { - if (!values.hasOwnProperty(replaceKey)) { + if (!Object.prototype.hasOwnProperty.call(values, replaceKey)) { continue; } const replaceValue = values[replaceKey]; if (replaceValue) { result = result.replace( - new RegExp('\\${' + replaceKey + '}', 'g'), + new RegExp("\\${" + replaceKey + "}", "g"), replaceValue ); } @@ -1039,32 +1025,30 @@ export function executeSparqlQuery( internalQuery = queryFunction({ url: appendQueryParams(endpoint, { query }), headers: { - Accept: 'application/sparql-results+json', + Accept: "application/sparql-results+json", }, - method: 'GET', + method: "GET", }); } else { internalQuery = queryFunction({ url: endpoint, body: query, headers: { - Accept: 'application/sparql-results+json', - 'Content-Type': 'application/sparql-query; charset=UTF-8', + Accept: "application/sparql-results+json", + "Content-Type": "application/sparql-query; charset=UTF-8", }, - method: 'POST', + method: "POST", }); } - return internalQuery.then( - (response): Promise> => { - if (response.ok) { - return response.json(); - } else { - const error = new Error(response.statusText); - (error as any).response = response; - throw error; - } + return internalQuery.then((response): Promise> => { + if (response.ok) { + return response.json(); + } else { + const error = new Error(response.statusText); + (error as any).response = response; + throw error; } - ); + }); } export function executeSparqlConstruct( @@ -1078,19 +1062,19 @@ export function executeSparqlConstruct( internalQuery = queryFunction({ url: appendQueryParams(endpoint, { query }), headers: { - Accept: 'text/turtle', + Accept: "text/turtle", }, - method: 'GET', + method: "GET", }); } else { internalQuery = queryFunction({ url: endpoint, body: query, headers: { - Accept: 'text/turtle', - 'Content-Type': 'application/sparql-query; charset=UTF-8', + Accept: "text/turtle", + "Content-Type": "application/sparql-query; charset=UTF-8", }, - method: 'POST', + method: "POST", }); } return internalQuery @@ -1108,14 +1092,14 @@ export function executeSparqlConstruct( function appendQueryParams( endpoint: string, - queryParams: { [key: string]: string } = {} + queryParams: Record = {} ) { - const initialSeparator = endpoint.indexOf('?') < 0 ? '?' : '&'; + const initialSeparator = endpoint.indexOf("?") < 0 ? "?" : "&"; const additionalParams = initialSeparator + Object.keys(queryParams) .map((key) => `${key}=${encodeURIComponent(queryParams[key])}`) - .join('&'); + .join("&"); return endpoint + additionalParams; } @@ -1128,9 +1112,9 @@ function queryInternal(params: { return fetch(params.url, { method: params.method, body: params.body, - credentials: 'same-origin', - mode: 'cors', - cache: 'default', + credentials: "same-origin", + mode: "cors", + cache: "default", headers: params.headers, }); } @@ -1149,7 +1133,7 @@ function sparqlExtractLabel(subject: string, label: string): string { } function escapeIri(iri: string) { - if (typeof iri !== 'string') { + if (typeof iri !== "string") { throw new Error(`Cannot escape IRI of type "${typeof iri}"`); } return `<${iri}>`; diff --git a/src/graph-explorer/data/sparql/sparqlDataProviderSettings.ts b/src/graph-explorer/data/sparql/sparqlDataProviderSettings.ts index ea10a852..be663f57 100644 --- a/src/graph-explorer/data/sparql/sparqlDataProviderSettings.ts +++ b/src/graph-explorer/data/sparql/sparqlDataProviderSettings.ts @@ -272,7 +272,7 @@ export interface LinkConfiguration { * Optional domain constraint for source element of the link. * If specified checks RDF type of source element to match one from this set. */ - domain?: ReadonlyArray; + domain?: readonly string[]; /** * SPARQL predicate or pattern connecting source element to target element. @@ -320,7 +320,7 @@ export interface PropertyConfiguration { * Optional domain constraint for source element of the property. * If specified checks RDF type of source element to match one from this set. */ - domain?: ReadonlyArray; + domain?: readonly string[]; /** * SPARQL predicate or pattern connecting source element to property value. @@ -354,13 +354,13 @@ export const RDFSettings: SparqlDataProviderSettings = { VALUES (?target) {\${ids}} }`, - defaultPrefix: '', + defaultPrefix: "", - schemaLabelProperty: 'rdfs:label', - dataLabelProperty: 'rdfs:label', + schemaLabelProperty: "rdfs:label", + dataLabelProperty: "rdfs:label", fullTextSearch: { - prefix: '', + prefix: "", queryPattern: ``, elementFirst: false, }, @@ -395,7 +395,7 @@ export const RDFSettings: SparqlDataProviderSettings = { linkTypesOfQuery: ``, linkTypesStatisticsQuery: ``, - filterRefElementLinkPattern: '', + filterRefElementLinkPattern: "", filterTypePattern: ``, filterAdditionalRestriction: ``, filterElementInfoPattern: ``, @@ -410,11 +410,11 @@ const WikidataSettingsOverride: Partial = { `, - schemaLabelProperty: 'rdfs:label', - dataLabelProperty: 'rdfs:label', + schemaLabelProperty: "rdfs:label", + dataLabelProperty: "rdfs:label", fullTextSearch: { - prefix: 'PREFIX bds: ' + '\n', + prefix: "PREFIX bds: " + "\n", queryPattern: ` ?inst rdfs:label ?searchLabel. SERVICE bds:search { @@ -498,7 +498,7 @@ const WikidataSettingsOverride: Partial = { } `, filterRefElementLinkPattern: - '?claim ?link .', + "?claim ?link .", filterTypePattern: `?inst wdt:P31 ?instType. ?instType wdt:P279* ?class`, filterAdditionalRestriction: `FILTER ISIRI(?inst) BIND(STR(?inst) as ?strInst) @@ -520,10 +520,10 @@ export const OWLRDFSSettingsOverride: Partial = { PREFIX rdf: PREFIX owl: `, - schemaLabelProperty: 'rdfs:label', - dataLabelProperty: 'rdfs:label', + schemaLabelProperty: "rdfs:label", + dataLabelProperty: "rdfs:label", fullTextSearch: { - prefix: '', + prefix: "", queryPattern: ` OPTIONAL {?inst \${dataLabelProperty} ?search1} FILTER regex(COALESCE(str(?search1), str(?extractedLabel)), "\${text}", "i") BIND(0 as ?score) @@ -589,12 +589,12 @@ export const OWLRDFSSettingsOverride: Partial = { } } `, - filterRefElementLinkPattern: '', + filterRefElementLinkPattern: "", filterTypePattern: `?inst a ?instType. ?instType rdfs:subClassOf* ?class`, filterElementInfoPattern: `OPTIONAL {?inst rdf:type ?foundClass} BIND (coalesce(?foundClass, owl:Thing) as ?class) OPTIONAL {?inst \${dataLabelProperty} ?label}`, - filterAdditionalRestriction: '', + filterAdditionalRestriction: "", }; export const OWLRDFSSettings: SparqlDataProviderSettings = { @@ -628,7 +628,7 @@ export const OWLStatsSettings: SparqlDataProviderSettings = { const DBPediaOverride: Partial = { fullTextSearch: { - prefix: 'PREFIX dbo: \n', + prefix: "PREFIX dbo: \n", queryPattern: ` ?inst rdfs:label ?searchLabel. ?searchLabel bif:contains "\${text}". diff --git a/src/graph-explorer/data/sparql/sparqlGraphBuilder.ts b/src/graph-explorer/data/sparql/sparqlGraphBuilder.ts index 8dbdffe5..5a246ba8 100644 --- a/src/graph-explorer/data/sparql/sparqlGraphBuilder.ts +++ b/src/graph-explorer/data/sparql/sparqlGraphBuilder.ts @@ -1,14 +1,14 @@ -import { LayoutData, SerializedDiagram } from '../../editor/serializedDiagram'; +import { SerializedDiagram } from "../../editor/serializedDiagram"; -import { Dictionary, ElementModel } from '../model'; +import { Dictionary, ElementModel } from "../model"; -import { GraphBuilder } from './graphBuilder'; -import { SparqlDataProvider } from './sparqlDataProvider'; +import { GraphBuilder } from "./graphBuilder"; +import { SparqlDataProvider } from "./sparqlDataProvider"; const DEFAULT_PREFIX = `PREFIX rdfs: PREFIX rdf: - PREFIX owl: ` + '\n\n'; + PREFIX owl: ` + "\n\n"; export class SparqlGraphBuilder { graphBuilder: GraphBuilder; @@ -17,9 +17,7 @@ export class SparqlGraphBuilder { this.graphBuilder = new GraphBuilder(dataProvider); } - getGraphFromConstruct( - constructQuery: string - ): Promise<{ + getGraphFromConstruct(constructQuery: string): Promise<{ preloadedElements: Dictionary; diagram: SerializedDiagram; }> { diff --git a/src/graph-explorer/data/sparql/sparqlModels.ts b/src/graph-explorer/data/sparql/sparqlModels.ts index 1dd67e97..4b31355f 100644 --- a/src/graph-explorer/data/sparql/sparqlModels.ts +++ b/src/graph-explorer/data/sparql/sparqlModels.ts @@ -1,20 +1,20 @@ export type RdfNode = RdfIri | RdfLiteral | RdfBlank; export interface RdfIri { - type: 'uri'; + type: "uri"; value: string; } export interface RdfBlank { - type: 'bnode'; + type: "bnode"; value: string; } export interface RdfLiteral { - type: 'literal'; + type: "literal"; value: string; datatype?: string; - 'xml:lang': string; + "xml:lang": string; } export interface Triple { @@ -24,20 +24,20 @@ export interface Triple { } export function isRdfBlank(e: RdfNode): e is RdfBlank { - return e && e.type === 'bnode'; + return e && e.type === "bnode"; } export function isRdfIri(e: RdfNode): e is RdfIri { - return e && e.type === 'uri'; + return e && e.type === "uri"; } export function isRdfLiteral(e: RdfNode): e is RdfLiteral { - return e && e.type === 'literal'; + return e && e.type === "literal"; } export interface BlankBinding extends ElementBinding { blankType: { - value: 'listHead' | 'blankNode'; + value: "listHead" | "blankNode"; }; blankTrgProp: RdfNode; blankTrg: RdfNode; diff --git a/src/graph-explorer/data/sparql/turtle.ts b/src/graph-explorer/data/sparql/turtle.ts index 1390b848..a0615aa7 100644 --- a/src/graph-explorer/data/sparql/turtle.ts +++ b/src/graph-explorer/data/sparql/turtle.ts @@ -1,12 +1,12 @@ -import * as N3 from 'n3'; +import * as N3 from "n3"; import * as RDF from "@rdfjs/types"; -import { RdfNode, Triple } from './sparqlModels'; +import { RdfNode, Triple } from "./sparqlModels"; export function parseTurtleText(turtleText: string): Promise { return new Promise((resolve, reject) => { const triples: Triple[] = []; - new N3.Parser().parse(turtleText, (error, triple, hash) => { + new N3.Parser().parse(turtleText, (error, triple, _hash) => { if (error) { reject(error); } else if (triple) { @@ -22,16 +22,16 @@ export function parseTurtleText(turtleText: string): Promise { }); } -export function n3toRdfNode(entity:RDF.Term): RdfNode { +export function n3toRdfNode(entity: RDF.Term): RdfNode { if (N3.Util.isLiteral(entity)) { const literal = entity as RDF.Literal; return { - type: 'literal', + type: "literal", value: literal.value, datatype: literal.datatype.value, - 'xml:lang': literal.language + "xml:lang": literal.language, }; } else { - return { type: 'uri', value: entity.value }; + return { type: "uri", value: entity.value }; } } diff --git a/src/graph-explorer/data/utils.ts b/src/graph-explorer/data/utils.ts index df0ac6c4..01bc49e8 100644 --- a/src/graph-explorer/data/utils.ts +++ b/src/graph-explorer/data/utils.ts @@ -24,7 +24,6 @@ export function generate128BitID() { * @returns {integer} */ export function hashFnv32a(str: string, seed = 0x811c9dc5): number { - /* tslint:disable:no-bitwise */ let i: number, l: number, hval = seed & 0x7fffffff; @@ -35,19 +34,18 @@ export function hashFnv32a(str: string, seed = 0x811c9dc5): number { (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); } return hval >>> 0; - /* tslint:enable:no-bitwise */ } /** * Extracts local name for URI the same way as it's done in RDF4J. */ export function getUriLocalName(uri: string): string | undefined { - let index = uri.indexOf('#'); + let index = uri.indexOf("#"); if (index < 0) { - index = uri.lastIndexOf('/'); + index = uri.lastIndexOf("/"); } if (index < 0) { - index = uri.lastIndexOf(':'); + index = uri.lastIndexOf(":"); } if (index < 0) { return undefined; diff --git a/src/graph-explorer/data/validationApi.ts b/src/graph-explorer/data/validationApi.ts index d03fbab6..eb70eeda 100644 --- a/src/graph-explorer/data/validationApi.ts +++ b/src/graph-explorer/data/validationApi.ts @@ -1,25 +1,25 @@ -import { DiagramModel } from '../diagram/model'; -import { AuthoringState } from '../editor/authoringState'; -import { CancellationToken } from '../viewUtils/async'; +import { DiagramModel } from "../diagram/model"; +import { AuthoringState } from "../editor/authoringState"; +import { CancellationToken } from "../viewUtils/async"; -import { ElementModel, LinkModel, ElementIri, PropertyTypeIri } from './model'; +import { ElementModel, LinkModel, ElementIri, PropertyTypeIri } from "./model"; export interface ElementError { - readonly type: 'element'; + readonly type: "element"; readonly target: ElementIri; readonly message: string; readonly propertyType?: PropertyTypeIri; } export interface LinkError { - readonly type: 'link'; + readonly type: "link"; readonly target: LinkModel; readonly message: string; } export interface ValidationEvent { readonly target: ElementModel; - readonly outboundLinks: ReadonlyArray; + readonly outboundLinks: readonly LinkModel[]; readonly model: DiagramModel; readonly state: AuthoringState; readonly cancellation: CancellationToken; @@ -29,5 +29,5 @@ export interface ValidationApi { /** * Validate element and its outbound links. */ - validate(e: ValidationEvent): Promise>; + validate(e: ValidationEvent): Promise<(ElementError | LinkError)[]>; } diff --git a/src/graph-explorer/diagram/commands.ts b/src/graph-explorer/diagram/commands.ts index b9666563..dbd713c5 100644 --- a/src/graph-explorer/diagram/commands.ts +++ b/src/graph-explorer/diagram/commands.ts @@ -1,19 +1,19 @@ -import { ElementModel, ElementIri, LinkModel, sameLink } from '../data/model'; +import { ElementModel, ElementIri, LinkModel, sameLink } from "../data/model"; -import { Element, Link, FatLinkType, Cell, LinkVertex } from './elements'; -import { Vector, isPolylineEqual } from './geometry'; -import { Command } from './history'; -import { DiagramModel } from './model'; +import { Element, Link, FatLinkType } from "./elements"; +import { Vector, isPolylineEqual } from "./geometry"; +import { Command } from "./history"; +import { DiagramModel } from "./model"; export class RestoreGeometry implements Command { - readonly title = 'Move elements and links'; + readonly title = "Move elements and links"; constructor( - private elementState: ReadonlyArray<{ element: Element; position: Vector }>, - private linkState: ReadonlyArray<{ + private elementState: readonly { element: Element; position: Vector }[], + private linkState: readonly { link: Link; - vertices: ReadonlyArray; - }> + vertices: readonly Vector[]; + }[] ) {} static capture(model: DiagramModel) { @@ -21,8 +21,8 @@ export class RestoreGeometry implements Command { } private static captureElementsAndLinks( - elements: ReadonlyArray, - links: ReadonlyArray + elements: readonly Element[], + links: readonly Link[] ) { return new RestoreGeometry( elements.map((element) => ({ element, position: element.position })), @@ -65,7 +65,7 @@ export class RestoreGeometry implements Command { export function restoreCapturedLinkGeometry(link: Link): Command { const vertices = link.vertices; - return Command.create('Change link vertices', () => { + return Command.create("Change link vertices", () => { const capturedInverse = restoreCapturedLinkGeometry(link); link.setVertices(vertices); return capturedInverse; @@ -76,7 +76,7 @@ export function setElementExpanded( element: Element, expanded: boolean ): Command { - const title = expanded ? 'Expand element' : 'Collapse element'; + const title = expanded ? "Expand element" : "Collapse element"; return Command.create(title, () => { element.setExpanded(expanded); return setElementExpanded(element, !expanded); @@ -90,7 +90,7 @@ export function changeLinkTypeVisibility(params: { preventLoading?: boolean; }): Command { const { linkType, visible, showLabel, preventLoading } = params; - return Command.create('Change link type visibility', () => { + return Command.create("Change link type visibility", () => { const previousVisible = linkType.visible; const previousShowLabel = linkType.showLabel; linkType.setVisibility({ visible, showLabel, preventLoading }); @@ -110,7 +110,7 @@ export function setElementData( ): Command { const elements = model.elements.filter((el) => el.iri === target); const previous = elements.length > 0 ? elements[0].data : undefined; - return Command.create('Set element data', () => { + return Command.create("Set element data", () => { for (const element of model.elements.filter((el) => el.iri === target)) { element.setData(data); } @@ -125,10 +125,10 @@ export function setLinkData( ): Command { if (!sameLink(oldData, newData)) { throw new Error( - 'Cannot change typeId, sourceId or targetId when changing link data' + "Cannot change typeId, sourceId or targetId when changing link data" ); } - return Command.create('Set link data', () => { + return Command.create("Set link data", () => { for (const link of model.links) { if (sameLink(link.data, oldData)) { link.setData(newData); diff --git a/src/graph-explorer/diagram/elementLayer.tsx b/src/graph-explorer/diagram/elementLayer.tsx index d5cfe6cd..4e6e6834 100644 --- a/src/graph-explorer/diagram/elementLayer.tsx +++ b/src/graph-explorer/diagram/elementLayer.tsx @@ -1,22 +1,21 @@ -/* eslint-disable react/no-find-dom-node */ -import * as React from 'react'; -import { findDOMNode } from 'react-dom'; -import { hcl } from 'd3-color'; - -import { Property, ElementTypeIri, PropertyTypeIri } from '../data/model'; -import { TemplateProps } from '../customization/props'; -import { Debouncer } from '../viewUtils/async'; -import { EventObserver } from '../viewUtils/events'; -import { PropTypes } from '../viewUtils/react'; +import * as React from "react"; +import { findDOMNode } from "react-dom"; +import { hcl } from "d3-color"; + +import { Property, ElementTypeIri, PropertyTypeIri } from "../data/model"; +import { TemplateProps } from "../customization/props"; +import { Debouncer } from "../viewUtils/async"; +import { EventObserver } from "../viewUtils/events"; +import { PropTypes } from "../viewUtils/react"; import { KeyedObserver, observeElementTypes, observeProperties, -} from '../viewUtils/keyedObserver'; +} from "../viewUtils/keyedObserver"; -import { setElementExpanded } from './commands'; -import { Element } from './elements'; -import { DiagramView, RenderingLayer, IriClickIntent } from './view'; +import { setElementExpanded } from "./commands"; +import { Element } from "./elements"; +import { DiagramView, RenderingLayer, IriClickIntent } from "./view"; export interface Props { view: DiagramView; @@ -34,14 +33,12 @@ interface ElementState { blurred: boolean; } -// tslint:disable:no-bitwise enum RedrawFlags { None = 0, Render = 1, RecomputeTemplate = 1 | 2, RecomputeBlurred = 1 | 4, } -// tslint:enable:no-bitwise interface RedrawBatch { requests: Map; @@ -129,7 +126,7 @@ export class ElementLayer extends React.Component { componentDidMount() { const { view } = this.props; - this.listener.listen(view.model.events, 'changeCells', (e) => { + this.listener.listen(view.model.events, "changeCells", (e) => { if (e.updateAll) { this.requestRedrawAll(RedrawFlags.None); } else { @@ -138,13 +135,13 @@ export class ElementLayer extends React.Component { } } }); - this.listener.listen(view.events, 'changeLanguage', () => { + this.listener.listen(view.events, "changeLanguage", () => { this.requestRedrawAll(RedrawFlags.RecomputeTemplate); }); - this.listener.listen(view.events, 'changeHighlight', () => { + this.listener.listen(view.events, "changeHighlight", () => { this.requestRedrawAll(RedrawFlags.RecomputeBlurred); }); - this.listener.listen(view.model.events, 'elementEvent', ({ data }) => { + this.listener.listen(view.model.events, "elementEvent", ({ data }) => { const invalidatesTemplate = data.changeData || data.changeExpanded || data.changeElementState; if (invalidatesTemplate) { @@ -158,7 +155,7 @@ export class ElementLayer extends React.Component { this.requestRedraw(invalidatesRender.source, RedrawFlags.Render); } }); - this.listener.listen(view.events, 'syncUpdate', ({ layer }) => { + this.listener.listen(view.events, "syncUpdate", ({ layer }) => { if (layer === RenderingLayer.Element) { this.delatedRedraw.runSynchronously(); } else if (layer === RenderingLayer.ElementSize) { @@ -189,7 +186,6 @@ export class ElementLayer extends React.Component { } private requestRedraw = (element: Element, request: RedrawFlags) => { - // tslint:disable:no-bitwise const flagsWithForAll = this.redrawBatch.forAll | request; if (flagsWithForAll === this.redrawBatch.forAll) { // forAll flags already include the request @@ -198,11 +194,9 @@ export class ElementLayer extends React.Component { const existing = this.redrawBatch.requests.get(element.id); this.redrawBatch.requests.set(element.id, existing | request); this.delatedRedraw.call(this.redrawElements); - // tslint:enable:no-bitwise }; private requestRedrawAll(request: RedrawFlags) { - // tslint:disable-next-line:no-bitwise this.redrawBatch.forAll |= request; this.delatedRedraw.call(this.redrawElements); } @@ -250,7 +244,6 @@ function applyRedrawRequests( const elementId = element.id; if (previous.has(elementId)) { let state = previous.get(elementId); - // tslint:disable:no-bitwise const request = (batch.requests.get(elementId) || RedrawFlags.None) | batch.forAll; if (request & RedrawFlags.Render) { @@ -270,7 +263,6 @@ function applyRedrawRequests( } computed.set(elementId, state); batch.requests.delete(elementId); - // tslint:enable:no-bitwise } else { computed.set(element.id, { element, @@ -344,19 +336,19 @@ class OverlayedElement extends React.Component { // if (angle) { transform += `rotate(${angle}deg)`; } const className = `graph-explorer-overlayed-element ${ - blurred ? 'graph-explorer-overlayed-element--blurred' : '' + blurred ? "graph-explorer-overlayed-element--blurred" : "" }`; return (
@@ -379,11 +371,11 @@ class OverlayedElement extends React.Component { }; private onClick = (e: React.MouseEvent) => { - if (e.target instanceof HTMLElement && e.target.localName === 'a') { + if (e.target instanceof HTMLElement && e.target.localName === "a") { const anchor = e.target as HTMLAnchorElement; const { view, state } = this.props; const clickIntent = - e.target.getAttribute('data-iri-click-intent') === + e.target.getAttribute("data-iri-click-intent") === IriClickIntent.OpenEntityIri ? IriClickIntent.OpenEntityIri : IriClickIntent.OpenOtherIri; @@ -405,7 +397,7 @@ class OverlayedElement extends React.Component { componentDidMount() { const { state, view } = this.props; - this.listener.listen(state.element.events, 'requestedFocus', () => { + this.listener.listen(state.element.events, "requestedFocus", () => { const element = findDOMNode(this) as HTMLElement; if (element) { element.focus(); @@ -413,12 +405,12 @@ class OverlayedElement extends React.Component { }); this.typesObserver = observeElementTypes( view.model, - 'changeLabel', + "changeLabel", this.rerenderTemplate ); this.propertiesObserver = observeProperties( view.model, - 'changeLabel', + "changeLabel", this.rerenderTemplate ); this.observeTypes(); @@ -485,7 +477,7 @@ function computeTemplateProps( const types = model.data.types.length > 0 ? view.getElementTypeString(model.data) - : 'Thing'; + : "Thing"; const label = view.formatLabel(model.data.label.values, model.iri); const { color, icon } = computeStyleFor(model, view); const propsAsList = computePropertyTable(model, view); @@ -508,7 +500,7 @@ function computeTemplateProps( function computePropertyTable( model: Element, view: DiagramView -): Array<{ id: string; name: string; property: Property }> { +): { id: string; name: string; property: Property }[] { if (!model.data.properties) { return []; } diff --git a/src/graph-explorer/diagram/elements.ts b/src/graph-explorer/diagram/elements.ts index c29c94ab..f8c7ef34 100644 --- a/src/graph-explorer/diagram/elements.ts +++ b/src/graph-explorer/diagram/elements.ts @@ -6,18 +6,18 @@ import { ElementTypeIri, LinkTypeIri, PropertyTypeIri, -} from '../data/model'; -import { GenerateID } from '../data/schema'; +} from "../data/model"; +import { GenerateID } from "../data/schema"; -import { EventSource, Events, PropertyChange } from '../viewUtils/events'; +import { EventSource, Events, PropertyChange } from "../viewUtils/events"; -import { Vector, Size, isPolylineEqual, Rect } from './geometry'; +import { Vector, Size, isPolylineEqual, Rect } from "./geometry"; export type Cell = Element | Link | LinkVertex; export enum LinkDirection { - in = 'in', - out = 'out', + in = "in", + out = "out", } export interface ElementEvents { @@ -32,7 +32,7 @@ export interface ElementEvents { requestedAddToFilter: { source: Element; linkType?: FatLinkType; - direction?: 'in' | 'out'; + direction?: "in" | "out"; }; requestedRedraw: { source: Element }; } @@ -97,7 +97,7 @@ export class Element { return; } this._data = value; - this.source.trigger('changeData', { source: this, previous }); + this.source.trigger("changeData", { source: this, previous }); updateLinksToReferByNewIri(this, previous.id, value.id); } @@ -111,7 +111,7 @@ export class Element { return; } this._position = value; - this.source.trigger('changePosition', { source: this, previous }); + this.source.trigger("changePosition", { source: this, previous }); } get size(): Size { @@ -125,7 +125,7 @@ export class Element { return; } this._size = value; - this.source.trigger('changeSize', { source: this, previous }); + this.source.trigger("changeSize", { source: this, previous }); } get isExpanded(): boolean { @@ -137,7 +137,7 @@ export class Element { return; } this._expanded = value; - this.source.trigger('changeExpanded', { source: this, previous }); + this.source.trigger("changeExpanded", { source: this, previous }); } get group(): string | undefined { @@ -149,7 +149,7 @@ export class Element { return; } this._group = value; - this.source.trigger('changeGroup', { source: this, previous }); + this.source.trigger("changeGroup", { source: this, previous }); } get elementState(): ElementTemplateState | undefined { @@ -161,7 +161,7 @@ export class Element { return; } this._elementState = value; - this.source.trigger('changeElementState', { source: this, previous }); + this.source.trigger("changeElementState", { source: this, previous }); } get temporary(): boolean { @@ -169,15 +169,15 @@ export class Element { } focus() { - this.source.trigger('requestedFocus', { source: this }); + this.source.trigger("requestedFocus", { source: this }); } requestGroupContent() { - this.source.trigger('requestedGroupContent', { source: this }); + this.source.trigger("requestedGroupContent", { source: this }); } - addToFilter(linkType?: FatLinkType, direction?: 'in' | 'out') { - this.source.trigger('requestedAddToFilter', { + addToFilter(linkType?: FatLinkType, direction?: "in" | "out") { + this.source.trigger("requestedAddToFilter", { source: this, linkType, direction, @@ -185,18 +185,16 @@ export class Element { } redraw() { - this.source.trigger('requestedRedraw', { source: this }); + this.source.trigger("requestedRedraw", { source: this }); } } -export interface ElementTemplateState { - [propertyIri: string]: any; -} +export type ElementTemplateState = Record; export interface AddToFilterRequest { element: Element; linkType?: FatLinkType; - direction?: 'in' | 'out'; + direction?: "in" | "out"; } function updateLinksToReferByNewIri( @@ -220,7 +218,7 @@ function updateLinksToReferByNewIri( } export interface FatClassModelEvents { - changeLabel: PropertyChange>; + changeLabel: PropertyChange; changeCount: PropertyChange; } @@ -230,12 +228,12 @@ export class FatClassModel { readonly id: ElementTypeIri; - private _label: ReadonlyArray; + private _label: readonly LocalizedString[]; private _count: number | undefined; constructor(props: { id: ElementTypeIri; - label?: ReadonlyArray; + label?: readonly LocalizedString[]; count?: number; }) { const { id, label = [], count } = props; @@ -247,13 +245,13 @@ export class FatClassModel { get label() { return this._label; } - setLabel(value: ReadonlyArray) { + setLabel(value: readonly LocalizedString[]) { const previous = this._label; if (previous === value) { return; } this._label = value; - this.source.trigger('changeLabel', { source: this, previous }); + this.source.trigger("changeLabel", { source: this, previous }); } get count() { @@ -265,12 +263,12 @@ export class FatClassModel { return; } this._count = value; - this.source.trigger('changeCount', { source: this, previous }); + this.source.trigger("changeCount", { source: this, previous }); } } export interface RichPropertyEvents { - changeLabel: PropertyChange>; + changeLabel: PropertyChange; } export class RichProperty { @@ -279,34 +277,34 @@ export class RichProperty { readonly id: PropertyTypeIri; - private _label: ReadonlyArray; + private _label: readonly LocalizedString[]; constructor(props: { id: PropertyTypeIri; - label?: ReadonlyArray; + label?: readonly LocalizedString[]; }) { const { id, label = [] } = props; this.id = id; this._label = label; } - get label(): ReadonlyArray { + get label(): readonly LocalizedString[] { return this._label; } - setLabel(value: ReadonlyArray) { + setLabel(value: readonly LocalizedString[]) { const previous = this._label; if (previous === value) { return; } this._label = value; - this.source.trigger('changeLabel', { source: this, previous }); + this.source.trigger("changeLabel", { source: this, previous }); } } export interface LinkEvents { changeData: PropertyChange; changeLayoutOnly: PropertyChange; - changeVertices: PropertyChange>; + changeVertices: PropertyChange; changeLabelBounds: PropertyChange; changeLinkState: PropertyChange; } @@ -324,7 +322,7 @@ export class Link { private _data: LinkModel | undefined; private _labelBounds: Rect | undefined; private _layoutOnly: boolean; - private _vertices: ReadonlyArray; + private _vertices: readonly Vector[]; private _linkState: LinkTemplateState | undefined; @@ -334,7 +332,7 @@ export class Link { sourceId: string; targetId: string; data?: LinkModel; - vertices?: ReadonlyArray; + vertices?: readonly Vector[]; linkState?: LinkTemplateState; }) { const { @@ -375,7 +373,7 @@ export class Link { } this._data = value; this._typeId = value.linkTypeId; - this.source.trigger('changeData', { source: this, previous }); + this.source.trigger("changeData", { source: this, previous }); } get labelBounds() { @@ -387,7 +385,7 @@ export class Link { return; } this._labelBounds = value; - this.source.trigger('changeLabelBounds', { source: this, previous }); + this.source.trigger("changeLabelBounds", { source: this, previous }); } get layoutOnly(): boolean { @@ -399,19 +397,19 @@ export class Link { return; } this._layoutOnly = value; - this.source.trigger('changeLayoutOnly', { source: this, previous }); + this.source.trigger("changeLayoutOnly", { source: this, previous }); } - get vertices(): ReadonlyArray { + get vertices(): readonly Vector[] { return this._vertices; } - setVertices(value: ReadonlyArray) { + setVertices(value: readonly Vector[]) { const previous = this._vertices; if (isPolylineEqual(this._vertices, value)) { return; } this._vertices = value; - this.source.trigger('changeVertices', { source: this, previous }); + this.source.trigger("changeVertices", { source: this, previous }); } get linkState(): LinkTemplateState | undefined { @@ -423,20 +421,18 @@ export class Link { return; } this._linkState = value; - this.source.trigger('changeLinkState', { source: this, previous }); + this.source.trigger("changeLinkState", { source: this, previous }); } } -export interface LinkTemplateState { - [propertyIri: string]: any; -} +export type LinkTemplateState = Record; export function linkMarkerKey(linkTypeIndex: number, startMarker: boolean) { - return `graph-explorer-${startMarker ? 'mstart' : 'mend'}-${linkTypeIndex}`; + return `graph-explorer-${startMarker ? "mstart" : "mend"}-${linkTypeIndex}`; } export interface FatLinkTypeEvents { - changeLabel: PropertyChange>; + changeLabel: PropertyChange; changeIsNew: PropertyChange; changeVisibility: { source: FatLinkType; @@ -459,7 +455,7 @@ export class FatLinkType { private _index: number | undefined; - private _label: ReadonlyArray; + private _label: readonly LocalizedString[]; private _isNew = false; private _visible = true; @@ -468,7 +464,7 @@ export class FatLinkType { constructor(props: { id: LinkTypeIri; index?: number; - label?: ReadonlyArray; + label?: readonly LocalizedString[]; }) { const { id, index, label = [] } = props; this.id = id; @@ -480,8 +476,8 @@ export class FatLinkType { return this._index; } setIndex(value: number) { - if (typeof this._index === 'number') { - throw new Error('Cannot set index for link type more than once.'); + if (typeof this._index === "number") { + throw new Error("Cannot set index for link type more than once."); } this._index = value; } @@ -489,13 +485,13 @@ export class FatLinkType { get label() { return this._label; } - setLabel(value: ReadonlyArray) { + setLabel(value: readonly LocalizedString[]) { const previous = this._label; if (previous === value) { return; } this._label = value; - this.source.trigger('changeLabel', { source: this, previous }); + this.source.trigger("changeLabel", { source: this, previous }); } get visible() { @@ -518,7 +514,7 @@ export class FatLinkType { Boolean(params.preventLoading) || this._visible === params.visible; this._visible = params.visible; this._showLabel = params.showLabel; - this.source.trigger('changeVisibility', { source: this, preventLoading }); + this.source.trigger("changeVisibility", { source: this, preventLoading }); } get isNew() { @@ -530,7 +526,7 @@ export class FatLinkType { return; } this._isNew = value; - this.source.trigger('changeIsNew', { source: this, previous }); + this.source.trigger("changeIsNew", { source: this, previous }); } } @@ -551,7 +547,7 @@ export class LinkVertex { remove() { const vertices = [...this.link.vertices]; - const [location] = vertices.splice(this.vertexIndex, 1); + vertices.splice(this.vertexIndex, 1); this.link.setVertices(vertices); } } diff --git a/src/graph-explorer/diagram/embeddedLayer.tsx b/src/graph-explorer/diagram/embeddedLayer.tsx index e98be05e..76cf095d 100644 --- a/src/graph-explorer/diagram/embeddedLayer.tsx +++ b/src/graph-explorer/diagram/embeddedLayer.tsx @@ -1,19 +1,13 @@ -import * as React from 'react'; - -import { Dictionary, ElementModel, ElementIri } from '../data/model'; -import { Paper, PaperTransform } from './paper'; -import { PaperAreaContextTypes, PaperAreaContextWrapper } from './paperArea'; -import { Element, Cell } from './elements'; -import { - ElementLayer, - ElementContextWrapper, - ElementContextTypes, -} from './elementLayer'; -import { EventObserver } from '../viewUtils/events'; - -import { Vector, Rect } from './geometry'; -import { getContentFittingBox } from './paperArea'; -import { DiagramView } from './view'; +import * as React from "react"; + +import { Paper, PaperTransform } from "./paper"; +import { PaperAreaContextTypes, PaperAreaContextWrapper } from "./paperArea"; +import { Element, Cell } from "./elements"; +import { ElementContextWrapper, ElementContextTypes } from "./elementLayer"; +import { EventObserver } from "../viewUtils/events"; + +import { Vector, Rect } from "./geometry"; +import { getContentFittingBox } from "./paperArea"; export interface State { paperWidth?: number; @@ -35,7 +29,7 @@ export class EmbeddedLayer extends React.Component<{}, State> { private isApplyingParentMove = false; private isNestedElementMoving = false; - private previousPositions: Array<{ id: string; position: Vector }> = []; + private previousPositions: { id: string; position: Vector }[] = []; constructor(props: {}) { super(props); @@ -48,7 +42,7 @@ export class EmbeddedLayer extends React.Component<{}, State> { this.listener.listen( view.model.events, - 'changeGroupContent', + "changeGroupContent", ({ group }) => { if (group === element.id) { this.listenNestedElements(this.getNestedElements()); @@ -58,7 +52,7 @@ export class EmbeddedLayer extends React.Component<{}, State> { } ); - this.listener.listen(element.events, 'changePosition', () => { + this.listener.listen(element.events, "changePosition", () => { if (this.isNestedElementMoving) { return; } @@ -73,7 +67,7 @@ export class EmbeddedLayer extends React.Component<{}, State> { this.setState({ offsetX, offsetY }); }); - this.listener.listen(paperArea.events, 'pointerUp', (e) => { + this.listener.listen(paperArea.events, "pointerUp", (_e) => { this.isNestedElementMoving = false; }); @@ -95,17 +89,17 @@ export class EmbeddedLayer extends React.Component<{}, State> { } } - private listenNestedElements(nestedElements: ReadonlyArray) { + private listenNestedElements(nestedElements: readonly Element[]) { const listener = new EventObserver(); for (const nestedElement of nestedElements) { listener.listen( nestedElement.events, - 'changePosition', + "changePosition", this.recomputeSelfBounds ); listener.listen( nestedElement.events, - 'changeSize', + "changeSize", this.recomputeSelfBounds ); } @@ -259,8 +253,8 @@ export class EmbeddedLayer extends React.Component<{}, State> { function findParentElement(layer: HTMLElement): HTMLElement { const parent = layer.parentElement; if (!parent) { - throw new Error('Cannot find parent diagram element for EmbeddedLayer'); - } else if (parent.hasAttribute('data-element-id')) { + throw new Error("Cannot find parent diagram element for EmbeddedLayer"); + } else if (parent.hasAttribute("data-element-id")) { return parent; } else { return findParentElement(parent); diff --git a/src/graph-explorer/diagram/geometry.ts b/src/graph-explorer/diagram/geometry.ts index a7aec828..497f7272 100644 --- a/src/graph-explorer/diagram/geometry.ts +++ b/src/graph-explorer/diagram/geometry.ts @@ -1,4 +1,4 @@ -import { Element } from './elements'; +import { Element } from "./elements"; export interface Vector { readonly x: number; @@ -93,8 +93,8 @@ function intersectRayFromRectangleCenter(sourceRect: Rect, rayTarget: Vector) { } export function isPolylineEqual( - left: ReadonlyArray, - right: ReadonlyArray + left: readonly Vector[], + right: readonly Vector[] ) { if (left === right) { return true; @@ -115,7 +115,7 @@ export function isPolylineEqual( export function computePolyline( source: Element, target: Element, - vertices: ReadonlyArray + vertices: readonly Vector[] ): Vector[] { const sourceRect = boundsOf(source); const targetRect = boundsOf(target); @@ -132,7 +132,7 @@ export function computePolyline( return [startPoint, ...vertices, endPoint]; } -export function computePolylineLength(polyline: ReadonlyArray): number { +export function computePolylineLength(polyline: readonly Vector[]): number { let previous: Vector; return polyline.reduce((acc, point) => { const segmentLength = previous @@ -144,11 +144,11 @@ export function computePolylineLength(polyline: ReadonlyArray): number { } export function getPointAlongPolyline( - polyline: ReadonlyArray, + polyline: readonly Vector[], offset: number ): Vector { if (polyline.length === 0) { - throw new Error('Cannot compute a point for empty polyline'); + throw new Error("Cannot compute a point for empty polyline"); } if (offset < 0) { return polyline[0]; @@ -174,7 +174,7 @@ export function getPointAlongPolyline( } export function findNearestSegmentIndex( - polyline: ReadonlyArray, + polyline: readonly Vector[], location: Vector ): number { let minDistance = Infinity; @@ -204,7 +204,7 @@ export function findNearestSegmentIndex( } export function findElementAtPoint( - elements: ReadonlyArray, + elements: readonly Element[], point: Vector ): Element | undefined { for (let i = elements.length - 1; i >= 0; i--) { @@ -228,12 +228,12 @@ export function findElementAtPoint( } export function computeGrouping( - elements: ReadonlyArray + elements: readonly Element[] ): Map { const grouping = new Map(); for (const element of elements) { const group = element.group; - if (typeof group === 'string') { + if (typeof group === "string") { let children = grouping.get(group); if (!children) { children = []; diff --git a/src/graph-explorer/diagram/graph.ts b/src/graph-explorer/diagram/graph.ts index bcb82eb3..cbdbef23 100644 --- a/src/graph-explorer/diagram/graph.ts +++ b/src/graph-explorer/diagram/graph.ts @@ -1,11 +1,11 @@ -import { ElementTypeIri, LinkTypeIri, PropertyTypeIri } from '../data/model'; -import { OrderedMap } from '../viewUtils/collections'; +import { ElementTypeIri, LinkTypeIri, PropertyTypeIri } from "../data/model"; +import { OrderedMap } from "../viewUtils/collections"; import { EventSource, Events, AnyEvent, AnyListener, -} from '../viewUtils/events'; +} from "../viewUtils/events"; import { Element as DiagramElement, @@ -17,7 +17,7 @@ import { FatClassModel, FatClassModelEvents, RichProperty, -} from './elements'; +} from "./elements"; export interface GraphEvents { changeCells: CellsChangedEvent; @@ -30,7 +30,7 @@ export interface GraphEvents { export interface CellsChangedEvent { readonly updateAll: boolean; readonly changedElement?: DiagramElement; - readonly changedLinks?: ReadonlyArray; + readonly changedLinks?: readonly DiagramLink[]; } export class Graph { @@ -92,14 +92,14 @@ export class Graph { } element.events.onAny(this.onElementEvent); this.elements.push(element.id, element); - this.source.trigger('changeCells', { + this.source.trigger("changeCells", { updateAll: false, changedElement: element, }); } private onElementEvent: AnyListener = (data, key) => { - this.source.trigger('elementEvent', { key, data }); + this.source.trigger("elementEvent", { key, data }); }; removeElement(elementId: string): void { @@ -113,7 +113,7 @@ export class Graph { } this.elements.delete(elementId); element.events.offAny(this.onElementEvent); - this.source.trigger('changeCells', { + this.source.trigger("changeCells", { updateAll: false, changedElement: element, changedLinks, @@ -140,14 +140,14 @@ export class Graph { link.events.onAny(this.onLinkEvent); this.links.push(link.id, link); - this.source.trigger('changeCells', { + this.source.trigger("changeCells", { updateAll: false, changedLinks: [link], }); } private onLinkEvent: AnyListener = (data, key) => { - this.source.trigger('linkEvent', { key, data }); + this.source.trigger("linkEvent", { key, data }); }; removeLink(linkId: string, options?: { silent?: boolean }) { @@ -157,7 +157,7 @@ export class Graph { link.events.offAny(this.onLinkEvent); this.removeLinkReferences(typeId, sourceId, targetId); if (!(options && options.silent)) { - this.source.trigger('changeCells', { + this.source.trigger("changeCells", { updateAll: false, changedLinks: [link], }); @@ -200,7 +200,7 @@ export class Graph { } private onLinkTypeEvent: AnyListener = (data, key) => { - this.source.trigger('linkTypeEvent', { key, data }); + this.source.trigger("linkTypeEvent", { key, data }); }; getProperty(propertyId: PropertyTypeIri): RichProperty | undefined { @@ -233,7 +233,7 @@ export class Graph { } private onClassEvent: AnyListener = (data, key) => { - this.source.trigger('classEvent', { key, data }); + this.source.trigger("classEvent", { key, data }); }; } diff --git a/src/graph-explorer/diagram/history.ts b/src/graph-explorer/diagram/history.ts index d849b4ab..f6223f29 100644 --- a/src/graph-explorer/diagram/history.ts +++ b/src/graph-explorer/diagram/history.ts @@ -1,4 +1,4 @@ -import { EventSource, Events } from '../viewUtils/events'; +import { EventSource, Events } from "../viewUtils/events"; export interface Command { readonly title?: string; @@ -21,7 +21,7 @@ function effectAction(title: string, body: () => void): Command { }, }; const skip = { - title: 'Skipped effect: ' + title, + title: "Skipped effect: " + title, invoke: () => perform, }; return perform; @@ -38,8 +38,8 @@ export interface CommandHistoryEvents { export interface CommandHistory { readonly events: Events; - readonly undoStack: ReadonlyArray; - readonly redoStack: ReadonlyArray; + readonly undoStack: readonly Command[]; + readonly redoStack: readonly Command[]; reset(): void; undo(): void; redo(): void; @@ -58,27 +58,27 @@ export class NonRememberingHistory implements CommandHistory { private readonly source = new EventSource(); readonly events: Events = this.source; - readonly undoStack: ReadonlyArray = []; - readonly redoStack: ReadonlyArray = []; + readonly undoStack: readonly Command[] = []; + readonly redoStack: readonly Command[] = []; reset() { - this.source.trigger('historyChanged', { hasChanges: false }); + this.source.trigger("historyChanged", { hasChanges: false }); } undo() { - throw new Error('Undo is unsupported'); + throw new Error("Undo is unsupported"); } redo() { - throw new Error('Redo is unsupported'); + throw new Error("Redo is unsupported"); } execute(command: Command) { command.invoke(); - this.source.trigger('historyChanged', { hasChanges: true }); + this.source.trigger("historyChanged", { hasChanges: true }); } - registerToUndo(command: Command) { - this.source.trigger('historyChanged', { hasChanges: true }); + registerToUndo(_command: Command) { + this.source.trigger("historyChanged", { hasChanges: true }); } - startBatch(title?: string): Batch { + startBatch(_title?: string): Batch { return { history: this, store: this.storeBatch, diff --git a/src/graph-explorer/diagram/linkLayer.tsx b/src/graph-explorer/diagram/linkLayer.tsx index 6ebc51c2..84e1a7f1 100644 --- a/src/graph-explorer/diagram/linkLayer.tsx +++ b/src/graph-explorer/diagram/linkLayer.tsx @@ -1,7 +1,7 @@ -import * as React from 'react'; -import { Component, ReactElement, SVGAttributes, CSSProperties } from 'react'; +import * as React from "react"; +import { Component, ReactElement, SVGAttributes, CSSProperties } from "react"; -import { LocalizedString } from '../data/model'; +import { LocalizedString } from "../data/model"; import { LinkTemplate, LinkStyle, @@ -9,18 +9,18 @@ import { LinkMarkerStyle, RoutedLink, RoutedLinks, -} from '../customization/props'; -import { Debouncer } from '../viewUtils/async'; -import { EventObserver } from '../viewUtils/events'; +} from "../customization/props"; +import { Debouncer } from "../viewUtils/async"; +import { EventObserver } from "../viewUtils/events"; -import { restoreCapturedLinkGeometry } from './commands'; +import { restoreCapturedLinkGeometry } from "./commands"; import { Element as DiagramElement, Link as DiagramLink, LinkVertex, linkMarkerKey, FatLinkType, -} from './elements'; +} from "./elements"; import { Vector, computePolyline, @@ -28,12 +28,12 @@ import { getPointAlongPolyline, computeGrouping, Rect, -} from './geometry'; -import { DiagramView, RenderingLayer } from './view'; +} from "./geometry"; +import { DiagramView, RenderingLayer } from "./view"; export interface LinkLayerProps { view: DiagramView; - links: ReadonlyArray; + links: readonly DiagramLink[]; group?: string; } @@ -44,7 +44,7 @@ enum UpdateRequest { All, } -const CLASS_NAME = 'graph-explorer-link-layer'; +const CLASS_NAME = "graph-explorer-link-layer"; export class LinkLayer extends Component { private readonly listener = new EventObserver(); @@ -54,10 +54,6 @@ export class LinkLayer extends Component { /** List of link IDs to update at the next flush event */ private scheduledToUpdate = new Set(); - constructor(props: LinkLayerProps, context: any) { - super(props, context); - } - componentDidMount() { const { view } = this.props; @@ -66,10 +62,10 @@ export class LinkLayer extends Component { this.scheduleUpdateLink(link.id); } }; - this.listener.listen(view.events, 'changeLanguage', this.scheduleUpdateAll); + this.listener.listen(view.events, "changeLanguage", this.scheduleUpdateAll); this.listener.listen( view.events, - 'changeHighlight', + "changeHighlight", this.scheduleUpdateAll ); const updateChangedRoutes = ( @@ -82,12 +78,12 @@ export class LinkLayer extends Component { } }); }; - this.listener.listen(view.events, 'updateRoutings', ({ previous }) => { + this.listener.listen(view.events, "updateRoutings", ({ previous }) => { const newRoutes = view.getRoutings(); updateChangedRoutes(newRoutes, previous); updateChangedRoutes(previous, newRoutes); }); - this.listener.listen(view.model.events, 'changeCells', (e) => { + this.listener.listen(view.model.events, "changeCells", (e) => { if (e.updateAll) { this.scheduleUpdateAll(); } else { @@ -101,14 +97,14 @@ export class LinkLayer extends Component { } } }); - this.listener.listen(view.model.events, 'elementEvent', ({ data }) => { + this.listener.listen(view.model.events, "elementEvent", ({ data }) => { const elementEvent = data.changePosition || data.changeSize; if (!elementEvent) { return; } scheduleUpdateElementLinks(elementEvent.source); }); - this.listener.listen(view.model.events, 'linkEvent', ({ data }) => { + this.listener.listen(view.model.events, "linkEvent", ({ data }) => { const linkEvent = data.changeData || data.changeLayoutOnly || @@ -118,7 +114,7 @@ export class LinkLayer extends Component { this.scheduleUpdateLink(linkEvent.source.id); } }); - this.listener.listen(view.model.events, 'linkTypeEvent', ({ data }) => { + this.listener.listen(view.model.events, "linkTypeEvent", ({ data }) => { const linkTypeEvent = data.changeLabel || data.changeVisibility; if (!linkTypeEvent) { return; @@ -128,7 +124,7 @@ export class LinkLayer extends Component { this.scheduleUpdateLink(link.id); } }); - this.listener.listen(view.events, 'syncUpdate', ({ layer }) => { + this.listener.listen(view.events, "syncUpdate", ({ layer }) => { if (layer !== RenderingLayer.Link) { return; } @@ -223,8 +219,8 @@ export class LinkLayer extends Component { function computeDeepNestedElements( grouping: Map, groupId: string -): { [id: string]: true } { - const deepChildren: { [elementId: string]: true } = {}; +): Record { + const deepChildren: Record = {}; function collectNestedItems(parentId: string) { deepChildren[parentId] = true; @@ -251,7 +247,7 @@ interface LinkViewProps { route?: RoutedLink; } -const LINK_CLASS = 'graph-explorer-link'; +const LINK_CLASS = "graph-explorer-link"; const LABEL_GROUPING_PRECISION = 100; // temporary, cleared-before-render map to hold line numbers for labels // grouped on the same link offset @@ -272,7 +268,7 @@ class LinkView extends Component { } } - shouldComponentUpdate(nextProps: LinkViewProps, nextState: {}) { + shouldComponentUpdate(nextProps: LinkViewProps, _nextState: {}) { return nextProps.shouldUpdate; } @@ -293,7 +289,7 @@ class LinkView extends Component { const vertices = route ? route.vertices : verticesDefinedByUser; const polyline = computePolyline(source, target, vertices); - const path = 'M' + polyline.map(({ x, y }) => `${x},${y}`).join(' L'); + const path = "M" + polyline.map(({ x, y }) => `${x},${y}`).join(" L"); const { index: typeIndex, showLabel } = this.linkType; const style = this.template.renderLink(model); @@ -301,7 +297,7 @@ class LinkView extends Component { const isBlurred = view.highlighter && !view.highlighter(model); const className = `${LINK_CLASS} ${ - isBlurred ? `${LINK_CLASS}--blurred` : '' + isBlurred ? `${LINK_CLASS}--blurred` : "" }`; return ( { ); } - private renderVertices(vertices: ReadonlyArray, fill: string) { + private renderVertices(vertices: readonly Vector[], fill: string) { const elements: ReactElement[] = []; const vertexClass = `${LINK_CLASS}__vertex`; @@ -372,12 +368,12 @@ class LinkView extends Component { model.setLabelBounds(newBounds); }; - private renderLabels(polyline: ReadonlyArray, style: LinkStyle) { + private renderLabels(polyline: readonly Vector[], style: LinkStyle) { const { view, model, route } = this.props; const labels = computeLinkLabels(model, style, view); - let textAnchor: 'start' | 'middle' | 'end' = 'middle'; + let textAnchor: "start" | "middle" | "end" = "middle"; if (route && route.labelTextAnchor) { textAnchor = route.labelTextAnchor; } @@ -435,7 +431,7 @@ function computeLinkLabels( const type = view.model.getLinkType(model.typeId); text = view.selectLabel(type.label) || { value: view.formatLabel(type.label, type.id), - language: '', + language: "", }; if (title === undefined) { title = `${text.value} ${view.formatIri(model.typeId)}`; @@ -478,25 +474,26 @@ function getPathAttributes( model: DiagramLink, style: LinkStyle ): SVGAttributes { - const connectionAttributes: LinkStyle['connection'] = style.connection || {}; - const defaultStrokeDasharray = model.layoutOnly ? '5,5' : undefined; + const connectionAttributes: LinkStyle["connection"] = style.connection || {}; + const defaultStrokeDasharray = model.layoutOnly ? "5,5" : undefined; const { - fill = 'none', - stroke = 'black', - 'stroke-width': strokeWidth, - 'stroke-dasharray': strokeDasharray = defaultStrokeDasharray, + fill = "none", + stroke = "black", + "stroke-width": strokeWidth, + "stroke-dasharray": strokeDasharray = defaultStrokeDasharray, } = connectionAttributes; return { fill, stroke, strokeWidth, strokeDasharray }; } function getLabelTextAttributes(label: LinkLabelProperties): CSSProperties { const { - fill = 'black', - stroke = 'none', - 'stroke-width': strokeWidth = 0, - 'font-family': fontFamily = '"Helvetica Neue", "Helvetica", "Arial", sans-serif', - 'font-size': fontSize = 'inherit', - 'font-weight': fontWeight = 'bold', + fill = "black", + stroke = "none", + "stroke-width": strokeWidth = 0, + "font-family": + fontFamily = '"Helvetica Neue", "Helvetica", "Arial", sans-serif', + "font-size": fontSize = "inherit", + "font-weight": fontWeight = "bold", } = label.attrs ? label.attrs.text : {}; return { fill, @@ -504,13 +501,16 @@ function getLabelTextAttributes(label: LinkLabelProperties): CSSProperties { strokeWidth, fontFamily, fontSize, - fontWeight: fontWeight as CSSProperties['fontWeight'], + fontWeight: fontWeight as CSSProperties["fontWeight"], }; } function getLabelRectAttributes(label: LinkLabelProperties): CSSProperties { - const { fill = 'white', stroke = 'none', 'stroke-width': strokeWidth = 0 } = - label.attrs && label.attrs.rect ? label.attrs.rect : {}; + const { + fill = "white", + stroke = "none", + "stroke-width": strokeWidth = 0, + } = label.attrs && label.attrs.rect ? label.attrs.rect : {}; return { fill, stroke, strokeWidth }; } @@ -529,7 +529,7 @@ interface LinkLabelProps { y: number; line: number; label: LabelAttributes; - textAnchor: 'start' | 'middle' | 'end'; + textAnchor: "start" | "middle" | "end"; onBoundsUpdate?: (newBounds: Rect) => void; } @@ -559,7 +559,7 @@ class LinkLabel extends Component { ? undefined : `translate(0, ${line * (height + GROUPED_LABEL_MARGIN)}px)`; // HACK: 'alignment-baseline' and 'dominant-baseline' are not supported in Edge and IE - const dy = '0.6ex'; + const dy = "0.6ex"; return ( @@ -589,9 +589,9 @@ class LinkLabel extends Component { const { x, y, textAnchor } = this.props; let xOffset = 0; - if (textAnchor === 'middle') { + if (textAnchor === "middle") { xOffset = -width / 2; - } else if (textAnchor === 'end') { + } else if (textAnchor === "end") { xOffset = -width; } @@ -616,14 +616,14 @@ class LinkLabel extends Component { onBoundsUpdate(undefined); } - componentDidUpdate(nextProps: LinkLabelProps) { + componentDidUpdate(_nextProps: LinkLabelProps) { this.shouldUpdateBounds = true; } UNSAFE_componentWillReceiveProps() { this.recomputeBounds(this.props); } - private recomputeBounds(props: LinkLabelProps) { + private recomputeBounds(_props: LinkLabelProps) { if (this.shouldUpdateBounds) { const { onBoundsUpdate } = this.props; this.shouldUpdateBounds = false; @@ -655,7 +655,7 @@ class VertexTools extends Component< {} > { render() { - const { className, vertexIndex, vertexRadius, x, y } = this.props; + const { className, vertexRadius, x, y } = this.props; const transform = `translate(${x + 2 * vertexRadius},${ y - 2 * vertexRadius })scale(${vertexRadius})`; @@ -692,7 +692,7 @@ export class LinkMarkers extends Component<{ view: DiagramView }, {}> { render() { const { view } = this.props; - const markers: Array> = []; + const markers: ReactElement[] = []; view.getLinkTemplates().forEach((template, linkTypeId) => { const type = view.model.getLinkType(linkTypeId); @@ -728,13 +728,13 @@ export class LinkMarkers extends Component<{ view: DiagramView }, {}> { componentDidMount() { const { view } = this.props; - this.listener.listen(view.events, 'syncUpdate', ({ layer }) => { + this.listener.listen(view.events, "syncUpdate", ({ layer }) => { if (layer !== RenderingLayer.Link) { return; } this.delayedUpdate.runSynchronously(); }); - this.listener.listen(view.events, 'changeLinkTemplates', () => { + this.listener.listen(view.events, "changeLinkTemplates", () => { this.delayedUpdate.call(() => this.forceUpdate()); }); } @@ -749,8 +749,7 @@ export class LinkMarkers extends Component<{ view: DiagramView }, {}> { } } -const SVG_NAMESPACE: 'http://www.w3.org/2000/svg' = - 'http://www.w3.org/2000/svg'; +const SVG_NAMESPACE = "http://www.w3.org/2000/svg" as const; interface LinkMarkerProps { linkTypeIndex: number; @@ -774,26 +773,26 @@ class LinkMarker extends Component { const { linkTypeIndex, isStartMarker, style } = this.props; - marker.setAttribute('id', linkMarkerKey(linkTypeIndex, isStartMarker)); - marker.setAttribute('markerWidth', style.width.toString()); - marker.setAttribute('markerHeight', style.height.toString()); - marker.setAttribute('orient', 'auto'); + marker.setAttribute("id", linkMarkerKey(linkTypeIndex, isStartMarker)); + marker.setAttribute("markerWidth", style.width.toString()); + marker.setAttribute("markerHeight", style.height.toString()); + marker.setAttribute("orient", "auto"); const xOffset = isStartMarker ? 0 : style.width - 1; - marker.setAttribute('refX', xOffset.toString()); - marker.setAttribute('refY', (style.height / 2).toString()); - marker.setAttribute('markerUnits', 'userSpaceOnUse'); + marker.setAttribute("refX", xOffset.toString()); + marker.setAttribute("refY", (style.height / 2).toString()); + marker.setAttribute("markerUnits", "userSpaceOnUse"); - const path = document.createElementNS(SVG_NAMESPACE, 'path'); - path.setAttribute('d', style.d); + const path = document.createElementNS(SVG_NAMESPACE, "path"); + path.setAttribute("d", style.d); if (style.fill !== undefined) { - path.setAttribute('fill', style.fill); + path.setAttribute("fill", style.fill); } if (style.stroke !== undefined) { - path.setAttribute('stroke', style.stroke); + path.setAttribute("stroke", style.stroke); } if (style.strokeWidth !== undefined) { - path.setAttribute('stroke-width', style.strokeWidth); + path.setAttribute("stroke-width", style.strokeWidth); } marker.appendChild(path); diff --git a/src/graph-explorer/diagram/linkRouter.ts b/src/graph-explorer/diagram/linkRouter.ts index 2cb759fe..618d641e 100644 --- a/src/graph-explorer/diagram/linkRouter.ts +++ b/src/graph-explorer/diagram/linkRouter.ts @@ -1,7 +1,7 @@ -import { LinkRouter, RoutedLinks, Vertex } from '../customization/props'; -import { DiagramModel } from './model'; -import { Link as DiagramLink, Element as DiagramElement } from './elements'; -import { Vector } from './geometry'; +import { LinkRouter, RoutedLinks, Vertex } from "../customization/props"; +import { DiagramModel } from "./model"; +import { Link as DiagramLink, Element as DiagramElement } from "./elements"; +import { Vector } from "./geometry"; export class DefaultLinkRouter implements LinkRouter { constructor(private gap = 20) {} @@ -126,7 +126,7 @@ export class DefaultLinkRouter implements LinkRouter { connectionDirection: Vector, siblingIndex: number, siblingCount: number - ): 'start' | 'middle' | 'end' { + ): "start" | "middle" | "end" { // offset direction angle in [0; 2 Pi] interval const angle = Math.atan2(connectionDirection.y, connectionDirection.x); const absoluteAngle = Math.abs(angle); @@ -143,16 +143,16 @@ export class DefaultLinkRouter implements LinkRouter { (isTop && siblingIndex === secondOuter) || (isBottom && siblingIndex === firstOuter) ) { - return 'end'; + return "end"; } else if ( (isTop && siblingIndex === firstOuter) || (isBottom && siblingIndex === secondOuter) ) { - return 'start'; + return "start"; } } - return 'middle'; + return "middle"; } } diff --git a/src/graph-explorer/diagram/model.ts b/src/graph-explorer/diagram/model.ts index 714dcb7c..19a83429 100644 --- a/src/graph-explorer/diagram/model.ts +++ b/src/graph-explorer/diagram/model.ts @@ -4,15 +4,15 @@ import { ElementTypeIri, LinkTypeIri, PropertyTypeIri, -} from '../data/model'; -import { GenerateID } from '../data/schema'; +} from "../data/model"; +import { GenerateID } from "../data/schema"; import { EventSource, Events, EventObserver, AnyEvent, -} from '../viewUtils/events'; +} from "../viewUtils/events"; import { Element, @@ -24,9 +24,9 @@ import { FatClassModel, FatClassModelEvents, RichProperty, -} from './elements'; -import { Graph, CellsChangedEvent } from './graph'; -import { CommandHistory, Command } from './history'; +} from "./elements"; +import { Graph, CellsChangedEvent } from "./graph"; +import { CommandHistory, Command } from "./history"; export interface DiagramModelEvents { changeCells: CellsChangedEvent; @@ -64,7 +64,7 @@ export class DiagramModel { return this.graph.getLink(linkId); } - linksOfType(linkTypeId: LinkTypeIri): ReadonlyArray { + linksOfType(linkTypeId: LinkTypeIri): readonly Link[] { return this.graph.getLinks().filter((link) => link.typeId === linkTypeId); } @@ -95,23 +95,23 @@ export class DiagramModel { } subscribeGraph() { - this.graphListener.listen(this.graph.events, 'changeCells', (e) => { - this.source.trigger('changeCells', e); + this.graphListener.listen(this.graph.events, "changeCells", (e) => { + this.source.trigger("changeCells", e); }); - this.graphListener.listen(this.graph.events, 'elementEvent', (e) => { - this.source.trigger('elementEvent', e); + this.graphListener.listen(this.graph.events, "elementEvent", (e) => { + this.source.trigger("elementEvent", e); }); - this.graphListener.listen(this.graph.events, 'linkEvent', (e) => { - this.source.trigger('linkEvent', e); + this.graphListener.listen(this.graph.events, "linkEvent", (e) => { + this.source.trigger("linkEvent", e); }); - this.graphListener.listen(this.graph.events, 'linkTypeEvent', (e) => { - this.source.trigger('linkTypeEvent', e); + this.graphListener.listen(this.graph.events, "linkTypeEvent", (e) => { + this.source.trigger("linkTypeEvent", e); }); - this.graphListener.listen(this.graph.events, 'classEvent', (e) => { - this.source.trigger('classEvent', e); + this.graphListener.listen(this.graph.events, "classEvent", (e) => { + this.source.trigger("classEvent", e); }); - this.source.trigger('changeCells', { updateAll: true }); + this.source.trigger("changeCells", { updateAll: true }); } reorderElements(compare: (a: Element, b: Element) => number) { @@ -123,7 +123,7 @@ export class DiagramModel { group?: string ): Element { const elementIri = - typeof elementIriOrModel === 'string' + typeof elementIriOrModel === "string" ? elementIriOrModel : (elementIriOrModel as ElementModel).id; @@ -136,7 +136,7 @@ export class DiagramModel { } let data = - typeof elementIriOrModel === 'string' + typeof elementIriOrModel === "string" ? placeholderDataFromIri(elementIri) : (elementIriOrModel as ElementModel); data = { ...data, id: data.id }; @@ -159,7 +159,7 @@ export class DiagramModel { addLink(link: Link): Link { const { typeId, sourceId, targetId, data } = link; if (data && data.linkTypeId !== typeId) { - throw new Error('linkTypeId must match linkType.id'); + throw new Error("linkTypeId must match linkType.id"); } const existingLink = this.findLink(typeId, sourceId, targetId); @@ -241,13 +241,13 @@ export class DiagramModel { } triggerChangeGroupContent(group: string) { - this.source.trigger('changeGroupContent', { group }); + this.source.trigger("changeGroupContent", { group }); } createTemporaryElement(): Element { const target = new Element({ id: GenerateID.forElement(), - data: placeholderDataFromIri('' as ElementIri), + data: placeholderDataFromIri("" as ElementIri), temporary: true, }); @@ -269,9 +269,9 @@ export function placeholderDataFromIri(iri: ElementIri): ElementModel { function addElement( graph: Graph, element: Element, - connectedLinks: ReadonlyArray + connectedLinks: readonly Link[] ): Command { - return Command.create('Add element', () => { + return Command.create("Add element", () => { graph.addElement(element); for (const link of connectedLinks) { const existing = @@ -286,7 +286,7 @@ function addElement( } function removeElement(graph: Graph, element: Element): Command { - return Command.create('Remove element', () => { + return Command.create("Remove element", () => { const connectedLinks = [...element.links]; graph.removeElement(element.id); return addElement(graph, element, connectedLinks); diff --git a/src/graph-explorer/diagram/paper.tsx b/src/graph-explorer/diagram/paper.tsx index 74bd5329..36d00174 100644 --- a/src/graph-explorer/diagram/paper.tsx +++ b/src/graph-explorer/diagram/paper.tsx @@ -1,12 +1,12 @@ -import * as React from 'react'; -import { Component, CSSProperties, SVGProps } from 'react'; +import * as React from "react"; +import { Component, CSSProperties } from "react"; -import { Cell, LinkVertex } from './elements'; -import { ElementLayer } from './elementLayer'; -import { Vector } from './geometry'; -import { LinkLayer, LinkMarkers } from './linkLayer'; -import { DiagramModel } from './model'; -import { DiagramView } from './view'; +import { Cell, LinkVertex } from "./elements"; +import { ElementLayer } from "./elementLayer"; +import { Vector } from "./geometry"; +import { LinkLayer, LinkMarkers } from "./linkLayer"; +import { DiagramModel } from "./model"; +import { DiagramView } from "./view"; export interface PaperProps { view: DiagramView; @@ -20,7 +20,7 @@ export interface PaperProps { elementLayerWidgets?: React.ReactElement; } -const CLASS_NAME = 'graph-explorer-paper'; +const CLASS_NAME = "graph-explorer-paper"; export class Paper extends Component { render() { @@ -31,15 +31,8 @@ export class Paper extends Component { linkLayerWidgets, elementLayerWidgets, } = this.props; - const { - width, - height, - originX, - originY, - scale, - paddingX, - paddingY, - } = paperTransform; + const { width, height, originX, originY, scale, paddingX, paddingY } = + paperTransform; const scaledWidth = width * scale; const scaledHeight = height * scale; @@ -55,7 +48,7 @@ export class Paper extends Component { paddingBottom: paddingY, }; const htmlTransformStyle: React.CSSProperties = { - position: 'absolute', + position: "absolute", left: 0, top: 0, transform: `scale(${scale},${scale})translate(${originX}px,${originY}px)`, @@ -65,7 +58,7 @@ export class Paper extends Component {
@@ -99,15 +92,15 @@ function findCell( let vertexIndex: number | undefined; while (true) { if (target instanceof Element) { - if (target.hasAttribute('data-element-id')) { - return model.getElement(target.getAttribute('data-element-id')); - } else if (target.hasAttribute('data-link-id')) { - const link = model.getLinkById(target.getAttribute('data-link-id')); - return typeof vertexIndex === 'number' + if (target.hasAttribute("data-element-id")) { + return model.getElement(target.getAttribute("data-element-id")); + } else if (target.hasAttribute("data-link-id")) { + const link = model.getLinkById(target.getAttribute("data-link-id")); + return typeof vertexIndex === "number" ? new LinkVertex(link, vertexIndex) : link; - } else if (target.hasAttribute('data-vertex')) { - vertexIndex = Number(target.getAttribute('data-vertex')); + } else if (target.hasAttribute("data-vertex")) { + vertexIndex = Number(target.getAttribute("data-vertex")); } } if (!target || target === top) { @@ -138,21 +131,13 @@ export class TransformedSvgCanvas extends Component< {} > { private static readonly SVG_STYLE: CSSProperties = { - position: 'absolute', + position: "absolute", top: 0, left: 0, }; render() { const { paperTransform, style, children, ...otherProps } = this.props; - const { - width, - height, - originX, - originY, - scale, - paddingX, - paddingY, - } = paperTransform; + const { width, height, originX, originY, scale } = paperTransform; const scaledWidth = width * scale; const scaledHeight = height * scale; let svgStyle = TransformedSvgCanvas.SVG_STYLE; diff --git a/src/graph-explorer/diagram/paperArea.tsx b/src/graph-explorer/diagram/paperArea.tsx index 5070fef8..9da951a7 100644 --- a/src/graph-explorer/diagram/paperArea.tsx +++ b/src/graph-explorer/diagram/paperArea.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import * as React from "react"; import { Debouncer, @@ -6,38 +6,38 @@ import { animateInterval, delay, easeInOutBezier, -} from '../viewUtils/async'; +} from "../viewUtils/async"; import { EventObserver, Events, EventSource, PropertyChange, -} from '../viewUtils/events'; -import { PropTypes } from '../viewUtils/react'; +} from "../viewUtils/events"; +import { PropTypes } from "../viewUtils/react"; import { ToSVGOptions, ToDataURLOptions, toSVG, toDataURL, fitRectKeepingAspectRatio, -} from '../viewUtils/toSvg'; +} from "../viewUtils/toSvg"; -import { RestoreGeometry } from './commands'; -import { Element, Link, Cell, LinkVertex } from './elements'; +import { RestoreGeometry } from "./commands"; +import { Element, Link, Cell, LinkVertex } from "./elements"; import { Vector, Rect, computePolyline, findNearestSegmentIndex, -} from './geometry'; -import { Batch } from './history'; +} from "./geometry"; +import { Batch } from "./history"; import { DiagramView, RenderingLayer, WidgetDescription, WidgetAttachment, -} from './view'; -import { Paper, PaperTransform } from './paper'; +} from "./view"; +import { Paper, PaperTransform } from "./paper"; export interface PaperAreaProps { view: DiagramView; @@ -91,7 +91,7 @@ export interface State { readonly scale?: number; readonly paddingX?: number; readonly paddingY?: number; - readonly renderedWidgets?: ReadonlyArray; + readonly renderedWidgets?: readonly WidgetDescription[]; } export interface PaperAreaContextWrapper { @@ -155,7 +155,7 @@ export interface ScaleOptions extends ViewportOptions { pivot?: { x: number; y: number }; } -const CLASS_NAME = 'graph-explorer-paper-area'; +const CLASS_NAME = "graph-explorer-paper-area"; const DEFAULT_ANIMATION_DURATION = 500; const LEFT_MOUSE_BUTTON = 0; @@ -168,7 +168,7 @@ export class PaperArea extends React.Component { private outer: HTMLDivElement; private area: HTMLDivElement; - private widgets: { [key: string]: WidgetDescription } = {}; + private widgets: Record = {}; private readonly pageSize = { x: 1500, y: 800 }; @@ -324,31 +324,31 @@ export class PaperArea extends React.Component { const { view } = this.props; const delayedAdjust = () => this.delayedPaperAdjust.call(this.adjustPaper); - this.listener.listen(view.model.events, 'changeCells', delayedAdjust); - this.listener.listen(view.model.events, 'elementEvent', ({ data }) => { + this.listener.listen(view.model.events, "changeCells", delayedAdjust); + this.listener.listen(view.model.events, "elementEvent", ({ data }) => { if (data.changePosition || data.changeSize) { delayedAdjust(); } }); - this.listener.listen(view.model.events, 'linkEvent', ({ data }) => { + this.listener.listen(view.model.events, "linkEvent", ({ data }) => { if (data.changeVertices) { delayedAdjust(); } }); - this.listener.listen(view.events, 'syncUpdate', ({ layer }) => { + this.listener.listen(view.events, "syncUpdate", ({ layer }) => { if (layer !== RenderingLayer.PaperArea) { return; } this.delayedPaperAdjust.runSynchronously(); }); - this.listener.listen(view.events, 'updateWidgets', ({ widgets }) => { + this.listener.listen(view.events, "updateWidgets", ({ widgets }) => { this.updateWidgets(widgets); }); - this.area.addEventListener('dragover', this.onDragOver); - this.area.addEventListener('drop', this.onDragDrop); - this.area.addEventListener('scroll', this.onScroll); - this.area.addEventListener('wheel', this.onWheel, { passive: false }); + this.area.addEventListener("dragover", this.onDragOver); + this.area.addEventListener("drop", this.onDragDrop); + this.area.addEventListener("scroll", this.onScroll); + this.area.addEventListener("wheel", this.onWheel, { passive: false }); } componentDidUpdate(prevProps: PaperAreaProps, prevState: State) { @@ -372,13 +372,13 @@ export class PaperArea extends React.Component { componentWillUnmount() { this.stopListeningToPointerMove(); this.listener.stopListening(); - this.area.removeEventListener('dragover', this.onDragOver); - this.area.removeEventListener('drop', this.onDragDrop); - this.area.removeEventListener('scroll', this.onScroll); - this.area.removeEventListener('wheel', this.onWheel); + this.area.removeEventListener("dragover", this.onDragOver); + this.area.removeEventListener("drop", this.onDragDrop); + this.area.removeEventListener("scroll", this.onScroll); + this.area.removeEventListener("wheel", this.onWheel); } - private updateWidgets(update: { [key: string]: WidgetDescription }) { + private updateWidgets(update: Record) { this.widgets = { ...this.widgets, ...update }; const renderedWidgets = Object.keys(this.widgets) .filter((key) => this.widgets[key]) @@ -419,14 +419,14 @@ export class PaperArea extends React.Component { } scrollablePaneToPaperCoords(paneX: number, paneY: number) { - const { scale, paddingX, paddingY, originX, originY } = this.state; + const { scale, originX, originY } = this.state; const paperX = paneX / scale - originX; const paperY = paneY / scale - originY; return { x: paperX, y: paperY }; } paperToScrollablePaneCoords(paperX: number, paperY: number) { - const { scale, paddingX, paddingY, originX, originY } = this.state; + const { scale, originX, originY } = this.state; const paneX = (paperX + originX) * scale; const paneY = (paperY + originY) * scale; return { x: paneX, y: paneY }; @@ -557,7 +557,7 @@ export class PaperArea extends React.Component { this.movingElementOrigin = { pointerX, pointerY, elementX, elementY }; } - private startPanning(event: React.MouseEvent) { + private startPanning(_event: React.MouseEvent) { const { scrollLeft, scrollTop } = this.area; this.panningScrollOrigin = { scrollLeft, scrollTop }; this.clearTextSelectionInArea(); @@ -608,9 +608,9 @@ export class PaperArea extends React.Component { batch, restoreGeometry, }; - document.addEventListener('mousemove', this.onPointerMove); - document.addEventListener('mouseup', this.stopListeningToPointerMove); - this.source.trigger('pointerDown', { + document.addEventListener("mousemove", this.onPointerMove); + document.addEventListener("mouseup", this.stopListeningToPointerMove); + this.source.trigger("pointerDown", { source: this, sourceEvent: event, target: cell, @@ -630,13 +630,13 @@ export class PaperArea extends React.Component { this.movingState.pointerMoved = true; } - if (typeof target === 'undefined') { + if (typeof target === "undefined") { if (panning) { this.area.scrollLeft = this.panningScrollOrigin.scrollLeft - pageOffsetX; this.area.scrollTop = this.panningScrollOrigin.scrollTop - pageOffsetY; } - this.source.trigger('pointerMove', { + this.source.trigger("pointerMove", { source: this, sourceEvent: e, target, @@ -644,17 +644,13 @@ export class PaperArea extends React.Component { }); } else if (target instanceof Element) { const { x, y } = this.pageToPaperCoords(e.pageX, e.pageY); - const { - pointerX, - pointerY, - elementX, - elementY, - } = this.movingElementOrigin; + const { pointerX, pointerY, elementX, elementY } = + this.movingElementOrigin; target.setPosition({ x: elementX + x - pointerX, y: elementY + y - pointerY, }); - this.source.trigger('pointerMove', { + this.source.trigger("pointerMove", { source: this, sourceEvent: e, target, @@ -669,7 +665,7 @@ export class PaperArea extends React.Component { } else if (target instanceof LinkVertex) { const location = this.pageToPaperCoords(e.pageX, e.pageY); target.moveTo(location); - this.source.trigger('pointerMove', { + this.source.trigger("pointerMove", { source: this, sourceEvent: e, target, @@ -684,13 +680,13 @@ export class PaperArea extends React.Component { this.movingState = undefined; if (movingState) { - document.removeEventListener('mousemove', this.onPointerMove); - document.removeEventListener('mouseup', this.stopListeningToPointerMove); + document.removeEventListener("mousemove", this.onPointerMove); + document.removeEventListener("mouseup", this.stopListeningToPointerMove); } if (e && movingState) { const { pointerMoved, target, batch, restoreGeometry } = movingState; - this.source.trigger('pointerUp', { + this.source.trigger("pointerUp", { source: this, sourceEvent: e, target, @@ -796,7 +792,7 @@ export class PaperArea extends React.Component { return this.centerTo(); } - let elements: ReadonlyArray; + let elements: readonly Element[]; if (options.elements) { const selectionElements: Element[] = []; options.elements.forEach((el) => selectionElements.push(el)); @@ -845,8 +841,8 @@ export class PaperArea extends React.Component { if (e.preventDefault) { e.preventDefault(); } - e.dataTransfer.dropEffect = 'move'; - const { x, y } = clientCoordsFor(this.area, e); + e.dataTransfer.dropEffect = "move"; + const { x: _x, y: _y } = clientCoordsFor(this.area, e); return false; }; @@ -859,13 +855,13 @@ export class PaperArea extends React.Component { }; private onScroll = () => { - this.source.trigger('scroll', { source: this }); + this.source.trigger("scroll", { source: this }); }; private makeToSVGOptions(): ToSVGOptions { - const svg = this.area.querySelector('.graph-explorer-paper__canvas'); + const svg = this.area.querySelector(".graph-explorer-paper__canvas"); if (!svg) { - throw new Error('Cannot find SVG canvas to export'); + throw new Error("Cannot find SVG canvas to export"); } return { model: this.props.view.model, @@ -875,7 +871,7 @@ export class PaperArea extends React.Component { this.area.querySelector(`[data-element-id='${id}']`) as HTMLElement, preserveDimensions: true, convertImagesToDataUris: true, - elementsToRemoveSelector: '.graph-explorer-link__vertex-tools', + elementsToRemoveSelector: ".graph-explorer-link__vertex-tools", watermarkSvg: this.props.watermarkSvg, }; } @@ -904,7 +900,7 @@ export class PaperArea extends React.Component { setupChanges(); const timeout = - typeof duration === 'number' ? duration : DEFAULT_ANIMATION_DURATION; + typeof duration === "number" ? duration : DEFAULT_ANIMATION_DURATION; return delay(timeout).then(() => this.onGraphAnimationEnd()); } @@ -924,7 +920,7 @@ export class PaperArea extends React.Component { const current = this.isAnimatingGraph(); if (previous !== current) { this.forceUpdate(); - this.source.trigger('changeAnimatingGraph', { source: this, previous }); + this.source.trigger("changeAnimatingGraph", { source: this, previous }); } } @@ -965,7 +961,7 @@ export class PaperArea extends React.Component { cancellation: new Cancellation(), }; const durationMs = - typeof options.duration === 'number' + typeof options.duration === "number" ? options.duration : DEFAULT_ANIMATION_DURATION; @@ -1032,8 +1028,8 @@ function clientCoordsFor(container: HTMLElement, e: MouseEvent) { } export function getContentFittingBox( - elements: ReadonlyArray, - links: ReadonlyArray + elements: readonly Element[], + links: readonly Link[] ): { x: number; y: number; width: number; height: number } { let minX = Infinity, minY = Infinity; diff --git a/src/graph-explorer/diagram/view.ts b/src/graph-explorer/diagram/view.ts index 1b8c91d7..5cd6a23e 100644 --- a/src/graph-explorer/diagram/view.ts +++ b/src/graph-explorer/diagram/view.ts @@ -1,7 +1,7 @@ -import { ReactNode } from 'react'; -import { hcl } from 'd3-color'; -import { defaultsDeep, cloneDeep } from 'lodash'; -import { ReactElement, MouseEvent } from 'react'; +import { ReactNode } from "react"; +import { hcl } from "d3-color"; +import { defaultsDeep, cloneDeep } from "lodash"; +import { ReactElement, MouseEvent } from "react"; import { LinkRouter, @@ -12,39 +12,39 @@ import { LinkTemplate, RoutedLink, RoutedLinks, -} from '../customization/props'; -import { DefaultTypeStyleBundle } from '../customization/defaultTypeStyles'; -import { DefaultLinkTemplateBundle } from '../customization/defaultLinkStyles'; +} from "../customization/props"; +import { DefaultTypeStyleBundle } from "../customization/defaultTypeStyles"; +import { DefaultLinkTemplateBundle } from "../customization/defaultLinkStyles"; import { StandardTemplate, DefaultElementTemplateBundle, -} from '../customization/templates'; +} from "../customization/templates"; import { ElementModel, LocalizedString, ElementTypeIri, LinkTypeIri, -} from '../data/model'; -import { isEncodedBlank } from '../data/sparql/blankNodes'; -import { hashFnv32a, getUriLocalName } from '../data/utils'; +} from "../data/model"; +import { isEncodedBlank } from "../data/sparql/blankNodes"; +import { hashFnv32a, getUriLocalName } from "../data/utils"; import { Events, EventSource, EventObserver, PropertyChange, -} from '../viewUtils/events'; +} from "../viewUtils/events"; -import { Element, Link, FatLinkType } from './elements'; -import { Vector, isPolylineEqual } from './geometry'; -import { DefaultLinkRouter } from './linkRouter'; -import { DiagramModel } from './model'; +import { Element, Link, FatLinkType } from "./elements"; +import { Vector, isPolylineEqual } from "./geometry"; +import { DefaultLinkRouter } from "./linkRouter"; +import { DiagramModel } from "./model"; export enum IriClickIntent { - JumpToEntity = 'jumpToEntity', - OpenEntityIri = 'openEntityIri', - OpenOtherIri = 'openOtherIri', + JumpToEntity = "jumpToEntity", + OpenEntityIri = "openEntityIri", + OpenOtherIri = "openOtherIri", } export interface IriClickEvent { iri: string; @@ -55,7 +55,7 @@ export interface IriClickEvent { export type IriClickHandler = (event: IriClickEvent) => void; export type LabelLanguageSelector = ( - labels: ReadonlyArray, + labels: readonly LocalizedString[], language: string ) => LocalizedString | undefined; @@ -95,7 +95,7 @@ export interface DiagramViewEvents { } export interface UpdateWidgetsEvent { - widgets: { [key: string]: WidgetDescription }; + widgets: Record; } export enum WidgetAttachment { @@ -133,7 +133,7 @@ export class DiagramView { private readonly resolveLinkTemplate: LinkTemplateResolver; private readonly resolveElementTemplate: TemplateResolver; - private _language = 'en'; + private _language = "en"; private linkTemplates = new Map(); private router: LinkRouter; @@ -161,19 +161,27 @@ export class DiagramView { this.router = this.options.linkRouter || new DefaultLinkRouter(); this.updateRoutings(); - this.listener.listen(this.model.events, 'changeCells', () => + this.listener.listen(this.model.events, "changeCells", () => this.updateRoutings() ); - this.listener.listen(this.model.events, 'linkEvent', ({ key, data }) => { - if (data.changeVertices) { - this.updateRoutings(); + this.listener.listen( + this.model.events, + "linkEvent", + ({ key: _key, data }) => { + if (data.changeVertices) { + this.updateRoutings(); + } } - }); - this.listener.listen(this.model.events, 'elementEvent', ({ key, data }) => { - if (data.changePosition || data.changeSize) { - this.updateRoutings(); + ); + this.listener.listen( + this.model.events, + "elementEvent", + ({ key: _key, data }) => { + if (data.changePosition || data.changeSize) { + this.updateRoutings(); + } } - }); + ); } private updateRoutings() { @@ -188,7 +196,7 @@ export class DiagramView { } }); this.routings = computedRoutes; - this.source.trigger('updateRoutings', { + this.source.trigger("updateRoutings", { source: this, previous: previousRoutes, }); @@ -207,14 +215,14 @@ export class DiagramView { } setLanguage(value: string) { if (!value) { - throw new Error('Cannot set empty language.'); + throw new Error("Cannot set empty language."); } const previous = this._language; if (previous === value) { return; } this._language = value; - this.source.trigger('changeLanguage', { source: this, previous }); + this.source.trigger("changeLanguage", { source: this, previous }); } getLinkTemplates(): ReadonlyMap { @@ -227,7 +235,7 @@ export class DiagramView { layer <= RenderingLayer.LastToUpdate; layer++ ) { - this.source.trigger('syncUpdate', { layer }); + this.source.trigger("syncUpdate", { layer }); } } @@ -252,7 +260,7 @@ export class DiagramView { }) { const { key, widget: element, attachment } = widget; const widgets = { [key]: element ? { element, attachment } : undefined }; - this.source.trigger('updateWidgets', { widgets }); + this.source.trigger("updateWidgets", { widgets }); } setHandlerForNextDropOnPaper(handler: (e: DropOnPaperEvent) => void) { @@ -270,17 +278,17 @@ export class DiagramView { } selectLabel( - labels: ReadonlyArray, + labels: readonly LocalizedString[], language?: string ): LocalizedString | undefined { const targetLanguage = - typeof language === 'undefined' ? this.getLanguage() : language; + typeof language === "undefined" ? this.getLanguage() : language; const { selectLabelLanguage = defaultSelectLabel } = this.options; return selectLabelLanguage(labels, targetLanguage); } formatLabel( - labels: ReadonlyArray, + labels: readonly LocalizedString[], fallbackIri: string, language?: string ): string { @@ -295,7 +303,7 @@ export class DiagramView { return this.formatLabel(type.label, type.id); }) .sort() - .join(', '); + .join(", "); } public getTypeStyle(types: ElementTypeIri[]): TypeStyle { @@ -316,7 +324,7 @@ export class DiagramView { formatIri(iri: string): string { if (isEncodedBlank(iri)) { - return '(blank node)'; + return "(blank node)"; } return `<${iri}>`; } @@ -339,7 +347,7 @@ export class DiagramView { fillLinkTemplateDefaults(template); this.linkTemplates.set(linkType.id, template); - this.source.trigger('changeLinkTemplates', {}); + this.source.trigger("changeLinkTemplates", {}); return template; } @@ -347,7 +355,7 @@ export class DiagramView { if (this.disposed) { return; } - this.source.trigger('dispose', {}); + this.source.trigger("dispose", {}); this.listener.stopListening(); this.disposed = true; } @@ -361,7 +369,7 @@ export class DiagramView { return; } this._highlighter = value; - this.source.trigger('changeHighlight', { source: this, previous }); + this.source.trigger("changeHighlight", { source: this, previous }); } _setElementDecorator(decorator: ElementDecoratorResolver) { @@ -382,7 +390,7 @@ function sameRoutedLink(a: RoutedLink, b: RoutedLink) { } function getHueFromClasses( - classes: ReadonlyArray, + classes: readonly ElementTypeIri[], seed?: number ): number { let hash = seed; @@ -395,7 +403,7 @@ function getHueFromClasses( function fillLinkTemplateDefaults(template: LinkTemplate) { const defaults: Partial = { - markerTarget: { d: 'M0,0 L0,8 L9,4 z', width: 9, height: 8, fill: 'black' }, + markerTarget: { d: "M0,0 L0,8 L9,4 z", width: 9, height: 8, fill: "black" }, }; defaultsDeep(template, defaults); if (!template.renderLink) { @@ -404,7 +412,7 @@ function fillLinkTemplateDefaults(template: LinkTemplate) { } function defaultSelectLabel( - texts: ReadonlyArray, + texts: readonly LocalizedString[], language: string ): LocalizedString | undefined { if (texts.length === 0) { @@ -415,9 +423,9 @@ function defaultSelectLabel( for (const text of texts) { if (text.language === language) { return text; - } else if (text.language === '') { + } else if (text.language === "") { defaultValue = text; - } else if (text.language === 'en') { + } else if (text.language === "en") { englishValue = text; } } diff --git a/src/graph-explorer/editor/asyncModel.ts b/src/graph-explorer/editor/asyncModel.ts index 36221614..295e3d43 100644 --- a/src/graph-explorer/editor/asyncModel.ts +++ b/src/graph-explorer/editor/asyncModel.ts @@ -2,15 +2,14 @@ import { Dictionary, ElementModel, LinkModel, - ClassModel, LinkType, ElementIri, LinkTypeIri, ElementTypeIri, PropertyTypeIri, -} from '../data/model'; -import { DataProvider } from '../data/provider'; -import { PLACEHOLDER_LINK_TYPE } from '../data/schema'; +} from "../data/model"; +import { DataProvider } from "../data/provider"; +import { PLACEHOLDER_LINK_TYPE } from "../data/schema"; import { Element, @@ -19,32 +18,30 @@ import { RichProperty, FatLinkTypeEvents, Link, -} from '../diagram/elements'; -import { CommandHistory, Command } from '../diagram/history'; +} from "../diagram/elements"; +import { CommandHistory, Command } from "../diagram/history"; import { DiagramModel, DiagramModelEvents, placeholderDataFromIri, -} from '../diagram/model'; +} from "../diagram/model"; -import { EventSource, Events, Listener } from '../viewUtils/events'; +import { EventSource, Events, Listener } from "../viewUtils/events"; -import { DataFetcher } from './dataFetcher'; +import { DataFetcher } from "./dataFetcher"; import { LayoutData, - LayoutElement, makeLayoutData, - convertToSerializedDiagram, emptyDiagram, LinkTypeOptions, SerializedDiagram, makeSerializedDiagram, emptyLayoutData, -} from './serializedDiagram'; +} from "./serializedDiagram"; export interface GroupBy { linkType: string; - linkDirection: 'in' | 'out'; + linkDirection: "in" | "out"; } export interface AsyncModelEvents extends DiagramModelEvents { @@ -67,11 +64,11 @@ export class AsyncModel extends DiagramModel { private _dataProvider: DataProvider; private fetcher: DataFetcher; - private linkSettings: { [linkTypeId: string]: LinkTypeOptions } = {}; + private linkSettings: Record = {}; constructor( history: CommandHistory, - private groupByProperties: ReadonlyArray + private groupByProperties: readonly GroupBy[] ) { super(history); } @@ -87,8 +84,8 @@ export class AsyncModel extends DiagramModel { subscribeGraph() { super.subscribeGraph(); - this.graphListener.listen(this.graph.events, 'linkTypeEvent', (e) => { - if (e.key === 'changeVisibility') { + this.graphListener.listen(this.graph.events, "linkTypeEvent", (e) => { + if (e.key === "changeVisibility") { this.onLinkTypeVisibilityChanged(e.data[e.key], e.key); } }); @@ -102,7 +99,7 @@ export class AsyncModel extends DiagramModel { createNewDiagram(dataProvider: DataProvider): Promise { this.resetGraph(); this.setDataProvider(dataProvider); - this.asyncSource.trigger('loadingStart', { source: this }); + this.asyncSource.trigger("loadingStart", { source: this }); return this.dataProvider .linkTypes() @@ -114,9 +111,8 @@ export class AsyncModel extends DiagramModel { }); }) .catch((error) => { - // tslint:disable-next-line:no-console console.error(error); - this.asyncSource.trigger('loadingError', { source: this, error }); + this.asyncSource.trigger("loadingError", { source: this, error }); return Promise.reject(error); }); } @@ -130,7 +126,7 @@ export class AsyncModel extends DiagramModel { }): Promise { this.resetGraph(); this.setDataProvider(params.dataProvider); - this.asyncSource.trigger('loadingStart', { source: this }); + this.asyncSource.trigger("loadingStart", { source: this }); return this.dataProvider .linkTypes() @@ -151,12 +147,11 @@ export class AsyncModel extends DiagramModel { return Promise.all([loadingModels, requestingLinks]); }) .then(() => { - this.asyncSource.trigger('loadingSuccess', { source: this }); + this.asyncSource.trigger("loadingSuccess", { source: this }); }) .catch((error) => { - // tslint:disable-next-line:no-console console.error(error); - this.asyncSource.trigger('loadingError', { source: this, error }); + this.asyncSource.trigger("loadingError", { source: this, error }); return Promise.reject(error); }); } @@ -176,7 +171,7 @@ export class AsyncModel extends DiagramModel { ) .map( ({ id, visible, showLabel }): LinkTypeOptions => ({ - '@type': 'LinkTypeOptions', + "@type": "LinkTypeOptions", property: id, visible, showLabel, @@ -195,7 +190,7 @@ export class AsyncModel extends DiagramModel { return types; } - private setLinkSettings(settings: ReadonlyArray) { + private setLinkSettings(settings: readonly LinkTypeOptions[]) { if (!settings) { return; } @@ -203,7 +198,7 @@ export class AsyncModel extends DiagramModel { const { visible = true, showLabel = true } = setting; const linkTypeId = setting.property as LinkTypeIri; this.linkSettings[linkTypeId] = { - '@type': 'LinkTypeOptions', + "@type": "LinkTypeOptions", property: linkTypeId, visible, showLabel, @@ -219,7 +214,7 @@ export class AsyncModel extends DiagramModel { layoutData?: LayoutData; preloadedElements?: Dictionary; markLinksAsLayoutOnly: boolean; - allLinkTypes: ReadonlyArray; + allLinkTypes: readonly FatLinkType[]; hideUnusedLinkTypes?: boolean; }) { const { @@ -230,11 +225,11 @@ export class AsyncModel extends DiagramModel { } = params; const elementIrisToRequestData: ElementIri[] = []; - const usedLinkTypes: { [typeId: string]: FatLinkType } = {}; + const usedLinkTypes: Record = {}; for (const layoutElement of layoutData.elements) { const { - '@id': id, + "@id": id, iri, position, size, @@ -261,7 +256,7 @@ export class AsyncModel extends DiagramModel { for (const layoutLink of layoutData.links) { const { - '@id': id, + "@id": id, property, source, target, @@ -274,8 +269,8 @@ export class AsyncModel extends DiagramModel { new Link({ id, typeId: linkType.id, - sourceId: source['@id'], - targetId: target['@id'], + sourceId: source["@id"], + targetId: target["@id"], vertices, linkState, }) @@ -296,8 +291,8 @@ export class AsyncModel extends DiagramModel { } private hideUnusedLinkTypes( - allTypes: ReadonlyArray, - usedTypes: { [typeId: string]: FatLinkType } + allTypes: readonly FatLinkType[], + usedTypes: Record ) { for (const linkType of allTypes) { if (!usedTypes[linkType.id]) { @@ -309,7 +304,7 @@ export class AsyncModel extends DiagramModel { } } - requestElementData(elementIris: ReadonlyArray): Promise { + requestElementData(elementIris: readonly ElementIri[]): Promise { return this.fetcher.fetchElementData(elementIris); } @@ -362,7 +357,7 @@ export class AsyncModel extends DiagramModel { private onLinkTypeVisibilityChanged: Listener< FatLinkTypeEvents, - 'changeVisibility' + "changeVisibility" > = (e) => { if (e.source.visible) { if (!e.preventLoading) { @@ -384,7 +379,7 @@ export class AsyncModel extends DiagramModel { for (const linkModel of links) { this.createLinkType(linkModel.linkTypeId); allowToCreate = true; - this.asyncSource.trigger('createLoadedLink', { + this.asyncSource.trigger("createLoadedLink", { source: this, model: linkModel, cancel, @@ -432,15 +427,15 @@ export class AsyncModel extends DiagramModel { export function requestElementData( model: AsyncModel, - elementIris: ReadonlyArray + elementIris: readonly ElementIri[] ): Command { - return Command.effect('Fetch element data', () => { + return Command.effect("Fetch element data", () => { model.requestElementData(elementIris); }); } export function restoreLinksBetweenElements(model: AsyncModel): Command { - return Command.effect('Restore links between elements', () => { + return Command.effect("Restore links between elements", () => { model.requestLinksOfType(); }); } diff --git a/src/graph-explorer/editor/authoredEntity.tsx b/src/graph-explorer/editor/authoredEntity.tsx index c76fa9d6..80186b87 100644 --- a/src/graph-explorer/editor/authoredEntity.tsx +++ b/src/graph-explorer/editor/authoredEntity.tsx @@ -1,25 +1,25 @@ -import * as React from 'react'; +import * as React from "react"; -import { TemplateProps } from '../customization/props'; +import { TemplateProps } from "../customization/props"; -import { ElementModel } from '../data/model'; +import { ElementModel } from "../data/model"; -import { DiagramView } from '../diagram/view'; +import { DiagramView } from "../diagram/view"; import { PaperAreaContextTypes, PaperAreaContextWrapper, -} from '../diagram/paperArea'; +} from "../diagram/paperArea"; -import { Cancellation, CancellationToken } from '../viewUtils/async'; -import { Listener } from '../viewUtils/events'; +import { Cancellation, CancellationToken } from "../viewUtils/async"; +import { Listener } from "../viewUtils/events"; import { WorkspaceContextTypes, WorkspaceContextWrapper, -} from '../workspace/workspaceContext'; +} from "../workspace/workspaceContext"; -import { AuthoringState, AuthoringKind } from './authoringState'; -import { EditorController, EditorEvents } from './editorController'; +import { AuthoringState, AuthoringKind } from "./authoringState"; +import { EditorController, EditorEvents } from "./editorController"; export interface AuthoredEntityProps { templateProps: TemplateProps; @@ -60,7 +60,7 @@ export class AuthoredEntity extends React.Component< componentDidMount() { const { editor } = this.context.workspace; - editor.events.on('changeAuthoringState', this.onChangeAuthoringState); + editor.events.on("changeAuthoringState", this.onChangeAuthoringState); this.queryAllowedActions(); } @@ -76,21 +76,21 @@ export class AuthoredEntity extends React.Component< componentWillUnmount() { const { editor } = this.context.workspace; - editor.events.off('changeAuthoringState', this.onChangeAuthoringState); + editor.events.off("changeAuthoringState", this.onChangeAuthoringState); this.queryCancellation.abort(); } private onChangeAuthoringState: Listener< EditorEvents, - 'changeAuthoringState' + "changeAuthoringState" > = (e) => { - const { source: editor, previous } = e; - const iri = this.props.templateProps.data.id; - const current = editor.authoringState; - if (current.elements.get(iri) !== previous.elements.get(iri)) { - this.queryAllowedActions(); - } - }; + const { source: editor, previous } = e; + const iri = this.props.templateProps.data.id; + const current = editor.authoringState; + if (current.elements.get(iri) !== previous.elements.get(iri)) { + this.queryAllowedActions(); + } + }; private queryAllowedActions() { const { isExpanded, data } = this.props.templateProps; diff --git a/src/graph-explorer/editor/authoringState.ts b/src/graph-explorer/editor/authoringState.ts index 8eb15f55..747b3457 100644 --- a/src/graph-explorer/editor/authoringState.ts +++ b/src/graph-explorer/editor/authoringState.ts @@ -4,9 +4,9 @@ import { ElementIri, sameLink, hashLink, -} from '../data/model'; +} from "../data/model"; -import { HashMap, ReadonlyHashMap, cloneMap } from '../viewUtils/collections'; +import { HashMap, ReadonlyHashMap, cloneMap } from "../viewUtils/collections"; export interface AuthoringState { readonly elements: ReadonlyMap; @@ -16,8 +16,8 @@ export interface AuthoringState { export type AuthoringEvent = ElementChange | LinkChange; export enum AuthoringKind { - ChangeElement = 'changeElement', - ChangeLink = 'changeLink', + ChangeElement = "changeElement", + ChangeLink = "changeLink", } export interface ElementChange { @@ -162,7 +162,7 @@ export const AuthoringState = { after: LinkModel ): AuthoringState { if (!sameLink(before, after)) { - throw new Error('Cannot move link to another element or change its type'); + throw new Error("Cannot move link to another element or change its type"); } const newState = this.clone(state); const previous = state.links.get(before); diff --git a/src/graph-explorer/editor/dataFetcher.ts b/src/graph-explorer/editor/dataFetcher.ts index 633b9423..03cdbedc 100644 --- a/src/graph-explorer/editor/dataFetcher.ts +++ b/src/graph-explorer/editor/dataFetcher.ts @@ -7,13 +7,13 @@ import { ElementTypeIri, LinkTypeIri, PropertyTypeIri, -} from '../data/model'; -import { DataProvider } from '../data/provider'; +} from "../data/model"; +import { DataProvider } from "../data/provider"; -import { FatClassModel, FatLinkType, RichProperty } from '../diagram/elements'; -import { Graph } from '../diagram/graph'; +import { FatClassModel, FatLinkType, RichProperty } from "../diagram/elements"; +import { Graph } from "../diagram/graph"; -import { BufferingQueue } from '../viewUtils/async'; +import { BufferingQueue } from "../viewUtils/async"; export class DataFetcher { private classQueue = new BufferingQueue((classIds) => { @@ -34,7 +34,7 @@ export class DataFetcher { constructor(private graph: Graph, private dataProvider: DataProvider) {} - fetchElementData(elementIris: ReadonlyArray): Promise { + fetchElementData(elementIris: readonly ElementIri[]): Promise { if (elementIris.length === 0) { return Promise.resolve(); } @@ -43,9 +43,7 @@ export class DataFetcher { .then(this.onElementInfoLoaded); } - private onElementInfoLoaded = (elements: { - [elementId: string]: ElementModel; - }) => { + private onElementInfoLoaded = (elements: Record) => { for (const element of this.graph.getElements()) { const loadedModel = elements[element.iri]; if (loadedModel) { @@ -65,7 +63,7 @@ export class DataFetcher { continue; } model.setLabel(label.values); - if (typeof count === 'number') { + if (typeof count === "number") { model.setCount(count); } } @@ -92,9 +90,9 @@ export class DataFetcher { this.propertyTypeQueue.push(propertyType.id); } - private onPropertyTypesLoaded = (propertyModels: { - [propertyId: string]: PropertyModel; - }) => { + private onPropertyTypesLoaded = ( + propertyModels: Record + ) => { for (const propId in propertyModels) { if (!Object.prototype.hasOwnProperty.call(propertyModels, propId)) { continue; diff --git a/src/graph-explorer/editor/editLayer.tsx b/src/graph-explorer/editor/editLayer.tsx index 8325d1b8..fb87b252 100644 --- a/src/graph-explorer/editor/editLayer.tsx +++ b/src/graph-explorer/editor/editLayer.tsx @@ -1,25 +1,25 @@ -import * as React from 'react'; +import * as React from "react"; -import { MetadataApi } from '../data/metadataApi'; -import { ElementModel, LinkModel } from '../data/model'; +import { MetadataApi } from "../data/metadataApi"; +import { ElementModel, LinkModel } from "../data/model"; import { PLACEHOLDER_ELEMENT_TYPE, PLACEHOLDER_LINK_TYPE, -} from '../data/schema'; +} from "../data/schema"; -import { DiagramView } from '../diagram/view'; -import { LinkLayer, LinkMarkers } from '../diagram/linkLayer'; -import { Element, Link, LinkDirection } from '../diagram/elements'; -import { boundsOf, Vector, findElementAtPoint } from '../diagram/geometry'; -import { TransformedSvgCanvas } from '../diagram/paper'; -import { PaperWidgetProps } from '../diagram/paperArea'; +import { DiagramView } from "../diagram/view"; +import { LinkLayer, LinkMarkers } from "../diagram/linkLayer"; +import { Element, Link, LinkDirection } from "../diagram/elements"; +import { boundsOf, Vector, findElementAtPoint } from "../diagram/geometry"; +import { TransformedSvgCanvas } from "../diagram/paper"; +import { PaperWidgetProps } from "../diagram/paperArea"; -import { Cancellation, CancellationToken } from '../viewUtils/async'; -import { EventObserver } from '../viewUtils/events'; -import { Spinner } from '../viewUtils/spinner'; +import { Cancellation, CancellationToken } from "../viewUtils/async"; +import { EventObserver } from "../viewUtils/events"; +import { Spinner } from "../viewUtils/spinner"; -import { TemporaryState } from './temporaryState'; -import { EditorController } from './editorController'; +import { TemporaryState } from "./temporaryState"; +import { EditorController } from "./editorController"; export enum EditLayerMode { establishLink, @@ -70,21 +70,21 @@ export class EditLayer extends React.Component { ) { this.beginMovingLink(target as Link, point); } else { - throw new Error('Unknown edit mode'); + throw new Error("Unknown edit mode"); } this.forceUpdate(); this.queryCanLinkFrom(); this.queryCanDropOnCanvas(); - document.addEventListener('mousemove', this.onMouseMove); - document.addEventListener('mouseup', this.onMouseUp); + document.addEventListener("mousemove", this.onMouseMove); + document.addEventListener("mouseup", this.onMouseUp); } componentWillUnmount() { this.listener.stopListening(); this.cancellation.abort(); this.canDropOnElementCancellation.abort(); - document.removeEventListener('mousemove', this.onMouseMove); - document.removeEventListener('mouseup', this.onMouseUp); + document.removeEventListener("mousemove", this.onMouseMove); + document.removeEventListener("mouseup", this.onMouseUp); } private beginCreatingLink = (params: { sourceId: string; point: Vector }) => { @@ -117,12 +117,12 @@ export class EditLayer extends React.Component { mode === EditLayerMode.moveLinkTarget ) ) { - throw new Error('Unexpected edit mode for moving link'); + throw new Error("Unexpected edit mode for moving link"); } this.oldLink = target; editor.model.removeLink(target.id); - const { id, typeId, sourceId, targetId, ...otherProps } = target; + const { id: _id, typeId, sourceId, targetId, ...otherProps } = target; const temporaryElement = this.createTemporaryElement(startingPoint); const linkTemplate = new Link({ @@ -193,8 +193,7 @@ export class EditLayer extends React.Component { this.setState({ canLinkFrom }); }, (error) => { - // tslint:disable-next-line: no-console - console.error('Error calling canLinkElement:', error); + console.error("Error calling canLinkElement:", error); this.setState({ canLinkFrom: false }); } ); @@ -222,8 +221,7 @@ export class EditLayer extends React.Component { this.setState({ canDropOnCanvas }); }, (error) => { - // tslint:disable-next-line: no-console - console.error('Error calling canDropOnCanvas:', error); + console.error("Error calling canDropOnCanvas:", error); this.setState({ canDropOnCanvas: false }); } ); @@ -285,12 +283,8 @@ export class EditLayer extends React.Component { const { view, editor, mode } = this.props; try { - const { - targetElement, - canLinkFrom, - canDropOnCanvas, - canDropOnElement, - } = this.state; + const { targetElement, canLinkFrom, canDropOnCanvas, canDropOnElement } = + this.state; if (this.oldLink) { editor.model.addLink(this.oldLink); @@ -336,7 +330,7 @@ export class EditLayer extends React.Component { break; } default: { - throw new Error('Unknown edit mode'); + throw new Error("Unknown edit mode"); } } @@ -457,7 +451,7 @@ export class EditLayer extends React.Component { return ( {this.renderHighlight()} @@ -470,12 +464,8 @@ export class EditLayer extends React.Component { } private renderHighlight() { - const { - targetElement, - canLinkFrom, - canDropOnElement, - waitingForMetadata, - } = this.state; + const { targetElement, canLinkFrom, canDropOnElement, waitingForMetadata } = + this.state; if (!targetElement) { return null; @@ -493,7 +483,7 @@ export class EditLayer extends React.Component { @@ -501,14 +491,14 @@ export class EditLayer extends React.Component { ); } - const stroke = canLinkFrom && canDropOnElement ? '#5cb85c' : '#c9302c'; + const stroke = canLinkFrom && canDropOnElement ? "#5cb85c" : "#c9302c"; return ( @@ -516,12 +506,8 @@ export class EditLayer extends React.Component { } private renderCanDropIndicator() { - const { - targetElement, - canLinkFrom, - canDropOnCanvas, - waitingForMetadata, - } = this.state; + const { targetElement, canLinkFrom, canDropOnCanvas, waitingForMetadata } = + this.state; if (targetElement) { return null; diff --git a/src/graph-explorer/editor/editorController.tsx b/src/graph-explorer/editor/editorController.tsx index 6e843f48..4789a962 100644 --- a/src/graph-explorer/editor/editorController.tsx +++ b/src/graph-explorer/editor/editorController.tsx @@ -1,80 +1,74 @@ -import * as React from 'react'; +import * as React from "react"; -import { MetadataApi } from '../data/metadataApi'; -import { ValidationApi } from '../data/validationApi'; -import { - ElementModel, - LinkModel, - ElementIri, - sameLink, - sameElement, -} from '../data/model'; +import { MetadataApi } from "../data/metadataApi"; +import { ValidationApi } from "../data/validationApi"; +import { ElementModel, LinkModel, ElementIri, sameLink } from "../data/model"; import { setElementExpanded, setElementData, setLinkData, changeLinkTypeVisibility, -} from '../diagram/commands'; -import { Element, Link, LinkVertex, FatLinkType } from '../diagram/elements'; -import { Vector, boundsOf } from '../diagram/geometry'; -import { Command } from '../diagram/history'; +} from "../diagram/commands"; +import { Element, Link, LinkVertex, FatLinkType } from "../diagram/elements"; +import { Vector, boundsOf } from "../diagram/geometry"; +import { Command } from "../diagram/history"; import { PaperArea, PointerUpEvent, PaperWidgetProps, -} from '../diagram/paperArea'; -import { DiagramView, IriClickIntent, WidgetAttachment } from '../diagram/view'; +} from "../diagram/paperArea"; +import { DiagramView, IriClickIntent, WidgetAttachment } from "../diagram/view"; import { Events, EventSource, EventObserver, PropertyChange, -} from '../viewUtils/events'; +} from "../viewUtils/events"; -import { Dialog } from '../widgets/dialog'; +import { Dialog } from "../widgets/dialog"; import { ConnectionsMenu, PropertySuggestionHandler, -} from '../widgets/connectionsMenu'; -import { EditEntityForm } from '../forms/editEntityForm'; -import { EditElementTypeForm } from '../forms/editElementTypeForm'; -import { EditLinkForm } from '../forms/editLinkForm'; -import { EditLinkLabelForm } from '../forms/editLinkLabelForm'; -import { Halo } from '../widgets/halo'; -import { HaloLink } from '../widgets/haloLink'; -import { LinkStateWidget } from './linkStateWidget'; -import { ElementDecorator } from './elementDecorator'; +} from "../widgets/connectionsMenu"; +import { EditEntityForm } from "../forms/editEntityForm"; +import { EditElementTypeForm } from "../forms/editElementTypeForm"; +import { EditLinkForm } from "../forms/editLinkForm"; +import { EditLinkLabelForm } from "../forms/editLinkLabelForm"; +import { Halo } from "../widgets/halo"; +import { HaloLink } from "../widgets/haloLink"; +import { LinkStateWidget } from "./linkStateWidget"; +import { ElementDecorator } from "./elementDecorator"; import { placeElementsAround, forceLayout, applyLayout, -} from '../viewUtils/layout'; -import { Spinner, SpinnerProps } from '../viewUtils/spinner'; +} from "../viewUtils/layout"; +import { Spinner, SpinnerProps } from "../viewUtils/spinner"; import { AsyncModel, requestElementData, restoreLinksBetweenElements, -} from './asyncModel'; +} from "./asyncModel"; import { AuthoringState, AuthoringKind, AuthoringEvent, ElementChange, -} from './authoringState'; -import { TemporaryState } from './temporaryState'; -import { EditLayer, EditLayerMode } from './editLayer'; +} from "./authoringState"; +import { TemporaryState } from "./temporaryState"; +import { EditLayer, EditLayerMode } from "./editLayer"; import { ValidationState, changedElementsToValidate, validateElements, -} from './validation'; +} from "./validation"; -import { Cancellation } from '../viewUtils/async'; -import { makeMoveComparator, MoveDirection } from '../viewUtils/collections'; +import { Cancellation } from "../viewUtils/async"; +import { makeMoveComparator, MoveDirection } from "../viewUtils/collections"; export interface PropertyEditorOptions { elementData: ElementModel; @@ -109,15 +103,12 @@ export interface EditorOptions { export interface EditorEvents { changeMode: { source: EditorController }; - changeSelection: PropertyChange< - EditorController, - ReadonlyArray - >; + changeSelection: PropertyChange; changeAuthoringState: PropertyChange; changeValidationState: PropertyChange; changeTemporaryState: PropertyChange; toggleDialog: { isOpened: boolean }; - addElements: { elements: ReadonlyArray }; + addElements: { elements: readonly Element[] }; } export class EditorController { @@ -133,7 +124,7 @@ export class EditorController { private _authoringState = AuthoringState.empty; private _validationState = ValidationState.empty; private _temporaryState = TemporaryState.empty; - private _selection: ReadonlyArray = []; + private _selection: readonly SelectionItem[] = []; private dialogType: DialogTypes; private dialogTarget: SelectionItem; @@ -146,7 +137,7 @@ export class EditorController { this.view = view; this.options = options; - this.listener.listen(this.events, 'changeValidationState', (e) => { + this.listener.listen(this.events, "changeValidationState", (e) => { for (const element of this.model.elements) { const previous = e.previous.elements.get(element.iri); const current = this.validationState.elements.get(element.iri); @@ -155,7 +146,7 @@ export class EditorController { } } }); - this.listener.listen(this.events, 'changeAuthoringState', (e) => { + this.listener.listen(this.events, "changeAuthoringState", (e) => { if (this.options.validationApi) { const changedElements = changedElementsToValidate(e.previous, this); validateElements( @@ -178,41 +169,41 @@ export class EditorController { } _initializePaperComponents(paperArea: PaperArea) { - this.listener.listen(paperArea.events, 'pointerUp', (e) => + this.listener.listen(paperArea.events, "pointerUp", (e) => this.onPaperPointerUp(e) ); - this.listener.listen(this.model.events, 'changeCells', () => + this.listener.listen(this.model.events, "changeCells", () => this.onCellsChanged() ); - this.listener.listen(this.model.events, 'elementEvent', (e) => { - if (e.key === 'requestedGroupContent') { + this.listener.listen(this.model.events, "elementEvent", (e) => { + if (e.key === "requestedGroupContent") { this.loadGroupContent(e.data.requestedGroupContent.source); } }); - this.listener.listen(this.model.events, 'loadingStart', () => + this.listener.listen(this.model.events, "loadingStart", () => this.setSpinner({}) ); - this.listener.listen(this.model.events, 'loadingSuccess', () => { + this.listener.listen(this.model.events, "loadingSuccess", () => { this.setSpinner(undefined); const widget = ; this.view.setPaperWidget({ - key: 'states', + key: "states", widget, attachment: WidgetAttachment.OverLinks, }); }); - this.listener.listen(this.model.events, 'loadingError', ({ error }) => { + this.listener.listen(this.model.events, "loadingError", ({ error }) => { const statusText = error ? error.message : undefined; this.setSpinner({ statusText, errorOccured: true }); }); if (!this.options.disableHalo) { this.configureHalo(); - document.addEventListener('keyup', this.onKeyUp); - this.listener.listen(this.view.events, 'dispose', () => { - document.removeEventListener('keyup', this.onKeyUp); + document.addEventListener("keyup", this.onKeyUp); + this.listener.listen(this.view.events, "dispose", () => { + document.removeEventListener("keyup", this.onKeyUp); }); } } @@ -232,7 +223,7 @@ export class EditorController { this._metadataApi = value; if (Boolean(value) !== Boolean(previous)) { // authoring mode changed - this.source.trigger('changeMode', { source: this }); + this.source.trigger("changeMode", { source: this }); } } @@ -249,9 +240,9 @@ export class EditorController { private updateAuthoringState(state: AuthoringState): Command { const previous = this._authoringState; - return Command.create('Create or delete entities and links', () => { + return Command.create("Create or delete entities and links", () => { this._authoringState = state; - this.source.trigger('changeAuthoringState', { source: this, previous }); + this.source.trigger("changeAuthoringState", { source: this, previous }); return this.updateAuthoringState(previous); }); } @@ -265,7 +256,7 @@ export class EditorController { return; } this._validationState = value; - this.source.trigger('changeValidationState', { source: this, previous }); + this.source.trigger("changeValidationState", { source: this, previous }); } get temporaryState() { @@ -277,19 +268,19 @@ export class EditorController { return; } this._temporaryState = value; - this.source.trigger('changeTemporaryState', { source: this, previous }); + this.source.trigger("changeTemporaryState", { source: this, previous }); } get selection() { return this._selection; } - setSelection(value: ReadonlyArray) { + setSelection(value: readonly SelectionItem[]) { const previous = this._selection; if (previous === value) { return; } this._selection = value; - this.source.trigger('changeSelection', { source: this, previous }); + this.source.trigger("changeSelection", { source: this, previous }); } cancelSelection() { @@ -300,7 +291,7 @@ export class EditorController { const DELETE_KEY_CODE = 46; if ( e.keyCode === DELETE_KEY_CODE && - document.activeElement.localName !== 'input' + document.activeElement.localName !== "input" ) { this.removeSelectedElements(); } @@ -316,7 +307,7 @@ export class EditorController { this.removeItems(itemsToRemove); } - removeItems(items: ReadonlyArray) { + removeItems(items: readonly SelectionItem[]) { const batch = this.model.history.startBatch(); const deletedElementIris = new Set(); @@ -406,7 +397,7 @@ export class EditorController { return; } - this.listener.listen(this.events, 'changeSelection', () => { + this.listener.listen(this.events, "changeSelection", () => { const selected = this.selection.length === 1 ? this.selection[0] : undefined; if (this.dialogTarget && selected !== this.dialogTarget) { @@ -416,9 +407,13 @@ export class EditorController { this.renderDefaultHalo(); }); - this.listener.listen(this.events, 'toggleDialog', ({ isOpened }) => { - this.renderDefaultHalo(); - }); + this.listener.listen( + this.events, + "toggleDialog", + ({ isOpened: _isOpened }) => { + this.renderDefaultHalo(); + } + ); this.renderDefaultHalo(); } @@ -450,6 +445,8 @@ export class EditorController { target={selected} onRemove={() => this.removeSelectedElements()} onExpand={() => { + console.log("model", this.model); + console.log("selected", selected); this.model.history.execute( setElementExpanded(selected, !selected.isExpanded) ); @@ -513,7 +510,7 @@ export class EditorController { } this.view.setPaperWidget({ - key: 'halo', + key: "halo", widget: halo, attachment: WidgetAttachment.OverElements, }); @@ -633,7 +630,7 @@ export class EditorController { this.removeTemporaryLink(link); const batch = this.model.history.startBatch( - isNewElement ? 'Create new entity' : 'Link to entity' + isNewElement ? "Create new entity" : "Link to entity" ); this.model.addElement(target); @@ -675,7 +672,7 @@ export class EditorController { target, dialogType, content, - caption: 'Establish New Connection', + caption: "Establish New Connection", onClose: onCancel, }); } @@ -721,8 +718,8 @@ export class EditorController { /> ); const caption = this.temporaryState.links.has(link.data) - ? 'Establish New Connection' - : 'Edit Connection'; + ? "Establish New Connection" + : "Edit Connection"; this.showDialog({ target: link, dialogType, @@ -754,7 +751,7 @@ export class EditorController { /> ), size, - caption: 'Edit Link Label', + caption: "Edit Link Label", offset: { x: 25, y: -size.height / 2 }, calculatePosition: () => { const { x, y, width, height } = link.labelBounds; @@ -802,11 +799,11 @@ export class EditorController { ); this.view.setPaperWidget({ - key: 'dialog', + key: "dialog", widget: dialog, attachment: WidgetAttachment.OverElements, }); - this.source.trigger('toggleDialog', { isOpened: true }); + this.source.trigger("toggleDialog", { isOpened: true }); } hideDialog() { @@ -823,19 +820,19 @@ export class EditorController { this.dialogType = undefined; this.dialogTarget = undefined; this.view.setPaperWidget({ - key: 'dialog', + key: "dialog", widget: undefined, attachment: WidgetAttachment.OverElements, }); - this.source.trigger('toggleDialog', { isOpened: false }); + this.source.trigger("toggleDialog", { isOpened: false }); } } onDragDrop( - dragged: ReadonlyArray, + dragged: readonly (ElementIri | ElementModel)[], paperPosition: Vector ) { - const batch = this.model.history.startBatch('Drag and drop onto diagram'); + const batch = this.model.history.startBatch("Drag and drop onto diagram"); const placedElements = placeElements(this.view, dragged, paperPosition); const irisToLoad = placedElements.map((elem) => elem.iri); batch.history.execute(requestElementData(this.model, irisToLoad)); @@ -848,7 +845,7 @@ export class EditorController { this.setSelection(placedElements); - this.source.trigger('addElements', { elements: placedElements }); + this.source.trigger("addElements", { elements: placedElements }); } onAddElementsInConnectionMenu( @@ -867,7 +864,7 @@ export class EditorController { targetElement, prefferedLinksLength: 300, }).then(() => { - this.source.trigger('addElements', { elements }); + this.source.trigger("addElements", { elements }); }); if (linkType && !linkType.visible) { @@ -890,7 +887,7 @@ export class EditorController { return this.model.loadEmbeddedElements(element.iri).then((models) => { const batch = this.model.history.startBatch(); const elementIris = Object.keys(models) as ElementIri[]; - const elements = elementIris.map((key) => + elementIris.map((key) => this.model.createElement(models[key], element.id) ); batch.discard(); @@ -919,7 +916,7 @@ export class EditorController { elementModel: ElementModel; temporary?: boolean; }): Element { - const batch = this.model.history.startBatch('Create new entity'); + const batch = this.model.history.startBatch("Create new entity"); const element = this.model.createElement(elementModel); element.setExpanded(true); @@ -944,7 +941,7 @@ export class EditorController { return; } const oldData = elements[0].data; - const batch = this.model.history.startBatch('Edit entity'); + const batch = this.model.history.startBatch("Edit entity"); const newState = AuthoringState.changeElement( this._authoringState, @@ -969,7 +966,7 @@ export class EditorController { return; } - const batch = this.model.history.startBatch('Delete entity'); + const batch = this.model.history.startBatch("Delete entity"); const model = elements[0].data; const event = state.elements.get(elementIri); @@ -999,10 +996,10 @@ export class EditorController { base.targetId ); if (existingLink) { - throw Error('The link already exists'); + throw Error("The link already exists"); } - const batch = this.model.history.startBatch('Create new link'); + const batch = this.model.history.startBatch("Create new link"); const addedLink = this.model.addLink(base); if (!temporary) { @@ -1032,7 +1029,7 @@ export class EditorController { } changeLink(oldData: LinkModel, newData: LinkModel) { - const batch = this.model.history.startBatch('Change link'); + const batch = this.model.history.startBatch("Change link"); if (sameLink(oldData, newData)) { this.model.history.execute(setLinkData(this.model, oldData, newData)); this.setAuthoringState( @@ -1056,7 +1053,7 @@ export class EditorController { moveLinkSource(params: { link: Link; newSource: Element }): Link { const { link, newSource } = params; - const batch = this.model.history.startBatch('Move link to another element'); + const batch = this.model.history.startBatch("Move link to another element"); this.changeLink(link.data, { ...link.data, sourceId: newSource.iri }); const newLink = this.model.findLink( link.typeId, @@ -1070,7 +1067,7 @@ export class EditorController { moveLinkTarget(params: { link: Link; newTarget: Element }): Link { const { link, newTarget } = params; - const batch = this.model.history.startBatch('Move link to another element'); + const batch = this.model.history.startBatch("Move link to another element"); this.changeLink(link.data, { ...link.data, targetId: newTarget.iri }); const newLink = this.model.findLink( link.typeId, @@ -1087,7 +1084,7 @@ export class EditorController { if (AuthoringState.isDeletedLink(state, model)) { return; } - const batch = this.model.history.startBatch('Delete link'); + const batch = this.model.history.startBatch("Delete link"); const newState = AuthoringState.deleteLink(state, model); if (AuthoringState.isNewLink(state, model)) { this.model.links @@ -1106,7 +1103,7 @@ export class EditorController { const { target, mode, point } = params; const onFinishEditing = () => { this.view.setPaperWidget({ - key: 'editLayer', + key: "editLayer", widget: undefined, attachment: WidgetAttachment.OverElements, }); @@ -1123,7 +1120,7 @@ export class EditorController { /> ); this.view.setPaperWidget({ - key: 'editLayer', + key: "editLayer", widget: editLayer, attachment: WidgetAttachment.OverElements, }); @@ -1168,7 +1165,7 @@ export class EditorController { return; } - const batch = this.model.history.startBatch('Discard change'); + const batch = this.model.history.startBatch("Discard change"); if (event.type === AuthoringKind.ChangeElement) { if (event.deleted) { /* nothing */ @@ -1204,7 +1201,7 @@ interface LoadingWidgetProps extends PaperWidgetProps { } class LoadingWidget extends React.Component { - static readonly Key = 'loadingWidget'; + static readonly Key = "loadingWidget"; render() { const { spinnerProps, paperArea } = this.props; @@ -1226,7 +1223,7 @@ class LoadingWidget extends React.Component { function placeElements( view: DiagramView, - dragged: ReadonlyArray, + dragged: readonly (ElementIri | ElementModel)[], position: Vector ): Element[] { const elements = dragged.map((item) => view.model.createElement(item)); @@ -1268,7 +1265,7 @@ function makeLinkWithDirection(original: Link, data: LinkModel): Link { data.sourceId === original.data.targetId ) ) { - throw new Error('New link source IRI is unrelated to original link'); + throw new Error("New link source IRI is unrelated to original link"); } if ( !( @@ -1276,7 +1273,7 @@ function makeLinkWithDirection(original: Link, data: LinkModel): Link { data.targetId === original.data.targetId ) ) { - throw new Error('New link target IRI is unrelated to original link'); + throw new Error("New link target IRI is unrelated to original link"); } const sourceId = data.sourceId === original.data.sourceId diff --git a/src/graph-explorer/editor/elementDecorator.tsx b/src/graph-explorer/editor/elementDecorator.tsx index 9caf28fe..183b3f3f 100644 --- a/src/graph-explorer/editor/elementDecorator.tsx +++ b/src/graph-explorer/editor/elementDecorator.tsx @@ -1,15 +1,15 @@ -import * as React from 'react'; +import * as React from "react"; -import { EventObserver } from '../viewUtils/events'; -import { HtmlSpinner } from '../viewUtils/spinner'; +import { EventObserver } from "../viewUtils/events"; +import { HtmlSpinner } from "../viewUtils/spinner"; -import { Element } from '../diagram/elements'; -import { DiagramView } from '../diagram/view'; -import { Vector } from '../diagram/geometry'; +import { Element } from "../diagram/elements"; +import { DiagramView } from "../diagram/view"; +import { Vector } from "../diagram/geometry"; -import { EditorController } from './editorController'; -import { ElementChange } from './authoringState'; -import { ElementValidation, LinkValidation } from './validation'; +import { EditorController } from "./editorController"; +import { ElementChange } from "./authoringState"; +import { ElementValidation, LinkValidation } from "./validation"; const CLASS_NAME = `graph-explorer-authoring-state`; @@ -44,29 +44,29 @@ export class ElementDecorator extends React.Component< componentDidMount() { const { model, editor } = this.props; - this.listener.listen(model.events, 'changeSize', () => this.forceUpdate()); - this.listener.listen(editor.events, 'changeAuthoringState', (e) => { + this.listener.listen(model.events, "changeSize", () => this.forceUpdate()); + this.listener.listen(editor.events, "changeAuthoringState", (e) => { const state = editor.authoringState.elements.get(model.iri); if (state === e.previous.elements.get(model.iri)) { return; } this.setState({ state }); }); - this.listener.listen(editor.events, 'changeValidationState', (e) => { + this.listener.listen(editor.events, "changeValidationState", (e) => { const validation = editor.validationState.elements.get(model.iri); if (validation === e.previous.elements.get(model.iri)) { return; } this.setState({ validation }); }); - this.listener.listen(editor.events, 'changeTemporaryState', (e) => { + this.listener.listen(editor.events, "changeTemporaryState", (e) => { const isTemporary = editor.temporaryState.elements.has(model.iri); if (isTemporary === e.previous.elements.has(model.iri)) { return; } this.setState({ isTemporary }); }); - this.listener.listen(model.events, 'changeData', (e) => { + this.listener.listen(model.events, "changeData", (e) => { if (e.previous.id !== model.iri) { this.setState({ isTemporary: editor.temporaryState.elements.has(model.iri), @@ -169,7 +169,7 @@ export class ElementDecorator extends React.Component< return error.message; } }) - .join('\n'); + .join("\n"); return this.renderErrorIcon(title, validation); } @@ -185,14 +185,14 @@ export class ElementDecorator extends React.Component< let title: string; if (state.deleted) { - statusText = 'Delete'; - title = 'Revert deletion of the element'; + statusText = "Delete"; + title = "Revert deletion of the element"; } else if (!state.before) { - statusText = 'New'; - title = 'Revert creation of the element'; + statusText = "New"; + title = "Revert creation of the element"; } else { - statusText = 'Change'; - title = 'Revert all changes in properties of the element'; + statusText = "Change"; + title = "Revert all changes in properties of the element"; } if (statusText && title) { @@ -241,15 +241,15 @@ export class ElementDecorator extends React.Component< return null; } return ( -
+
{outlines ? ( diff --git a/src/graph-explorer/editor/linkStateWidget.tsx b/src/graph-explorer/editor/linkStateWidget.tsx index 79427d2b..1484d6e8 100644 --- a/src/graph-explorer/editor/linkStateWidget.tsx +++ b/src/graph-explorer/editor/linkStateWidget.tsx @@ -1,26 +1,26 @@ -import * as React from 'react'; +import * as React from "react"; -import { LinkModel } from '../data/model'; +import { LinkModel } from "../data/model"; import { Vector, computePolyline, getPointAlongPolyline, computePolylineLength, -} from '../diagram/geometry'; -import { TransformedSvgCanvas } from '../diagram/paper'; -import { PaperWidgetProps } from '../diagram/paperArea'; -import { DiagramView, RenderingLayer } from '../diagram/view'; -import { Link } from '../diagram/elements'; +} from "../diagram/geometry"; +import { TransformedSvgCanvas } from "../diagram/paper"; +import { PaperWidgetProps } from "../diagram/paperArea"; +import { DiagramView, RenderingLayer } from "../diagram/view"; +import { Link } from "../diagram/elements"; -import { Debouncer } from '../viewUtils/async'; -import { EventObserver } from '../viewUtils/events'; -import { HtmlSpinner } from '../viewUtils/spinner'; +import { Debouncer } from "../viewUtils/async"; +import { EventObserver } from "../viewUtils/events"; +import { HtmlSpinner } from "../viewUtils/spinner"; -import { EditorController } from './editorController'; +import { EditorController } from "./editorController"; -import { AuthoringKind, AuthoringState } from './authoringState'; -import { LinkValidation, ElementValidation } from './validation'; +import { AuthoringKind, AuthoringState } from "./authoringState"; +import { LinkValidation, ElementValidation } from "./validation"; export interface Props extends PaperWidgetProps { view: DiagramView; @@ -52,37 +52,37 @@ export class LinkStateWidget extends React.Component { private listenEvents() { const { editor, view } = this.props; - this.listener.listen(editor.model.events, 'elementEvent', ({ data }) => { + this.listener.listen(editor.model.events, "elementEvent", ({ data }) => { if (data.changeSize || data.changePosition) { this.scheduleUpdate(); } }); - this.listener.listen(editor.model.events, 'linkEvent', ({ data }) => { + this.listener.listen(editor.model.events, "linkEvent", ({ data }) => { if (data.changeVertices || data.changeLabelBounds) { this.scheduleUpdate(); } }); this.listener.listen( editor.model.events, - 'changeCells', + "changeCells", this.scheduleUpdate ); this.listener.listen( editor.events, - 'changeAuthoringState', + "changeAuthoringState", this.scheduleUpdate ); this.listener.listen( editor.events, - 'changeTemporaryState', + "changeTemporaryState", this.scheduleUpdate ); this.listener.listen( editor.events, - 'changeValidationState', + "changeValidationState", this.scheduleUpdate ); - this.listener.listen(view.events, 'syncUpdate', ({ layer }) => { + this.listener.listen(view.events, "syncUpdate", ({ layer }) => { if (layer === RenderingLayer.Editor) { this.delayedUpdate.runSynchronously(); } @@ -99,7 +99,7 @@ export class LinkStateWidget extends React.Component { private calculateLinkPath(link: Link) { const polyline = this.calculatePolyline(link); - return 'M' + polyline.map(({ x, y }) => `${x},${y}`).join(' L'); + return "M" + polyline.map(({ x, y }) => `${x},${y}`).join(" L"); } private calculatePolyline(link: Link) { @@ -128,14 +128,14 @@ export class LinkStateWidget extends React.Component { let title: string; if (state.deleted) { - statusText = 'Delete'; - title = 'Revert deletion of the link'; + statusText = "Delete"; + title = "Revert deletion of the link"; } else if (!state.before) { - statusText = 'New'; - title = 'Revert creation of the link'; + statusText = "New"; + title = "Revert creation of the link"; } else { - statusText = 'Change'; - title = 'Revert all changes in properties of the link'; + statusText = "Change"; + title = "Revert all changes in properties of the link"; } if (statusText && title) { @@ -192,11 +192,11 @@ export class LinkStateWidget extends React.Component { ); } @@ -213,17 +213,17 @@ export class LinkStateWidget extends React.Component { const path = this.calculateLinkPath(link); let color: string; if (isDeletedLink) { - color = 'red'; + color = "red"; } else if (isUncertainLink) { - color = 'blue'; + color = "blue"; } else if (event && event.type === AuthoringKind.ChangeLink) { - color = event.before ? 'blue' : 'green'; + color = event.before ? "blue" : "green"; } return ( { if (!validation) { return null; } - const title = validation.errors.map((error) => error.message).join('\n'); + const title = validation.errors.map((error) => error.message).join("\n"); return this.renderErrorIcon(title, validation); } @@ -283,7 +283,7 @@ export class LinkStateWidget extends React.Component { return null; } const htmlTransformStyle: React.CSSProperties = { - position: 'absolute', + position: "absolute", left: 0, top: 0, transform: `scale(${scale},${scale})translate(${originX}px,${originY}px)`, @@ -292,7 +292,7 @@ export class LinkStateWidget extends React.Component {
{this.renderLinkStateHighlighting()} diff --git a/src/graph-explorer/editor/serializedDiagram.ts b/src/graph-explorer/editor/serializedDiagram.ts index de49b786..78db7baa 100644 --- a/src/graph-explorer/editor/serializedDiagram.ts +++ b/src/graph-explorer/editor/serializedDiagram.ts @@ -1,39 +1,39 @@ -import { pick } from 'lodash'; +import { pick } from "lodash"; -import { ElementIri, LinkTypeIri } from '../data/model'; -import { DIAGRAM_CONTEXT_URL_V1 } from '../data/schema'; +import { ElementIri, LinkTypeIri } from "../data/model"; +import { DIAGRAM_CONTEXT_URL_V1 } from "../data/schema"; import { Element, ElementTemplateState, Link, LinkTemplateState, -} from '../diagram/elements'; -import { Vector, Size } from '../diagram/geometry'; +} from "../diagram/elements"; +import { Vector, Size } from "../diagram/geometry"; export interface SerializedDiagram { - '@context': any; - '@type': 'Diagram'; + "@context": any; + "@type": "Diagram"; layoutData: LayoutData; - linkTypeOptions?: ReadonlyArray; + linkTypeOptions?: readonly LinkTypeOptions[]; } export interface LinkTypeOptions { - '@type': 'LinkTypeOptions'; + "@type": "LinkTypeOptions"; property: LinkTypeIri; visible: boolean; showLabel?: boolean; } export interface LayoutData { - '@type': 'Layout'; - elements: ReadonlyArray; - links: ReadonlyArray; + "@type": "Layout"; + elements: readonly LayoutElement[]; + links: readonly LayoutLink[]; } export interface LayoutElement { - '@type': 'Element'; - '@id': string; + "@type": "Element"; + "@id": string; iri: ElementIri; position: Vector; size?: Size; @@ -44,44 +44,44 @@ export interface LayoutElement { } export interface LayoutLink { - '@type': 'Link'; - '@id': string; + "@type": "Link"; + "@id": string; property: LinkTypeIri; - source: { '@id': string }; - target: { '@id': string }; - vertices?: ReadonlyArray; + source: { "@id": string }; + target: { "@id": string }; + vertices?: readonly Vector[]; linkState?: LinkTemplateState; } const serializedCellProperties = [ // common properties - 'id', - 'type', + "id", + "type", // element properties - 'size', - 'angle', - 'isExpanded', - 'position', - 'iri', - 'group', + "size", + "angle", + "isExpanded", + "position", + "iri", + "group", // link properties - 'typeId', - 'source', - 'target', - 'vertices', + "typeId", + "source", + "target", + "vertices", ]; export function emptyDiagram(): SerializedDiagram { return { - '@context': DIAGRAM_CONTEXT_URL_V1, - '@type': 'Diagram', + "@context": DIAGRAM_CONTEXT_URL_V1, + "@type": "Diagram", layoutData: emptyLayoutData(), linkTypeOptions: [], }; } export function emptyLayoutData(): LayoutData { - return { '@type': 'Layout', elements: [], links: [] }; + return { "@type": "Layout", elements: [], links: [] }; } export function convertToSerializedDiagram(params: { @@ -97,15 +97,15 @@ export function convertToSerializedDiagram(params: { // normalize type if ( - newCell.type === 'GraphExplorer.Element' || - newCell.type === 'element' + newCell.type === "GraphExplorer.Element" || + newCell.type === "element" ) { - newCell.type = 'Element'; + newCell.type = "Element"; } // normalize type - if (newCell.type === 'link') { - newCell.type = 'Link'; + if (newCell.type === "link") { + newCell.type = "Link"; } if (!newCell.iri) { @@ -113,22 +113,22 @@ export function convertToSerializedDiagram(params: { } // rename to @id and @type to match JSON-LD - newCell['@id'] = newCell.id; + newCell["@id"] = newCell.id; delete newCell.id; - newCell['@type'] = newCell.type; + newCell["@type"] = newCell.type; delete newCell.type; // make two separate lists - switch (newCell['@type']) { - case 'Element': + switch (newCell["@type"]) { + case "Element": elements.push(newCell); break; - case 'Link': + case "Link": // rename internal IDs - newCell.source['@id'] = newCell.source.id; + newCell.source["@id"] = newCell.source.id; delete newCell.source.id; - newCell.target['@id'] = newCell.target.id; + newCell.target["@id"] = newCell.target.id; delete newCell.target.id; // rename typeID to property newCell.property = newCell.typeId; @@ -140,14 +140,14 @@ export function convertToSerializedDiagram(params: { return { ...emptyDiagram(), - layoutData: { '@type': 'Layout', elements, links }, + layoutData: { "@type": "Layout", elements, links }, linkTypeOptions: params.linkTypeOptions, }; } export function makeSerializedDiagram(params: { layoutData?: LayoutData; - linkTypeOptions?: ReadonlyArray; + linkTypeOptions?: readonly LinkTypeOptions[]; }): SerializedDiagram { const diagram: SerializedDiagram = { ...emptyDiagram(), @@ -161,13 +161,13 @@ export function makeSerializedDiagram(params: { } export function makeLayoutData( - modelElements: ReadonlyArray, - modelLinks: ReadonlyArray + modelElements: readonly Element[], + modelLinks: readonly Link[] ): LayoutData { const elements = modelElements.map( (element): LayoutElement => ({ - '@type': 'Element', - '@id': element.id, + "@type": "Element", + "@id": element.id, iri: element.iri, position: element.position, size: element.size, @@ -178,14 +178,14 @@ export function makeLayoutData( ); const links = modelLinks.map( (link): LayoutLink => ({ - '@type': 'Link', - '@id': link.id, + "@type": "Link", + "@id": link.id, property: link.typeId, - source: { '@id': link.sourceId }, - target: { '@id': link.targetId }, + source: { "@id": link.sourceId }, + target: { "@id": link.targetId }, vertices: [...link.vertices], linkState: link.linkState, }) ); - return { '@type': 'Layout', elements, links }; + return { "@type": "Layout", elements, links }; } diff --git a/src/graph-explorer/editor/temporaryState.ts b/src/graph-explorer/editor/temporaryState.ts index 4c18b320..f8d03bf3 100644 --- a/src/graph-explorer/editor/temporaryState.ts +++ b/src/graph-explorer/editor/temporaryState.ts @@ -4,9 +4,9 @@ import { ElementIri, sameLink, hashLink, -} from '../data/model'; +} from "../data/model"; -import { HashMap, ReadonlyHashMap, cloneMap } from '../viewUtils/collections'; +import { HashMap, ReadonlyHashMap, cloneMap } from "../viewUtils/collections"; export interface TemporaryState { readonly elements: ReadonlyMap; diff --git a/src/graph-explorer/editor/validation.ts b/src/graph-explorer/editor/validation.ts index 9232798b..df635627 100644 --- a/src/graph-explorer/editor/validation.ts +++ b/src/graph-explorer/editor/validation.ts @@ -1,14 +1,14 @@ -import { ElementIri, LinkModel, hashLink, sameLink } from '../data/model'; +import { ElementIri, LinkModel, hashLink, sameLink } from "../data/model"; import { ValidationApi, ValidationEvent, ElementError, LinkError, -} from '../data/validationApi'; -import { CancellationToken } from '../viewUtils/async'; -import { HashMap, ReadonlyHashMap, cloneMap } from '../viewUtils/collections'; -import { AuthoringState } from './authoringState'; -import { EditorController } from './editorController'; +} from "../data/validationApi"; +import { CancellationToken } from "../viewUtils/async"; +import { HashMap, ReadonlyHashMap, cloneMap } from "../viewUtils/collections"; +import { AuthoringState } from "./authoringState"; +import { EditorController } from "./editorController"; export interface ValidationState { readonly elements: ReadonlyMap; @@ -17,12 +17,12 @@ export interface ValidationState { export interface ElementValidation { readonly loading: boolean; - readonly errors: ReadonlyArray; + readonly errors: readonly ElementError[]; } export interface LinkValidation { readonly loading: boolean; - readonly errors: ReadonlyArray; + readonly errors: readonly LinkError[]; } const empty: ValidationState = createMutable(); @@ -39,7 +39,7 @@ function createMutable() { function setElementErrors( state: ValidationState, target: ElementIri, - errors: ReadonlyArray + errors: readonly ElementError[] ): ValidationState { const elements = cloneMap(state.elements); if (errors.length > 0) { @@ -53,7 +53,7 @@ function setElementErrors( function setLinkErrors( state: ValidationState, target: LinkModel, - errors: ReadonlyArray + errors: readonly LinkError[] ): ValidationState { const links = state.links.clone(); if (errors.length > 0) { @@ -174,13 +174,13 @@ export function validateElements( } async function processValidationResult( - result: Promise | null>, + result: Promise<(ElementError | LinkError)[] | null>, previousElement: ElementValidation, previousLink: LinkValidation, e: ValidationEvent, editor: EditorController ) { - let allErrors: Array | null; + let allErrors: (ElementError | LinkError)[] | null; try { allErrors = await result; if (allErrors === null) { @@ -188,11 +188,10 @@ async function processValidationResult( return; } } catch (err) { - // tslint:disable-next-line:no-console console.error(`Failed to validate element`, e.target, err); allErrors = [ { - type: 'element', + type: "element", target: e.target.id, message: `Failed to validate element`, }, @@ -204,9 +203,9 @@ async function processValidationResult( e.outboundLinks.forEach((link) => linkErrors.set(link, [])); for (const error of allErrors) { - if (error.type === 'element' && error.target === e.target.id) { + if (error.type === "element" && error.target === e.target.id) { elementErrors.push(error); - } else if (error.type === 'link' && linkErrors.has(error.target)) { + } else if (error.type === "link" && linkErrors.has(error.target)) { linkErrors.get(error.target).push(error); } } diff --git a/src/graph-explorer/emptyModule.ts b/src/graph-explorer/emptyModule.ts index bbaa10d6..5cec1fb8 100644 --- a/src/graph-explorer/emptyModule.ts +++ b/src/graph-explorer/emptyModule.ts @@ -1,3 +1,2 @@ /** Empty module for conditional compilation. */ -// tslint:disable-next-line:no-default-export export default undefined; diff --git a/src/graph-explorer/forms/editElementTypeForm.tsx b/src/graph-explorer/forms/editElementTypeForm.tsx index 8818f470..f4adcf46 100644 --- a/src/graph-explorer/forms/editElementTypeForm.tsx +++ b/src/graph-explorer/forms/editElementTypeForm.tsx @@ -1,28 +1,28 @@ -import * as React from 'react'; +import * as React from "react"; -import { EditorController } from '../editor/editorController'; -import { DiagramView } from '../diagram/view'; -import { ElementModel, LinkModel } from '../data/model'; -import { MetadataApi } from '../data/metadataApi'; -import { LinkDirection } from '../diagram/elements'; +import { EditorController } from "../editor/editorController"; +import { DiagramView } from "../diagram/view"; +import { ElementModel, LinkModel } from "../data/model"; +import { MetadataApi } from "../data/metadataApi"; +import { LinkDirection } from "../diagram/elements"; -import { Cancellation } from '../viewUtils/async'; -import { HtmlSpinner } from '../viewUtils/spinner'; +import { Cancellation } from "../viewUtils/async"; +import { HtmlSpinner } from "../viewUtils/spinner"; -import { ProgressBar, ProgressState } from '../widgets/progressBar'; +import { ProgressBar, ProgressState } from "../widgets/progressBar"; import { ElementTypeSelector, ElementValue, validateElementType, -} from './elementTypeSelector'; +} from "./elementTypeSelector"; import { LinkTypeSelector, LinkValue, validateLinkType, -} from './linkTypeSelector'; +} from "./linkTypeSelector"; -const CLASS_NAME = 'graph-explorer-edit-form'; +const CLASS_NAME = "graph-explorer-edit-form"; export interface Props { editor: EditorController; @@ -183,7 +183,7 @@ export class EditElementTypeForm extends React.Component { }} /> {elementValue.loading ? ( -
+
 Loading entity...
diff --git a/src/graph-explorer/forms/editEntityForm.tsx b/src/graph-explorer/forms/editEntityForm.tsx index bb82551c..003ad3cc 100644 --- a/src/graph-explorer/forms/editEntityForm.tsx +++ b/src/graph-explorer/forms/editEntityForm.tsx @@ -1,18 +1,17 @@ -import * as React from 'react'; +import * as React from "react"; -import { DiagramView } from '../diagram/view'; +import { DiagramView } from "../diagram/view"; import { ElementModel, LocalizedString, PropertyTypeIri, Property, - isIriProperty, LiteralProperty, isLiteralProperty, ElementIri, -} from '../data/model'; +} from "../data/model"; -const CLASS_NAME = 'graph-explorer-edit-form'; +const CLASS_NAME = "graph-explorer-edit-form"; export interface Props { view: DiagramView; @@ -45,7 +44,9 @@ export class EditEntityForm extends React.Component { let values: any[] = []; if (isLiteralProperty(property)) { - values = property.values.map(({ value , language }) => { return { value:value,language:language};}); + values = property.values.map(({ value, language }) => { + return { value: value, language: language }; + }); } return (
@@ -125,7 +126,7 @@ export class EditEntityForm extends React.Component { const target = e.target as HTMLInputElement; const labels: LocalizedString[] = - target.value.length > 0 ? [{ value: target.value, language: '' }] : []; + target.value.length > 0 ? [{ value: target.value, language: "" }] : []; this.setState({ elementModel: { @@ -138,22 +139,30 @@ export class EditEntityForm extends React.Component { private onChangeProp = (e: React.FormEvent) => { const target = e.target as HTMLInputElement; const values: any[] = []; - target.parentElement.querySelectorAll('[data-iri="'+target.dataset['iri']+'"]').forEach( Element => { - const typedElement = Element as HTMLInputElement; - values.push({ value: typedElement.value,language: typedElement.lang}); - }); + target.parentElement + .querySelectorAll('[data-iri="' + target.dataset["iri"] + '"]') + .forEach((Element) => { + const typedElement = Element as HTMLInputElement; + values.push({ value: typedElement.value, language: typedElement.lang }); + }); this.setState({ elementModel: { ...this.state.elementModel, - properties: {...this.state.elementModel.properties, [target.dataset['iri']] : {type: 'string', values: values} as LiteralProperty}, + properties: { + ...this.state.elementModel.properties, + [target.dataset["iri"]]: { + type: "string", + values: values, + } as LiteralProperty, + }, }, }); - }; + }; private renderLabel() { const { view } = this.props; const label = view.selectLabel(this.state.elementModel.label.values); - const text = label ? label.value : ''; + const text = label ? label.value : ""; return ( ); - }; + } render() { return ( diff --git a/src/graph-explorer/forms/editLinkForm.tsx b/src/graph-explorer/forms/editLinkForm.tsx index 6cc65cdb..ccf8b607 100644 --- a/src/graph-explorer/forms/editLinkForm.tsx +++ b/src/graph-explorer/forms/editLinkForm.tsx @@ -1,23 +1,23 @@ -import * as React from 'react'; +import * as React from "react"; -import { MetadataApi } from '../data/metadataApi'; -import { ElementModel, LinkModel, sameLink } from '../data/model'; +import { MetadataApi } from "../data/metadataApi"; +import { ElementModel, LinkModel, sameLink } from "../data/model"; -import { EditorController } from '../editor/editorController'; -import { DiagramView } from '../diagram/view'; -import { LinkDirection } from '../diagram/elements'; +import { EditorController } from "../editor/editorController"; +import { DiagramView } from "../diagram/view"; +import { LinkDirection } from "../diagram/elements"; -import { Cancellation } from '../viewUtils/async'; +import { Cancellation } from "../viewUtils/async"; -import { ProgressBar, ProgressState } from '../widgets/progressBar'; +import { ProgressBar, ProgressState } from "../widgets/progressBar"; import { LinkTypeSelector, LinkValue, validateLinkType, -} from './linkTypeSelector'; +} from "./linkTypeSelector"; -const CLASS_NAME = 'graph-explorer-edit-form'; +const CLASS_NAME = "graph-explorer-edit-form"; export interface Props { editor: EditorController; diff --git a/src/graph-explorer/forms/editLinkLabelForm.tsx b/src/graph-explorer/forms/editLinkLabelForm.tsx index c96dcf63..12e64ac0 100644 --- a/src/graph-explorer/forms/editLinkLabelForm.tsx +++ b/src/graph-explorer/forms/editLinkLabelForm.tsx @@ -1,9 +1,9 @@ -import * as React from 'react'; +import * as React from "react"; -import { Link } from '../diagram/elements'; -import { DiagramView } from '../diagram/view'; +import { Link } from "../diagram/elements"; +import { DiagramView } from "../diagram/view"; -const CLASS_NAME = 'graph-explorer-edit-form'; +const CLASS_NAME = "graph-explorer-edit-form"; export interface Props { view: DiagramView; diff --git a/src/graph-explorer/forms/elementTypeSelector.tsx b/src/graph-explorer/forms/elementTypeSelector.tsx index 562ca5ef..fddb8626 100644 --- a/src/graph-explorer/forms/elementTypeSelector.tsx +++ b/src/graph-explorer/forms/elementTypeSelector.tsx @@ -1,19 +1,19 @@ -import * as React from 'react'; +import * as React from "react"; -import { PLACEHOLDER_ELEMENT_TYPE } from '../data/schema'; -import { ElementModel, ElementIri, ElementTypeIri } from '../data/model'; +import { PLACEHOLDER_ELEMENT_TYPE } from "../data/schema"; +import { ElementModel, ElementTypeIri } from "../data/model"; -import { EditorController } from '../editor/editorController'; -import { DiagramView } from '../diagram/view'; -import { MetadataApi } from '../data/metadataApi'; +import { EditorController } from "../editor/editorController"; +import { DiagramView } from "../diagram/view"; +import { MetadataApi } from "../data/metadataApi"; -import { createRequest } from '../widgets/instancesSearch'; -import { ListElementView } from '../widgets/listElementView'; +import { createRequest } from "../widgets/instancesSearch"; +import { ListElementView } from "../widgets/listElementView"; -import { Cancellation, CancellationToken } from '../viewUtils/async'; -import { HtmlSpinner } from '../viewUtils/spinner'; +import { Cancellation, CancellationToken } from "../viewUtils/async"; +import { HtmlSpinner } from "../viewUtils/spinner"; -const CLASS_NAME = 'graph-explorer-edit-form'; +const CLASS_NAME = "graph-explorer-edit-form"; export interface ElementValue { value: ElementModel; @@ -30,14 +30,14 @@ export interface Props { metadataApi: MetadataApi | undefined; source: ElementModel; elementValue: ElementValue; - onChange: (state: Pick) => void; + onChange: (state: Pick) => void; } export interface State { - elementTypes?: ReadonlyArray; + elementTypes?: readonly ElementTypeIri[]; searchString?: string; isLoading?: boolean; - existingElements?: ReadonlyArray; + existingElements?: readonly ElementModel[]; } export class ElementTypeSelector extends React.Component { @@ -47,7 +47,7 @@ export class ElementTypeSelector extends React.Component { constructor(props: Props) { super(props); - this.state = { searchString: '', existingElements: [] }; + this.state = { searchString: "", existingElements: [] }; } componentDidMount() { @@ -149,7 +149,7 @@ export class ElementTypeSelector extends React.Component { const { elementTypes, isLoading } = this.state; const value = elementValue.value.types.length ? elementValue.value.types[0] - : ''; + : ""; if (isLoading) { return ; } @@ -177,7 +177,7 @@ export class ElementTypeSelector extends React.Component { {elementValue.error} ) : ( - '' + "" )}
); @@ -286,9 +286,9 @@ function makeElementTypeComparatorByLabel(view: DiagramView) { export function validateElementType( element: ElementModel -): Promise> { +): Promise> { const isElementTypeSelected = element.types.indexOf(PLACEHOLDER_ELEMENT_TYPE) < 0; - const error = !isElementTypeSelected ? 'Required.' : undefined; + const error = !isElementTypeSelected ? "Required." : undefined; return Promise.resolve({ error, allowChange: true }); } diff --git a/src/graph-explorer/forms/linkTypeSelector.tsx b/src/graph-explorer/forms/linkTypeSelector.tsx index a3bc46ab..ab54c7cb 100644 --- a/src/graph-explorer/forms/linkTypeSelector.tsx +++ b/src/graph-explorer/forms/linkTypeSelector.tsx @@ -1,17 +1,17 @@ -import * as React from 'react'; +import * as React from "react"; -import { MetadataApi } from '../data/metadataApi'; -import { LinkModel, ElementModel, sameLink } from '../data/model'; -import { PLACEHOLDER_LINK_TYPE } from '../data/schema'; +import { MetadataApi } from "../data/metadataApi"; +import { LinkModel, ElementModel, sameLink } from "../data/model"; +import { PLACEHOLDER_LINK_TYPE } from "../data/schema"; -import { EditorController } from '../editor/editorController'; -import { FatLinkType, LinkDirection } from '../diagram/elements'; -import { DiagramView } from '../diagram/view'; -import { EventObserver } from '../viewUtils/events'; -import { Cancellation, CancellationToken } from '../viewUtils/async'; -import { HtmlSpinner } from '../viewUtils/spinner'; +import { EditorController } from "../editor/editorController"; +import { FatLinkType, LinkDirection } from "../diagram/elements"; +import { DiagramView } from "../diagram/view"; +import { EventObserver } from "../viewUtils/events"; +import { Cancellation, CancellationToken } from "../viewUtils/async"; +import { HtmlSpinner } from "../viewUtils/spinner"; -const CLASS_NAME = 'graph-explorer-edit-form'; +const CLASS_NAME = "graph-explorer-edit-form"; export interface Value { link: LinkModel; @@ -42,7 +42,7 @@ export interface Props { } export interface State { - fatLinkTypes?: Array; + fatLinkTypes?: DirectedFatLinkType[]; } export class LinkTypeSelector extends React.Component { @@ -87,7 +87,7 @@ export class LinkTypeSelector extends React.Component { if (linkTypes === null) { return; } - const fatLinkTypes: Array = []; + const fatLinkTypes: DirectedFatLinkType[] = []; linkTypes.forEach(({ linkTypeIri, direction }) => { const fatLinkType = view.model.createLinkType(linkTypeIri); fatLinkTypes.push({ fatLinkType, direction }); @@ -98,18 +98,16 @@ export class LinkTypeSelector extends React.Component { } private listenToLinkLabels( - fatLinkTypes: Array<{ fatLinkType: FatLinkType; direction: LinkDirection }> + fatLinkTypes: { fatLinkType: FatLinkType; direction: LinkDirection }[] ) { fatLinkTypes.forEach(({ fatLinkType }) => - this.listener.listen(fatLinkType.events, 'changeLabel', this.updateAll) + this.listener.listen(fatLinkType.events, "changeLabel", this.updateAll) ); } private onChangeType = (e: React.FormEvent) => { - const { - link: originalLink, - direction: originalDirection, - } = this.props.linkValue.value; + const { link: originalLink, direction: originalDirection } = + this.props.linkValue.value; const index = parseInt(e.currentTarget.value, 10); const { fatLinkType, direction } = this.state.fatLinkTypes[index]; const link: LinkModel = { ...originalLink, linkTypeId: fatLinkType.id }; @@ -128,7 +126,7 @@ export class LinkTypeSelector extends React.Component { }: { fatLinkType: FatLinkType; direction: LinkDirection }, index: number ) => { - const { view, linkValue, source, target } = this.props; + const { view, source, target } = this.props; const label = view.formatLabel(fatLinkType.label, fatLinkType.id); let [sourceLabel, targetLabel] = [source, target].map((element) => view.formatLabel(element.label.values, element.id) @@ -176,7 +174,7 @@ export class LinkTypeSelector extends React.Component { {linkValue.error} ) : ( - '' + "" )}
); @@ -205,9 +203,9 @@ export function validateLinkType( editor: EditorController, currentLink: LinkModel, originalLink: LinkModel -): Promise> { +): Promise> { if (currentLink.linkTypeId === PLACEHOLDER_LINK_TYPE) { - return Promise.resolve({ error: 'Required.', allowChange: true }); + return Promise.resolve({ error: "Required.", allowChange: true }); } if (sameLink(currentLink, originalLink)) { return Promise.resolve({ error: undefined, allowChange: true }); @@ -221,7 +219,7 @@ export function validateLinkType( ); if (alreadyOnDiagram) { return Promise.resolve({ - error: 'The link already exists.', + error: "The link already exists.", allowChange: false, }); } @@ -230,12 +228,10 @@ export function validateLinkType( elementIds: [currentLink.sourceId, currentLink.targetId], linkTypeIds: [currentLink.linkTypeId], }) - .then( - (links): Pick => { - const alreadyExists = links.some((link) => sameLink(link, currentLink)); - return alreadyExists - ? { error: 'The link already exists.', allowChange: false } - : { error: undefined, allowChange: true }; - } - ); + .then((links): Pick => { + const alreadyExists = links.some((link) => sameLink(link, currentLink)); + return alreadyExists + ? { error: "The link already exists.", allowChange: false } + : { error: undefined, allowChange: true }; + }); } diff --git a/src/graph-explorer/index.ts b/src/graph-explorer/index.ts index 74e0da27..081af289 100644 --- a/src/graph-explorer/index.ts +++ b/src/graph-explorer/index.ts @@ -1,35 +1,34 @@ -require('../../styles/main.scss'); +// eslint-disable-next-line @typescript-eslint/no-require-imports +require("../../styles/main.scss"); -require('whatwg-fetch'); +export * from "./customization/props"; +export * from "./customization/templates"; -export * from './customization/props'; -export * from './customization/templates'; - -export * from './data/model'; -export * from './data/metadataApi'; -export * from './data/validationApi'; -export * from './data/provider'; -export { PLACEHOLDER_ELEMENT_TYPE, PLACEHOLDER_LINK_TYPE } from './data/schema'; -export * from './data/demo/provider'; +export * from "./data/model"; +export * from "./data/metadataApi"; +export * from "./data/validationApi"; +export * from "./data/provider"; +export { PLACEHOLDER_ELEMENT_TYPE, PLACEHOLDER_LINK_TYPE } from "./data/schema"; +export * from "./data/demo/provider"; export { RdfNode, RdfIri, RdfLiteral, Triple, -} from './data/sparql/sparqlModels'; -export * from './data/sparql/sparqlDataProvider'; -export * from './data/composite/composite'; -export * from './data/sparql/sparqlDataProviderSettings'; -export * from './data/sparql/graphBuilder'; -export * from './data/sparql/sparqlGraphBuilder'; -export { DIAGRAM_CONTEXT_URL_V1 } from './data/schema'; +} from "./data/sparql/sparqlModels"; +export * from "./data/sparql/sparqlDataProvider"; +export * from "./data/composite/composite"; +export * from "./data/sparql/sparqlDataProviderSettings"; +export * from "./data/sparql/graphBuilder"; +export * from "./data/sparql/sparqlGraphBuilder"; +export { DIAGRAM_CONTEXT_URL_V1 } from "./data/schema"; export { RestoreGeometry, setElementExpanded, setElementData, setLinkData, -} from './diagram/commands'; +} from "./diagram/commands"; export { Element, ElementEvents, @@ -40,39 +39,39 @@ export { LinkVertex, Cell, LinkDirection, -} from './diagram/elements'; -export { EmbeddedLayer } from './diagram/embeddedLayer'; -export * from './diagram/geometry'; -export * from './diagram/history'; -export { DiagramModel, DiagramModelEvents } from './diagram/model'; -export * from './diagram/view'; +} from "./diagram/elements"; +export { EmbeddedLayer } from "./diagram/embeddedLayer"; +export * from "./diagram/geometry"; +export * from "./diagram/history"; +export { DiagramModel, DiagramModelEvents } from "./diagram/model"; +export * from "./diagram/view"; export { PointerEvent, PointerUpEvent, getContentFittingBox, ViewportOptions, ScaleOptions, -} from './diagram/paperArea'; +} from "./diagram/paperArea"; -export * from './editor/asyncModel'; +export * from "./editor/asyncModel"; export { AuthoredEntity, AuthoredEntityProps, AuthoredEntityContext, -} from './editor/authoredEntity'; -export * from './editor/authoringState'; +} from "./editor/authoredEntity"; +export * from "./editor/authoringState"; export { EditorOptions, EditorEvents, EditorController, PropertyEditor, PropertyEditorOptions, -} from './editor/editorController'; +} from "./editor/editorController"; export { ValidationState, ElementValidation, LinkValidation, -} from './editor/validation'; +} from "./editor/validation"; export { LayoutData, @@ -83,7 +82,7 @@ export { makeSerializedDiagram, LinkTypeOptions, makeLayoutData, -} from './editor/serializedDiagram'; +} from "./editor/serializedDiagram"; export { calculateLayout, removeOverlaps, @@ -92,34 +91,34 @@ export { LayoutNode, applyLayout, forceLayout, -} from './viewUtils/layout'; +} from "./viewUtils/layout"; export { Cancellation, CancellationToken, CancelledError, -} from './viewUtils/async'; -export * from './viewUtils/events'; +} from "./viewUtils/async"; +export * from "./viewUtils/events"; export { PropertySuggestionParams, PropertyScore, -} from './widgets/connectionsMenu'; +} from "./widgets/connectionsMenu"; -export { DefaultToolbar, ToolbarProps } from './workspace/toolbar'; +export { DefaultToolbar, ToolbarProps } from "./workspace/toolbar"; export { Workspace, WorkspaceProps, WorkspaceState, WorkspaceLanguage, renderTo, -} from './workspace/workspace'; +} from "./workspace/workspace"; export { WorkspaceEventHandler, WorkspaceEventKey, -} from './workspace/workspaceContext'; -export { DraggableHandle } from './workspace/draggableHandle'; -export * from './workspace/layout/layout'; +} from "./workspace/workspaceContext"; +export { DraggableHandle } from "./workspace/draggableHandle"; +export * from "./workspace/layout/layout"; -import * as InternalApi from './internalApi'; +import * as InternalApi from "./internalApi"; export { InternalApi }; diff --git a/src/graph-explorer/internalApi.ts b/src/graph-explorer/internalApi.ts index dd272033..3932e1e6 100644 --- a/src/graph-explorer/internalApi.ts +++ b/src/graph-explorer/internalApi.ts @@ -1,23 +1,23 @@ -export { LINK_SHOW_IRI } from './customization/defaultLinkStyles'; +export { LINK_SHOW_IRI } from "./customization/defaultLinkStyles"; -export { TemplateProperties } from './data/schema'; +export { TemplateProperties } from "./data/schema"; -export * from './diagram/paper'; -export * from './diagram/paperArea'; +export * from "./diagram/paper"; +export * from "./diagram/paperArea"; -export * from './viewUtils/async'; -export * from './viewUtils/collections'; -export * from './viewUtils/keyedObserver'; -export * from './viewUtils/spinner'; +export * from "./viewUtils/async"; +export * from "./viewUtils/collections"; +export * from "./viewUtils/keyedObserver"; +export * from "./viewUtils/spinner"; -export * from './widgets/listElementView'; -export * from './widgets/searchResults'; +export * from "./widgets/listElementView"; +export * from "./widgets/searchResults"; export { WorkspaceContext, WorkspaceContextWrapper, WorkspaceContextTypes, -} from './workspace/workspaceContext'; +} from "./workspace/workspaceContext"; export { groupForceLayout, @@ -25,4 +25,4 @@ export { padded, biasFreePadded, getContentFittingBoxForLayout, -} from './viewUtils/layout'; +} from "./viewUtils/layout"; diff --git a/src/graph-explorer/viewUtils/async.ts b/src/graph-explorer/viewUtils/async.ts index 8e625c7e..a9bbb391 100644 --- a/src/graph-explorer/viewUtils/async.ts +++ b/src/graph-explorer/viewUtils/async.ts @@ -49,7 +49,7 @@ export abstract class BatchingScheduler { } export class BufferingQueue extends BatchingScheduler { - private fetchingQueue: { [key: string]: true } = Object.create(null); + private fetchingQueue: Record = Object.create(null); constructor(private onFetch: (keys: Key[]) => void, waitingTime = 200) { super(waitingTime); diff --git a/src/graph-explorer/viewUtils/collections.ts b/src/graph-explorer/viewUtils/collections.ts index 8afd8812..378aa0fe 100644 --- a/src/graph-explorer/viewUtils/collections.ts +++ b/src/graph-explorer/viewUtils/collections.ts @@ -1,4 +1,4 @@ -export function objectValues(obj: { [key: string]: T }): T[] { +export function objectValues(obj: Record): T[] { const items: T[] = []; for (const key in obj) { if (!Object.prototype.hasOwnProperty.call(obj, key)) { @@ -62,7 +62,7 @@ export class OrderedMap { this.ordered.sort(compare); } - get items(): ReadonlyArray { + get items(): readonly V[] { return this.ordered; } @@ -106,7 +106,7 @@ export interface ReadonlyHashMap { } export class HashMap implements ReadonlyHashMap { - private readonly map = new Map>(); + private readonly map = new Map(); private _size = 0; constructor( @@ -196,8 +196,8 @@ export enum MoveDirection { } export function makeMoveComparator( - items: ReadonlyArray, - selected: ReadonlyArray, + items: readonly T[], + selected: readonly T[], moveDirection: MoveDirection ): (a: T, b: T) => number { const orderMap = new Map(); diff --git a/src/graph-explorer/viewUtils/events.ts b/src/graph-explorer/viewUtils/events.ts index cfd02746..926b4e45 100644 --- a/src/graph-explorer/viewUtils/events.ts +++ b/src/graph-explorer/viewUtils/events.ts @@ -29,8 +29,8 @@ export interface Events { } export class EventSource implements Events { - private listeners = new Map>>(); - private anyListeners: Array> | undefined; + private listeners = new Map[]>(); + private anyListeners: AnyListener[] | undefined; on( eventKey: Key, @@ -96,7 +96,7 @@ export class EventSource implements Events { export class EventObserver { private unsubscribeByKey = new Map(); - private onDispose: Array = []; + private onDispose: Unsubscribe[] = []; listen( events: Events, diff --git a/src/graph-explorer/viewUtils/keyedObserver.ts b/src/graph-explorer/viewUtils/keyedObserver.ts index 02da8ca5..1f49f9cf 100644 --- a/src/graph-explorer/viewUtils/keyedObserver.ts +++ b/src/graph-explorer/viewUtils/keyedObserver.ts @@ -1,20 +1,20 @@ -import { ElementTypeIri, LinkTypeIri, PropertyTypeIri } from '../data/model'; +import { ElementTypeIri, LinkTypeIri, PropertyTypeIri } from "../data/model"; import { FatClassModelEvents, FatLinkTypeEvents, RichPropertyEvents, -} from '../diagram/elements'; -import { DiagramModel } from '../diagram/model'; +} from "../diagram/elements"; +import { DiagramModel } from "../diagram/model"; -import { Unsubscribe, Listener } from './events'; +import { Unsubscribe, Listener } from "./events"; export class KeyedObserver { private observedKeys = new Map(); constructor(readonly subscribe: (key: Key) => Unsubscribe | undefined) {} - observe(keys: ReadonlyArray) { + observe(keys: readonly Key[]) { if (keys.length === 0 && this.observedKeys.size === 0) { return; } diff --git a/src/graph-explorer/viewUtils/layout.ts b/src/graph-explorer/viewUtils/layout.ts index 197844b1..205ad669 100644 --- a/src/graph-explorer/viewUtils/layout.ts +++ b/src/graph-explorer/viewUtils/layout.ts @@ -160,7 +160,7 @@ export function biasFreePadded( } } -export type CalculatedLayout = object & { readonly layoutBrand: void }; +export type CalculatedLayout = object & { readonly layoutBrand: any }; export interface UnzippedCalculatedLayout extends CalculatedLayout { group?: string; @@ -208,7 +208,7 @@ export function calculateLayout(params: { } const nodes: LayoutNode[] = []; - const nodeById: { [id: string]: LayoutNode } = {}; + const nodeById: Record = {}; for (const element of elements) { const { x, y, width, height } = boundsOf(element); const node: LayoutNode = { @@ -238,7 +238,7 @@ export function calculateLayout(params: { } layoutFunction(nodes, links, group); - const positions: Map = new Map(); + const positions = new Map(); for (const node of nodes) { positions.set(node.id, { x: node.x, y: node.y }); } @@ -288,9 +288,7 @@ export function applyLayout(model: DiagramModel, layout: CalculatedLayout) { } } -export function calculateAveragePosition( - position: ReadonlyArray -): Vector { +export function calculateAveragePosition(position: readonly Element[]): Vector { let xSum = 0; let ySum = 0; for (const element of position) { @@ -305,7 +303,7 @@ export function calculateAveragePosition( export function placeElementsAround(params: { model: DiagramModel; - elements: ReadonlyArray; + elements: readonly Element[]; prefferedLinksLength: number; targetElement: Element; startAngle?: number; @@ -431,9 +429,12 @@ export function forceLayout(params: { }); } -export function getContentFittingBoxForLayout( - nodes: ReadonlyArray -): { x: number; y: number; width: number; height: number } { +export function getContentFittingBoxForLayout(nodes: readonly LayoutNode[]): { + x: number; + y: number; + width: number; + height: number; +} { let minX = Infinity, minY = Infinity; let maxX = -Infinity, diff --git a/src/graph-explorer/viewUtils/spinner.tsx b/src/graph-explorer/viewUtils/spinner.tsx index d6e21180..3aaac43a 100644 --- a/src/graph-explorer/viewUtils/spinner.tsx +++ b/src/graph-explorer/viewUtils/spinner.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import * as React from "react"; export interface SpinnerProps { size?: number; @@ -8,7 +8,7 @@ export interface SpinnerProps { errorOccured?: boolean; } -const CLASS_NAME = 'graph-explorer-spinner'; +const CLASS_NAME = "graph-explorer-spinner"; export class Spinner extends React.Component { render() { @@ -21,8 +21,8 @@ export class Spinner extends React.Component { const textLeftMargin = 5; const pathGeometry = - 'm3.47,-19.7 a20,20 0 1,1 -6.95,0 m0,0 l-6,5 m6,-5 l-8,-0' + - (errorOccured ? 'M-8,-8L8,8M-8,8L8,-8' : ''); + "m3.47,-19.7 a20,20 0 1,1 -6.95,0 m0,0 l-6,5 m6,-5 l-8,-0" + + (errorOccured ? "M-8,-8L8,8M-8,8L8,-8" : ""); return ( { d={pathGeometry} transform={`scale(0.02)scale(${size})`} fill="none" - stroke={errorOccured ? 'red' : 'black'} + stroke={errorOccured ? "red" : "black"} strokeWidth="3" strokeLinecap="round" /> {statusText} diff --git a/src/graph-explorer/viewUtils/toSvg.ts b/src/graph-explorer/viewUtils/toSvg.ts index d282a551..b2e4e91b 100644 --- a/src/graph-explorer/viewUtils/toSvg.ts +++ b/src/graph-explorer/viewUtils/toSvg.ts @@ -1,12 +1,11 @@ -import { uniqueId } from 'lodash'; +/* eslint-disable @typescript-eslint/prefer-for-of */ -import { DiagramModel } from '../diagram/model'; -import { Rect, Vector, boundsOf } from '../diagram/geometry'; +import { uniqueId } from "lodash"; -const canvg = require('canvg-fixed'); +import { DiagramModel } from "../diagram/model"; +import { Rect, Vector, boundsOf } from "../diagram/geometry"; -const SVG_NAMESPACE: 'http://www.w3.org/2000/svg' = - 'http://www.w3.org/2000/svg'; +const SVG_NAMESPACE = "http://www.w3.org/2000/svg" as const; export interface ToSVGOptions { model: DiagramModel; @@ -51,11 +50,11 @@ function exportSVG(options: ToSVGOptions): Promise { const paddedHeight = bbox.height + 2 * BORDER_PADDING; if (options.preserveDimensions) { - svgClone.setAttribute('width', paddedWidth.toString()); - svgClone.setAttribute('height', paddedHeight.toString()); + svgClone.setAttribute("width", paddedWidth.toString()); + svgClone.setAttribute("height", paddedHeight.toString()); } else { - svgClone.setAttribute('width', '100%'); - svgClone.setAttribute('height', '100%'); + svgClone.setAttribute("width", "100%"); + svgClone.setAttribute("height", "100%"); } const viewBox: Rect = { @@ -65,37 +64,36 @@ function exportSVG(options: ToSVGOptions): Promise { height: paddedHeight, }; svgClone.setAttribute( - 'viewBox', + "viewBox", `${viewBox.x} ${viewBox.y} ${viewBox.width} ${viewBox.height}` ); addWatermark(svgClone, viewBox, watermarkSvg); const images: HTMLImageElement[] = []; - const nodes = svgClone.querySelectorAll('img'); + const nodes = svgClone.querySelectorAll("img"); foreachNode(nodes, (node) => images.push(node)); const convertingImages = Promise.all( images.map((img) => { - const exportKey = img.getAttribute('export-key'); - img.removeAttribute('export-key'); + const exportKey = img.getAttribute("export-key"); + img.removeAttribute("export-key"); if (exportKey) { const { width, height } = imageBounds[exportKey]; - img.setAttribute('width', width.toString()); - img.setAttribute('height', height.toString()); + img.setAttribute("width", width.toString()); + img.setAttribute("height", height.toString()); if (!options.convertImagesToDataUris) { return Promise.resolve(); } return exportAsDataUri(img) .then((dataUri) => { // check for empty svg data URI which happens when mockJointXHR catches an exception - if (dataUri && dataUri !== 'data:image/svg+xml,') { + if (dataUri && dataUri !== "data:image/svg+xml,") { img.src = dataUri; } }) .catch((err) => { - // tslint:disable-next-line:no-console - console.warn('Failed to export image: ' + img.src, err); + console.warn("Failed to export image: " + img.src, err); }); } else { return Promise.resolve(); @@ -107,7 +105,7 @@ function exportSVG(options: ToSVGOptions): Promise { // workaround to include only graph-explorer-related stylesheets const exportedCssText = extractCSSFromDocument(svgClone); - const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs'); + const defs = document.createElementNS("http://www.w3.org/2000/svg", "defs"); defs.innerHTML = ``; svgClone.insertBefore(defs, svgClone.firstChild); @@ -123,51 +121,50 @@ function exportSVG(options: ToSVGOptions): Promise { } function addWatermark(svg: SVGElement, viewBox: Rect, watermarkSvg: string) { - const WATERMARK_CLASS = 'graph-explorer-exported-watermark'; + const WATERMARK_CLASS = "graph-explorer-exported-watermark"; const WATERMARK_MAX_WIDTH = 120; const WATERMARK_PADDING = 20; - const image = document.createElementNS(SVG_NAMESPACE, 'image'); - image.setAttributeNS('http://www.w3.org/1999/xlink', 'href', watermarkSvg); - image.setAttribute('class', WATERMARK_CLASS); + const image = document.createElementNS(SVG_NAMESPACE, "image"); + image.setAttributeNS("http://www.w3.org/1999/xlink", "href", watermarkSvg); + image.setAttribute("class", WATERMARK_CLASS); const width = Math.min(viewBox.width * 0.2, WATERMARK_MAX_WIDTH); const x = viewBox.x + viewBox.width - width - WATERMARK_PADDING; const y = viewBox.y + WATERMARK_PADDING; - image.setAttribute('x', x.toString()); - image.setAttribute('y', y.toString()); - image.setAttribute('width', width.toString()); - image.setAttribute('opacity', '0.3'); + image.setAttribute("x", x.toString()); + image.setAttribute("y", y.toString()); + image.setAttribute("width", width.toString()); + image.setAttribute("opacity", "0.3"); svg.insertBefore(image, svg.firstChild); } -function clearAttributes(svg: SVGElement) { - const availableIds: { [key: string]: boolean } = {}; - const prohibitedIds: { [key: string]: boolean } = {}; - const defss = svg.querySelectorAll('defs'); +function _clearAttributes(svg: SVGElement) { + const availableIds: Record = {}; + const defss = svg.querySelectorAll("defs"); foreachNode(defss, (defs) => { foreachNode(defs.childNodes, (def) => { - const id = (def as SVGElement).getAttribute('id'); + const id = (def as SVGElement).getAttribute("id"); if (id) { availableIds[id] = true; } }); }); - const paths = svg.querySelectorAll('*'); + const paths = svg.querySelectorAll("*"); foreachNode(paths, (path) => { - const markerStart = extractId(path.getAttribute('marker-start')); + const markerStart = extractId(path.getAttribute("marker-start")); if (markerStart && !availableIds[markerStart]) { - path.removeAttribute('marker-start'); + path.removeAttribute("marker-start"); } - const markerEnd = extractId(path.getAttribute('marker-end')); + const markerEnd = extractId(path.getAttribute("marker-end")); if (markerEnd && !availableIds[markerEnd]) { - path.removeAttribute('marker-end'); + path.removeAttribute("marker-end"); } - const filterId = extractId(path.getAttribute('filter')); + const filterId = extractId(path.getAttribute("filter")); if (filterId && !availableIds[filterId]) { - path.removeAttribute('filter'); + path.removeAttribute("filter"); } }); @@ -189,7 +186,7 @@ function extractCSSFromDocument(targetSubtree: Element): string { if (!rules) { continue; } - } catch (e) { + } catch (_e) { continue; } @@ -205,7 +202,7 @@ function extractCSSFromDocument(targetSubtree: Element): string { const exportedCssTexts: string[] = []; exportedRules.forEach((rule) => exportedCssTexts.push(rule.cssText)); - return exportedCssTexts.join('\n'); + return exportedCssTexts.join("\n"); } function clonePaperSvg( @@ -213,12 +210,12 @@ function clonePaperSvg( elementSizePadding: number ): { svgClone: SVGSVGElement; - imageBounds: { [path: string]: Bounds }; + imageBounds: Record; } { const { model, paper, getOverlayedElement } = options; const svgClone = paper.cloneNode(true) as SVGSVGElement; - svgClone.removeAttribute('class'); - svgClone.removeAttribute('style'); + svgClone.removeAttribute("class"); + svgClone.removeAttribute("style"); function findViewport() { let child = svgClone.firstChild; @@ -232,9 +229,9 @@ function clonePaperSvg( } const viewport = findViewport(); - viewport.removeAttribute('transform'); + viewport.removeAttribute("transform"); - const imageBounds: { [path: string]: Bounds } = {}; + const imageBounds: Record = {}; for (const element of model.elements) { const modelId = element.id; @@ -243,28 +240,28 @@ function clonePaperSvg( continue; } - const elementRoot = document.createElementNS(SVG_NAMESPACE, 'g'); + const elementRoot = document.createElementNS(SVG_NAMESPACE, "g"); const overlayedViewContent = overlayedView.firstChild.cloneNode( true ) as HTMLElement; - elementRoot.setAttribute('class', 'graph-explorer-exported-element'); + elementRoot.setAttribute("class", "graph-explorer-exported-element"); - const newRoot = document.createElementNS(SVG_NAMESPACE, 'foreignObject'); + const newRoot = document.createElementNS(SVG_NAMESPACE, "foreignObject"); newRoot.appendChild(overlayedViewContent); const { x, y, width, height } = boundsOf(element); - newRoot.setAttribute('transform', `translate(${x},${y})`); - newRoot.setAttribute('width', (width + elementSizePadding).toString()); - newRoot.setAttribute('height', (height + elementSizePadding).toString()); + newRoot.setAttribute("transform", `translate(${x},${y})`); + newRoot.setAttribute("width", (width + elementSizePadding).toString()); + newRoot.setAttribute("height", (height + elementSizePadding).toString()); elementRoot.appendChild(newRoot); viewport.appendChild(elementRoot); - const clonedNodes = overlayedViewContent.querySelectorAll('img'); + const clonedNodes = overlayedViewContent.querySelectorAll("img"); - foreachNode(overlayedView.querySelectorAll('img'), (img, index) => { - const exportKey = uniqueId('export-key-'); - clonedNodes[index].setAttribute('export-key', exportKey); + foreachNode(overlayedView.querySelectorAll("img"), (img, index) => { + const exportKey = uniqueId("export-key-"); + clonedNodes[index].setAttribute("export-key", exportKey); imageBounds[exportKey] = { width: img.clientWidth, height: img.clientHeight, @@ -277,34 +274,34 @@ function clonePaperSvg( function exportAsDataUri(original: HTMLImageElement): Promise { const url = original.src; - if (!url || url.startsWith('data:')) { + if (!url || url.startsWith("data:")) { return Promise.resolve(url); } return loadCrossOriginImage(original.src).then((image) => { - const canvas = document.createElement('canvas'); + const canvas = document.createElement("canvas"); canvas.width = image.width; canvas.height = image.height; - const context = canvas.getContext('2d'); + const context = canvas.getContext("2d"); context.drawImage(image, 0, 0); // match extensions like htttp://example.com/images/foo.JPG&w=200 const extensionMatch = url.match(/\.([a-zA-Z0-9]+)[^.a-zA-Z0-9]?[^.]*$/); - const extension = extensionMatch ? extensionMatch[1].toLowerCase() : 'png'; + const extension = extensionMatch ? extensionMatch[1].toLowerCase() : "png"; try { - const mimeType = 'image/' + (extension === 'jpg' ? 'jpeg' : extension); + const mimeType = "image/" + (extension === "jpg" ? "jpeg" : extension); const dataUri = canvas.toDataURL(mimeType); return Promise.resolve(dataUri); - } catch (e) { - if (extension !== 'svg') { - return Promise.reject('Failed to convert image to data URI'); + } catch (_e) { + if (extension !== "svg") { + return Promise.reject("Failed to convert image to data URI"); } return fetch(url) .then((response) => response.text()) .then((svg) => - svg.length > 0 ? 'data:image/svg+xml,' + encodeURIComponent(svg) : '' + svg.length > 0 ? "data:image/svg+xml," + encodeURIComponent(svg) : "" ); } }); @@ -312,7 +309,7 @@ function exportAsDataUri(original: HTMLImageElement): Promise { function loadCrossOriginImage(src: string): Promise { const image = new Image(); - image.crossOrigin = 'anonymous'; + image.crossOrigin = "anonymous"; const promise = new Promise((resolve, reject) => { image.onload = () => resolve(image); image.onerror = (ev) => reject(ev); @@ -345,7 +342,7 @@ const MAX_CANVAS_LENGTH = 4096; export async function toDataURL( options: ToSVGOptions & ToDataURLOptions ): Promise { - const { paper, mimeType = 'image/png' } = options; + const { paper: _paper, mimeType = "image/png" } = options; const svgOptions = { ...options, convertImagesToDataUris: true, @@ -354,12 +351,12 @@ export async function toDataURL( }; const svg = await exportSVG(svgOptions); const svgBox: Bounds = { - width: Number(svg.getAttribute('width')), - height: Number(svg.getAttribute('height')), + width: Number(svg.getAttribute("width")), + height: Number(svg.getAttribute("height")), }; const containerSize = - typeof options.width === 'number' || typeof options.height === 'number' + typeof options.width === "number" || typeof options.height === "number" ? { width: options.width, height: options.height } : fallbackContainerSize(svgBox); @@ -367,8 +364,8 @@ export async function toDataURL( svgBox, containerSize ); - svg.setAttribute('width', innerSize.width.toString()); - svg.setAttribute('height', innerSize.height.toString()); + svg.setAttribute("width", innerSize.width.toString()); + svg.setAttribute("height", innerSize.height.toString()); const svgString = new XMLSerializer().serializeToString(svg); const { canvas, context } = createCanvas( @@ -378,7 +375,7 @@ export async function toDataURL( ); const image = await loadImage( - 'data:image/svg+xml,' + encodeURIComponent(svgString) + "data:image/svg+xml," + encodeURIComponent(svgString) ); context.drawImage( image, @@ -394,10 +391,10 @@ export async function toDataURL( canvasHeight: number, backgroundColor?: string ) { - const cnv = document.createElement('canvas'); + const cnv = document.createElement("canvas"); cnv.width = canvasWidth; cnv.height = canvasHeight; - const cnt = cnv.getContext('2d'); + const cnt = cnv.getContext("2d"); if (backgroundColor) { cnt.fillStyle = backgroundColor; cnt.fillRect(0, 0, canvasWidth, canvasHeight); @@ -432,11 +429,11 @@ function computeAutofit(itemSize: Bounds, containerSize: Bounds) { }; const outerSize: Bounds = { width: - typeof containerSize.width === 'number' + typeof containerSize.width === "number" ? containerSize.width : innerSize.width, height: - typeof containerSize.height === 'number' + typeof containerSize.height === "number" ? containerSize.height : innerSize.height, }; @@ -464,16 +461,16 @@ export function fitRectKeepingAspectRatio( targetWidth: number | undefined, targetHeight: number | undefined ): { width: number; height: number } { - if (!(typeof targetWidth === 'number' || typeof targetHeight === 'number')) { + if (!(typeof targetWidth === "number" || typeof targetHeight === "number")) { return { width: sourceWidth, height: sourceHeight }; } const sourceAspectRatio = sourceWidth / sourceHeight; targetWidth = - typeof targetWidth === 'number' + typeof targetWidth === "number" ? targetWidth : targetHeight * sourceAspectRatio; targetHeight = - typeof targetHeight === 'number' + typeof targetHeight === "number" ? targetHeight : targetWidth / sourceAspectRatio; if (targetHeight * sourceAspectRatio <= targetWidth) { @@ -490,16 +487,16 @@ export function fitRectKeepingAspectRatio( * @return {Blob} A blob representing the array buffer data. */ export function dataURLToBlob(dataURL: string): Blob { - const BASE64_MARKER = ';base64,'; + const BASE64_MARKER = ";base64,"; if (dataURL.indexOf(BASE64_MARKER) === -1) { - const parts = dataURL.split(','); - const contentType = parts[0].split(':')[1]; + const parts = dataURL.split(","); + const contentType = parts[0].split(":")[1]; const raw = decodeURIComponent(parts[1]); return new Blob([raw], { type: contentType }); } else { const parts = dataURL.split(BASE64_MARKER); - const contentType = parts[0].split(':')[1]; + const contentType = parts[0].split(":")[1]; const raw = window.atob(parts[1]); const rawLength = raw.length; diff --git a/src/graph-explorer/widgets/classTree/classTree.tsx b/src/graph-explorer/widgets/classTree/classTree.tsx index 2fa2f3ae..1170b4ea 100644 --- a/src/graph-explorer/widgets/classTree/classTree.tsx +++ b/src/graph-explorer/widgets/classTree/classTree.tsx @@ -1,23 +1,23 @@ -import * as React from 'react'; - -import { ElementTypeIri, ClassModel } from '../../data/model'; -import { DataProvider } from '../../data/provider'; -import { FatClassModel } from '../../diagram/elements'; -import { Vector } from '../../diagram/geometry'; -import { DiagramView } from '../../diagram/view'; -import { EditorController } from '../../editor/editorController'; +import * as React from "react"; + +import { ElementTypeIri, ClassModel } from "../../data/model"; +import { DataProvider } from "../../data/provider"; +import { FatClassModel } from "../../diagram/elements"; +import { Vector } from "../../diagram/geometry"; +import { DiagramView } from "../../diagram/view"; +import { EditorController } from "../../editor/editorController"; import { Cancellation, CancellationToken, Debouncer, -} from '../../viewUtils/async'; -import { cloneMap } from '../../viewUtils/collections'; -import { EventObserver } from '../../viewUtils/events'; -import { HtmlSpinner } from '../../viewUtils/spinner'; -import { ProgressBar, ProgressState } from '../progressBar'; +} from "../../viewUtils/async"; +import { cloneMap } from "../../viewUtils/collections"; +import { EventObserver } from "../../viewUtils/events"; +import { HtmlSpinner } from "../../viewUtils/spinner"; +import { ProgressBar, ProgressState } from "../progressBar"; -import { TreeNode } from './treeModel'; -import { Forest } from './leaf'; +import { TreeNode } from "./treeModel"; +import { Forest } from "./leaf"; export interface ClassTreeProps { view: DiagramView; @@ -28,8 +28,8 @@ export interface ClassTreeProps { export interface State { refreshingState?: ProgressState; - roots?: ReadonlyArray; - filteredRoots?: ReadonlyArray; + roots?: readonly TreeNode[]; + filteredRoots?: readonly TreeNode[]; requestedSearchText?: string; appliedSearchText?: string; selectedNode?: TreeNode; @@ -37,14 +37,14 @@ export interface State { showOnlyConstructible?: boolean; } -const CLASS_NAME = 'graph-explorer-class-tree'; +const CLASS_NAME = "graph-explorer-class-tree"; const MIN_TERM_LENGTH = 3; export class ClassTree extends React.Component { private readonly listener = new EventObserver(); private readonly delayedClassUpdate = new Debouncer(); private readonly delayedSearch = new Debouncer(200 /* ms */); - private classTree: ReadonlyArray | undefined; + private classTree: readonly ClassModel[] | undefined; private dataProvider: DataProvider | undefined; private loadClassesOperation = new Cancellation(); @@ -56,8 +56,8 @@ export class ClassTree extends React.Component { refreshingState: ProgressState.none, roots: [], filteredRoots: [], - requestedSearchText: '', - appliedSearchText: '', + requestedSearchText: "", + appliedSearchText: "", constructibleClasses: new Map(), showOnlyConstructible: false, }; @@ -97,7 +97,7 @@ export class ClassTree extends React.Component { type="checkbox" checked={showOnlyConstructible} onChange={this.onShowOnlyCreatableChange} - />{' '} + />{" "} Show only constructible ) : null} @@ -127,13 +127,13 @@ export class ClassTree extends React.Component { componentDidMount() { const { view, editor } = this.props; - this.listener.listen(view.events, 'changeLanguage', () => + this.listener.listen(view.events, "changeLanguage", () => this.refreshClassTree() ); - this.listener.listen(editor.model.events, 'loadingStart', () => { + this.listener.listen(editor.model.events, "loadingStart", () => { this.initClassTree(); }); - this.listener.listen(editor.model.events, 'classEvent', ({ data }) => { + this.listener.listen(editor.model.events, "classEvent", ({ data }) => { if (data.changeLabel || data.changeCount) { this.delayedClassUpdate.call(this.refreshClassTree); } @@ -188,7 +188,7 @@ export class ClassTree extends React.Component { }; private onShowOnlyCreatableChange = ( - e: React.ChangeEvent + _e: React.ChangeEvent ) => { this.setState( (state): State => @@ -223,33 +223,31 @@ export class ClassTree extends React.Component { this.refreshOperation.abort(); this.refreshOperation = cancellation; - this.setState( - (state, props): State => { - if (!this.classTree) { - return { refreshingState: ProgressState.none }; - } + this.setState((state, props): State => { + if (!this.classTree) { + return { refreshingState: ProgressState.none }; + } - let refreshingState = ProgressState.none; - if (editor.inAuthoringMode) { - const newIris = getNewClassIris( - state.constructibleClasses, - this.classTree - ); - - if (newIris.size > 0) { - refreshingState = ProgressState.loading; - this.queryCreatableTypes(newIris, cancellation.signal); - } - } + let refreshingState = ProgressState.none; + if (editor.inAuthoringMode) { + const newIris = getNewClassIris( + state.constructibleClasses, + this.classTree + ); - const roots = createRoots(this.classTree, props.view); - return applyFilters({ - ...state, - roots: sortTree(roots), - refreshingState, - }); + if (newIris.size > 0) { + refreshingState = ProgressState.loading; + this.queryCreatableTypes(newIris, cancellation.signal); + } } - ); + + const roots = createRoots(this.classTree, props.view); + return applyFilters({ + ...state, + roots: sortTree(roots), + refreshingState, + }); + }); }; private setClassTree(roots: ClassModel[]) { @@ -292,21 +290,18 @@ export class ClassTree extends React.Component { if (result === null) { return; } - this.setState( - (state): State => { - const constructibleClasses = cloneMap(state.constructibleClasses); - typeIris.forEach((type) => { - constructibleClasses.set(type, result.has(type)); - }); - return applyFilters({ - ...state, - constructibleClasses, - refreshingState: ProgressState.completed, - }); - } - ); + this.setState((state): State => { + const constructibleClasses = cloneMap(state.constructibleClasses); + typeIris.forEach((type) => { + constructibleClasses.set(type, result.has(type)); + }); + return applyFilters({ + ...state, + constructibleClasses, + refreshingState: ProgressState.completed, + }); + }); } catch (err) { - // tslint:disable-next-line:no-console console.error(err); if (ct.aborted) { return; @@ -319,7 +314,7 @@ export class ClassTree extends React.Component { } } -function createRoots(classTree: ReadonlyArray, view: DiagramView) { +function createRoots(classTree: readonly ClassModel[], view: DiagramView) { const mapClass = (model: ClassModel): TreeNode => { const richClass = view.model.createClass(model.id); return { @@ -333,7 +328,7 @@ function createRoots(classTree: ReadonlyArray, view: DiagramView) { function getNewClassIris( existingClasses: ReadonlyMap, - classTree: ReadonlyArray + classTree: readonly ClassModel[] ) { const classIris = new Set(); const visitClass = (model: ClassModel) => { @@ -350,8 +345,8 @@ function normalizeSearchText(text: string) { return text.trim().toLowerCase(); } -function sortTree(roots: ReadonlyArray): ReadonlyArray { - function mapNodes(nodes: ReadonlyArray): ReadonlyArray { +function sortTree(roots: readonly TreeNode[]): readonly TreeNode[] { + function mapNodes(nodes: readonly TreeNode[]): readonly TreeNode[] { if (nodes.length === 0) { return nodes; } @@ -383,9 +378,9 @@ function applyFilters(state: State): State { } function filterByKeyword( - roots: ReadonlyArray, + roots: readonly TreeNode[], searchText: string -): ReadonlyArray { +): readonly TreeNode[] { if (roots.length === 0) { return roots; } @@ -404,9 +399,9 @@ function filterByKeyword( } function filterOnlyCreatable( - roots: ReadonlyArray, + roots: readonly TreeNode[], creatableClasses: ReadonlyMap -): ReadonlyArray { +): readonly TreeNode[] { function collectOnlyCreatable(acc: TreeNode[], node: TreeNode) { const derived = node.derived.reduce(collectOnlyCreatable, []); if (derived.length > 0 || creatableClasses.get(node.model.id)) { diff --git a/src/graph-explorer/widgets/classTree/index.ts b/src/graph-explorer/widgets/classTree/index.ts index 39ab4b17..4374f6f7 100644 --- a/src/graph-explorer/widgets/classTree/index.ts +++ b/src/graph-explorer/widgets/classTree/index.ts @@ -1 +1 @@ -export { ClassTree, ClassTreeProps } from './classTree'; +export { ClassTree, ClassTreeProps } from "./classTree"; diff --git a/src/graph-explorer/widgets/classTree/leaf.tsx b/src/graph-explorer/widgets/classTree/leaf.tsx index 9fa5de17..efbf1ddb 100644 --- a/src/graph-explorer/widgets/classTree/leaf.tsx +++ b/src/graph-explorer/widgets/classTree/leaf.tsx @@ -1,15 +1,21 @@ -import * as React from 'react'; +/* eslint-disable @typescript-eslint/no-require-imports */ -import { ElementTypeIri } from '../../data/model'; -import { DiagramView } from '../../diagram/view'; -import { highlightSubstring } from '../listElementView'; +import * as React from "react"; -import { TreeNode } from './treeModel'; +import { ElementTypeIri } from "../../data/model"; +import { DiagramView } from "../../diagram/view"; +import { highlightSubstring } from "../listElementView"; -const EXPAND_ICON = require('../../../../images/tree/expand-toggle.svg').default as string; -const COLLAPSE_ICON = require('../../../../images/tree/collapse-toggle.svg').default as string; -const DEFAULT_LEAF_ICON = require('../../../../images/tree/leaf-default.svg').default as string; -const DEFAULT_PARENT_ICON = require('../../../../images/tree/leaf-folder.svg').default as string; +import { TreeNode } from "./treeModel"; + +const EXPAND_ICON = require("../../../../images/tree/expand-toggle.svg") + .default as string; +const COLLAPSE_ICON = require("../../../../images/tree/collapse-toggle.svg") + .default as string; +const DEFAULT_LEAF_ICON = require("../../../../images/tree/leaf-default.svg") + .default as string; +const DEFAULT_PARENT_ICON = require("../../../../images/tree/leaf-folder.svg") + .default as string; interface CommonProps { view: DiagramView; @@ -29,7 +35,7 @@ interface State { expanded?: boolean; } -const LEAF_CLASS = 'graph-explorer-class-leaf'; +const LEAF_CLASS = "graph-explorer-class-leaf"; export class Leaf extends React.Component { constructor(props: LeafProps) { @@ -101,7 +107,7 @@ export class Leaf extends React.Component { >
@@ -965,7 +959,7 @@ class ObjectsPanel extends React.Component< } } -function selectNonPresented(objects: ReadonlyArray) { +function selectNonPresented(objects: readonly ReactElementModel[]) { const selection = new Set(); for (const object of objects) { if (object.presentOnDiagram) { @@ -977,7 +971,7 @@ function selectNonPresented(objects: ReadonlyArray) { } function allNonPresentedAreSelected( - objects: ReadonlyArray, + objects: readonly ReactElementModel[], selection: ReadonlySet ): boolean { let allSelected = true; diff --git a/src/graph-explorer/widgets/dialog.tsx b/src/graph-explorer/widgets/dialog.tsx index 79e970d5..0503db4b 100644 --- a/src/graph-explorer/widgets/dialog.tsx +++ b/src/graph-explorer/widgets/dialog.tsx @@ -1,17 +1,17 @@ -import * as React from 'react'; +import * as React from "react"; -import { DiagramView } from '../diagram/view'; -import { Element, Link } from '../diagram/elements'; -import { EventObserver, Unsubscribe } from '../viewUtils/events'; -import { PaperWidgetProps } from '../diagram/paperArea'; +import { DiagramView } from "../diagram/view"; +import { Element, Link } from "../diagram/elements"; +import { EventObserver, Unsubscribe } from "../viewUtils/events"; +import { PaperWidgetProps } from "../diagram/paperArea"; import { boundsOf, computePolyline, computePolylineLength, getPointAlongPolyline, Vector, -} from '../diagram/geometry'; -import { DraggableHandle } from '../workspace/draggableHandle'; +} from "../diagram/geometry"; +import { DraggableHandle } from "../workspace/draggableHandle"; const DEFAULT_WIDTH = 300; const DEFAULT_HEIGHT = 300; @@ -24,7 +24,7 @@ const ELEMENT_OFFSET = 40; const LINK_OFFSET = 20; const FOCUS_OFFSET = 20; -const CLASS_NAME = 'graph-explorer-dialog'; +const CLASS_NAME = "graph-explorer-dialog"; export interface Props extends PaperWidgetProps { view: DiagramView; @@ -86,7 +86,7 @@ export class Dialog extends React.Component { this.listenToLink(target); } - this.handler.listen(view.events, 'changeLanguage', this.updateAll); + this.handler.listen(view.events, "changeLanguage", this.updateAll); this.unsubscribeFromTarget = () => { this.handler.stopListening(); @@ -95,8 +95,8 @@ export class Dialog extends React.Component { } private listenToElement(element: Element) { - this.handler.listen(element.events, 'changePosition', this.updateAll); - this.handler.listen(element.events, 'changeSize', this.updateAll); + this.handler.listen(element.events, "changePosition", this.updateAll); + this.handler.listen(element.events, "changeSize", this.updateAll); } private listenToLink(link: Link) { @@ -108,8 +108,8 @@ export class Dialog extends React.Component { this.listenToElement(source); this.listenToElement(target); - this.handler.listen(link.events, 'changeVertices', this.updateAll); - this.handler.listen(link.events, 'changeLabelBounds', this.updateAll); + this.handler.listen(link.events, "changeVertices", this.updateAll); + this.handler.listen(link.events, "changeLabelBounds", this.updateAll); } private calculatePositionForElement(element: Element): Vector { @@ -135,7 +135,7 @@ export class Dialog extends React.Component { const target = view.model.getElement(link.targetId); if (!source || !target) { - throw new Error('Source and target are not specified'); + throw new Error("Source and target are not specified"); } const route = view.getRouting(link.id); @@ -174,7 +174,7 @@ export class Dialog extends React.Component { return this.calculatePositionForLink(target); } - throw new Error('Unknown target type'); + throw new Error("Unknown target type"); } private getViewPortScrollablePoints(): { min: Vector; max: Vector } { @@ -204,10 +204,8 @@ export class Dialog extends React.Component { private focusOn() { const { paperArea } = this.props; - const { - min: viewPortMin, - max: viewPortMax, - } = this.getViewPortScrollablePoints(); + const { min: viewPortMin, max: viewPortMax } = + this.getViewPortScrollablePoints(); const { min, max } = this.getDialogScrollablePoints(); let xOffset = 0; @@ -240,7 +238,7 @@ export class Dialog extends React.Component { } private startSize: Vector; - private onStartDragging = (e: React.MouseEvent) => { + private onStartDragging = (_e: React.MouseEvent) => { this.preventSelection(); const { size } = this.props; this.startSize = { @@ -281,11 +279,11 @@ export class Dialog extends React.Component { private preventSelection = () => { const onMouseUp = () => { - document.body.classList.remove('graph-explorer--unselectable'); - document.removeEventListener('mouseup', onMouseUp); + document.body.classList.remove("graph-explorer--unselectable"); + document.removeEventListener("mouseup", onMouseUp); }; - document.addEventListener('mouseup', onMouseUp); - document.body.classList.add('graph-explorer--unselectable'); + document.addEventListener("mouseup", onMouseUp); + document.body.classList.add("graph-explorer--unselectable"); }; render() { diff --git a/src/graph-explorer/widgets/halo.tsx b/src/graph-explorer/widgets/halo.tsx index 5ff900f9..c581182f 100644 --- a/src/graph-explorer/widgets/halo.tsx +++ b/src/graph-explorer/widgets/halo.tsx @@ -1,21 +1,21 @@ -import * as React from 'react'; +import * as React from "react"; -import { MetadataApi } from '../data/metadataApi'; +import { MetadataApi } from "../data/metadataApi"; import { Element as DiagramElement, ElementEvents, Element, -} from '../diagram/elements'; -import { Vector, boundsOf } from '../diagram/geometry'; -import { PaperWidgetProps } from '../diagram/paperArea'; +} from "../diagram/elements"; +import { Vector, boundsOf } from "../diagram/geometry"; +import { PaperWidgetProps } from "../diagram/paperArea"; -import { EditorController } from '../editor/editorController'; -import { AuthoringState } from '../editor/authoringState'; +import { EditorController } from "../editor/editorController"; +import { AuthoringState } from "../editor/authoringState"; -import { AnyListener, EventObserver } from '../viewUtils/events'; -import { Cancellation, CancellationToken, Debouncer } from '../viewUtils/async'; -import { HtmlSpinner } from '../viewUtils/spinner'; +import { AnyListener, EventObserver } from "../viewUtils/events"; +import { Cancellation, CancellationToken, Debouncer } from "../viewUtils/async"; +import { HtmlSpinner } from "../viewUtils/spinner"; export interface Props extends PaperWidgetProps { target: DiagramElement | undefined; @@ -34,7 +34,7 @@ export interface State { canLink?: boolean; } -const CLASS_NAME = 'graph-explorer-halo'; +const CLASS_NAME = "graph-explorer-halo"; export class Halo extends React.Component { private readonly listener = new EventObserver(); @@ -49,7 +49,7 @@ export class Halo extends React.Component { componentDidMount() { const { editor, target } = this.props; - this.listener.listen(editor.events, 'changeAuthoringState', () => { + this.listener.listen(editor.events, "changeAuthoringState", () => { this.queryAllowedActions(); }); this.listenToElement(target); @@ -133,7 +133,7 @@ export class Halo extends React.Component { } = this.props; if (!target) { - return
; + return
; } const bbox = boundsOf(target); @@ -161,7 +161,7 @@ export class Halo extends React.Component { className={ `${CLASS_NAME}__navigate ` + `${CLASS_NAME}__navigate--${ - navigationMenuOpened ? 'closed' : 'open' + navigationMenuOpened ? "closed" : "open" }` } role="button" @@ -190,7 +190,7 @@ export class Halo extends React.Component {
{ role="button" title={ isNewElement - ? 'Delete new element' - : 'Remove an element from the diagram' + ? "Delete new element" + : "Remove an element from the diagram" } onClick={onRemove} >
@@ -242,8 +242,8 @@ export class Halo extends React.Component { ); } const title = canLink - ? 'Establish connection' - : 'Establishing connection is unavailable for the selected element'; + ? "Establish connection" + : "Establishing connection is unavailable for the selected element"; return ( ); } - private renderEditButton(polyline: ReadonlyArray) { + private renderEditButton(polyline: readonly Vector[]) { const { canEdit } = this.state; const style = this.getButtonPosition(polyline, 1); if (canEdit === undefined) { @@ -288,8 +288,8 @@ export class HaloLink extends React.Component { ); } const title = canEdit - ? 'Edit link' - : 'Editing is unavailable for the selected link'; + ? "Edit link" + : "Editing is unavailable for the selected link"; return (
) : ( - '' + "" ); return ( @@ -86,34 +86,34 @@ class LinkInToolBox extends React.Component { > @@ -131,8 +131,8 @@ class LinkInToolBox extends React.Component { interface LinkTypesToolboxViewProps { view: DiagramView; - links: ReadonlyArray; - countMap: { readonly [linkTypeId: string]: number }; + links: readonly FatLinkType[]; + countMap: Readonly>; selectedElement: Element; dataState: ProgressState; filterCallback: (type: FatLinkType) => void; @@ -144,7 +144,7 @@ class LinkTypesToolboxView extends React.Component< > { constructor(props: LinkTypesToolboxViewProps) { super(props); - this.state = { filterKey: '' }; + this.state = { filterKey: "" }; } private compareLinks = (a: FatLinkType, b: FatLinkType) => { @@ -159,7 +159,7 @@ class LinkTypesToolboxView extends React.Component< }; private onDropFilter = () => { - this.setState({ filterKey: '' }); + this.setState({ filterKey: "" }); }; private getLinks = () => { @@ -196,7 +196,7 @@ class LinkTypesToolboxView extends React.Component< }; render() { - const className = 'link-types-toolbox'; + const className = "link-types-toolbox"; const { view, dataState, selectedElement } = this.props; const history = view.model.history; @@ -210,8 +210,8 @@ class LinkTypesToolboxView extends React.Component< selectedElement.iri ); connectedTo = ( -

- Connected to{'\u00A0'} +

+ Connected to{"\u00A0"} {selectedElementLabel}

); @@ -248,7 +248,7 @@ class LinkTypesToolboxView extends React.Component< @@ -256,7 +256,7 @@ class LinkTypesToolboxView extends React.Component< className="graph-explorer-btn graph-explorer-btn-default" title="Show links without labels" onClick={() => - changeLinkTypeState(history, 'withoutLabels', links) + changeLinkTypeState(history, "withoutLabels", links) } >