diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 09b39ba..71cbadd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,6 @@ jobs: strategy: matrix: node-version: - - 18.x - 20.x - 22.x steps: diff --git a/.gitignore b/.gitignore index 78d6991..93b33c5 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ yarn-error.log* # Compiled code lib +dist # Runtime data pids diff --git a/.npmignore b/.npmignore deleted file mode 100644 index f737bdb..0000000 --- a/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -# This file primarily exists to prevent ./lib from being ignored when publishing. -# (Because it's listed in .gitignore). - -coverage diff --git a/Makefile b/Makefile deleted file mode 100644 index 2acf6fd..0000000 --- a/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# Wrap TTL files into JS files for bundling with library - -,all : lib/forms.js lib/vcard.js lib/instituteDetailsQuery.js - -lib/forms.js : src/forms.ttl - (echo 'module.exports = `' ; cat $< ; echo '`') > $@ - -#organizationForm.js : organizationForm.ttl -# (echo 'module.exports = `' ; cat organizationForm.ttl; echo '`') > organizationForm.js - -src/vcard.ttl: - curl http://www.w3.org/2006/vcard/ns > src/vcard.ttl - -lib/vcard.js : src/vcard.ttl - (echo 'module.exports = `' ; cat $< ; echo '`') > $@ - - -lib/instituteDetailsQuery.js : src/instituteDetailsQuery.sparql - (echo 'module.exports = `' ; cat $< ; echo '`') > $@ diff --git a/__tests__/unit/data-reformat-test.js b/__tests__/unit/data-reformat-test.js deleted file mode 100644 index 6eba368..0000000 --- a/__tests__/unit/data-reformat-test.js +++ /dev/null @@ -1,166 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -import { getDataModelIssues } from '../../contactLogic'; -import fetchMock from "jest-fetch-mock"; -import pane from "../../contactsPane"; -import { parse } from "rdflib"; -import { context, doc, mockFetchFunction, mockUpdate, ns, store, prefixes, web } from "./setup"; -// This was at testingsolidos.solidcommunity.net -const base = doc.dir().uri; -const webid1 = store.sym(base + 'People/localPerson/index.ttl#this'); -const exampleData = prefixes + ` - -:homeGroup1 a vcard:Group; - vcard:fn "Happy Home"; - vcard:hasMember ${webid1} . - -:homeGroup2 a vcard:Group; - vcard:fn "Home"; - vcard:hasMember :localPerson. - -:homeGroup3 a vcard:Group; - vcard:fn "Home"; - vcard:hasMember :localPerson. - -`; -const book = store.sym(base + 'book.ttl#this'); -const aliceLocal = store.sym(base + 'People/aaaaaaaaaa/index.ttl#this'); -const aliceWebId = store.sym('https://alice.example/card#me'); -web[aliceLocal.doc().uri] = `<#this> a vcard:Individual, schema:Person; vcard:fn "Alice".`; -const bobLocal = store.sym(base + 'People/bbbbbbbbbb/index.ttl#this'); -const bobWebId = store.sym('https://bob.example.net/#me'); -web[bobLocal.doc().uri] = `<#this> a vcard:Individual, schema:Person; - vcard:hasURL [ vcard:type vcard:WebId; vcard:value ${bobWebId} ]; - vcard:fn "Bob".`; -web[base + 'book.ttl'] = ` -<#this> a vcard:AddressBook; - vcard:fn """Contacts: Test address book"""; - vcard:nameEmailIndex ; - vcard:groupIndex . -`; -web[base + 'groups.ttl'] = ` - a vcard:Group ; - vcard:fn "Test group". - a vcard:Group ; - vcard:fn "Home group". - a vcard:Group ; - vcard:fn "Work group". -`; -const testGroup = store.sym(base + 'Group/Test.ttl#this'); -web[testGroup.doc().uri] = ` -<#this> a vcard:Group; - vcard:fn "Test Group"; - vcard:hasMember ${aliceLocal} . -# , -# <../People/aaaaaaaaaa/index.ttl#this>, -# <../People/bbbbbbbbbbb/index.ttl#this> . - - ${aliceLocal} = ${aliceWebId} . -`; -const homeGroup = store.sym(base + 'Group/Home.ttl#this'); -web[homeGroup.doc().uri] = ` -<#this> a vcard:Group; - vcard:fn "Home Group"; - vcard:hasMember - <../People/aaaaaaaaaa/index.ttl#this>, - <../People/bbbbbbbbbb/index.ttl#this> . -`; -const workGroup = store.sym(base + 'Group/Work.ttl#this'); -web[workGroup.doc().uri] = ` -<#this> a vcard:Group; - vcard:fn "Work Group"; - vcard:hasMember - , - , - .`; -web[base + 'People/aaaaaaaaaa/index.ttl'] = ` - <#this> vcard:fn "Alice" . -`; -const groups = [testGroup, homeGroup, workGroup]; -for (const uri in web) { - console.log(` parsing "${uri}" (${web[uri].length})`); - parse(prefixes + web[uri], store, uri); -} -describe("contacts-pane", () => { - describe("returns right label", () => { - beforeAll(() => __awaiter(void 0, void 0, void 0, function* () { - store.removeDocument(doc); - // parse(exampleData, store, doc.uri); - // const label = pane.label(subject, context); - })); - /* - if (t[ns.vcard('Individual').uri]) return 'Contact' - if (t[ns.vcard('Organization').uri]) return 'contact' - if (t[ns.foaf('Person').uri]) return 'Person' - if (t[ns.schema('Person').uri]) return 'Person' - if (t[ns.vcard('Group').uri]) return 'Group' - if (t[ns.vcard('AddressBook').uri]) return 'Address book' - */ - it("returns a good label contact if Organization", () => { - let thing = store.sym(base + 'thing1'); - store.add(thing, ns.rdf('type'), ns.vcard('Organization'), doc); - expect(pane.label(thing, context)).toEqual('contact'); - }); - it("returns a good label Contact for Individual", () => { - let thing = store.sym(base + 'thing2'); - store.add(thing, ns.rdf('type'), ns.vcard('Individual'), doc); - expect(pane.label(thing, context)).toEqual('Contact'); - }); - it("returns a good label Person if Person", () => { - let thing = store.sym(base + 'thing3'); - store.add(thing, ns.rdf('type'), ns.schema('Person'), doc); - expect(pane.label(thing, context)).toEqual('Person'); - }); - it("returns a good label Person if foaf:Person", () => { - let thing = store.sym(base + 'thing4'); - store.add(thing, ns.rdf('type'), ns.foaf('Person'), doc); - expect(pane.label(thing, context)).toEqual('Person'); - }); - it("returns a good label Group if Group", () => { - let thing = store.sym(base + 'thing5'); - store.add(thing, ns.rdf('type'), ns.vcard('Group'), doc); - expect(pane.label(thing, context)).toEqual('Group'); - }); - it("returns a good label AddressBook if AddressBook", () => { - let thing = store.sym(base + 'thing6'); - store.add(thing, ns.rdf('type'), ns.vcard('AddressBook'), doc); - expect(pane.label(thing, context)).toEqual('Address book'); - }); - it("returns a null label if not a person", () => { - let thing = store.sym(base + 'thing7'); - expect(pane.label(store.sym('https://random.example.com/'), context)).toEqual(null); - // done() - }); - }); // label tests - describe("render tests", () => { - it("renders an empty UI of an address book", () => { - const div = pane.render(book, context); - expect(div.outerHTML).toMatch("
"); - expect(div.innerHTML).toMatch(""); - }); - }); // render tests - describe("data format tests", () => { - beforeAll(() => __awaiter(void 0, void 0, void 0, function* () { - store.removeDocument(doc); - parse(exampleData, store, doc.uri); - fetchMock.mockIf(/^https?.*$/, mockFetchFunction); - })); - it("converts a bad format into a good one", () => __awaiter(void 0, void 0, void 0, function* () { - expect(store.the(testGroup, ns.vcard('hasMember'), null, testGroup.doc())).toEqual(aliceLocal); - const { del, ins } = yield getDataModelIssues(groups); - expect(del.length).toEqual(1); - expect(ins.length).toEqual(1); - expect(del.toString()).toEqual(' .'); - expect(ins.toString()).toEqual(' .'); - mockUpdate(store, del, ins); - expect(store.the(testGroup, ns.vcard('hasMember'), null, testGroup.doc())).toEqual(aliceWebId); - })); - }); // data format tests -}); // all tests diff --git a/__tests__/unit/data-reformat-test.ts b/__tests__/unit/data-reformat-test.ts deleted file mode 100644 index fb56e09..0000000 --- a/__tests__/unit/data-reformat-test.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { getDataModelIssues } from '../../contactLogic' -import fetchMock from "jest-fetch-mock"; - -import pane from "../../contactsPane"; -import { parse, NamedNode } from "rdflib"; -import { context, doc, subject, mockFetchFunction, mockUpdate, ns, store, prefixes, web } from "./setup"; - -// This was at testingsolidos.solidcommunity.net - -const base = doc.dir().uri -const webid1 = store.sym(base + 'People/localPerson/index.ttl#this') - -const exampleData = prefixes + ` - -:homeGroup1 a vcard:Group; - vcard:fn "Happy Home"; - vcard:hasMember ${webid1} . - -:homeGroup2 a vcard:Group; - vcard:fn "Home"; - vcard:hasMember :localPerson. - -:homeGroup3 a vcard:Group; - vcard:fn "Home"; - vcard:hasMember :localPerson. - -` - -const book = store.sym(base + 'book.ttl#this') - -const aliceLocal = store.sym(base + 'People/aaaaaaaaaa/index.ttl#this'); -const aliceWebId = store.sym('https://alice.example/card#me') - -web[aliceLocal.doc().uri] = `<#this> a vcard:Individual, schema:Person; vcard:fn "Alice".`; - -const bobLocal = store.sym(base + 'People/bbbbbbbbbb/index.ttl#this') -const bobWebId = store.sym('https://bob.example.net/#me') -web[bobLocal.doc().uri] = `<#this> a vcard:Individual, schema:Person; - vcard:hasURL [ vcard:type vcard:WebId; vcard:value ${bobWebId} ]; - vcard:fn "Bob".`; - - - -web[base + 'book.ttl'] = ` -<#this> a vcard:AddressBook; - vcard:fn """Contacts: Test address book"""; - vcard:nameEmailIndex ; - vcard:groupIndex . -`; - -web[base + 'groups.ttl'] = ` - a vcard:Group ; - vcard:fn "Test group". - a vcard:Group ; - vcard:fn "Home group". - a vcard:Group ; - vcard:fn "Work group". -`; - -const testGroup = store.sym(base + 'Group/Test.ttl#this') -web[testGroup.doc().uri] = ` -<#this> a vcard:Group; - vcard:fn "Test Group"; - vcard:hasMember ${aliceLocal} . -# , -# <../People/aaaaaaaaaa/index.ttl#this>, -# <../People/bbbbbbbbbbb/index.ttl#this> . - - ${aliceLocal} = ${aliceWebId} . -`; -const homeGroup = store.sym(base + 'Group/Home.ttl#this') -web[homeGroup.doc().uri] = ` -<#this> a vcard:Group; - vcard:fn "Home Group"; - vcard:hasMember - <../People/aaaaaaaaaa/index.ttl#this>, - <../People/bbbbbbbbbb/index.ttl#this> . -`; - -const workGroup = store.sym(base + 'Group/Work.ttl#this') -web[workGroup.doc().uri] = ` -<#this> a vcard:Group; - vcard:fn "Work Group"; - vcard:hasMember - , - , - .`; - -web[base + 'People/aaaaaaaaaa/index.ttl'] = ` - <#this> vcard:fn "Alice" . -`; - -const groups = [ testGroup, homeGroup, workGroup ]; - -for (const uri in web) { - console.log(` parsing "${uri}" (${web[uri].length})`) - parse(prefixes + web[uri], store, uri); -} - -describe("contacts-pane", () => { - - describe("returns right label", () => { - beforeAll(async () => { - store.removeDocument(doc); - // parse(exampleData, store, doc.uri); - // const label = pane.label(subject, context); - }); -/* -if (t[ns.vcard('Individual').uri]) return 'Contact' -if (t[ns.vcard('Organization').uri]) return 'contact' -if (t[ns.foaf('Person').uri]) return 'Person' -if (t[ns.schema('Person').uri]) return 'Person' -if (t[ns.vcard('Group').uri]) return 'Group' -if (t[ns.vcard('AddressBook').uri]) return 'Address book' -*/ - it("returns a good label contact if Organization", () => { - let thing = store.sym(base + 'thing1') - store.add(thing, ns.rdf('type'), ns.vcard('Organization'), doc) - expect(pane.label(thing, context)).toEqual('contact'); - }); - - it("returns a good label Contact for Individual", () => { - let thing = store.sym(base + 'thing2') - store.add(thing, ns.rdf('type'), ns.vcard('Individual'), doc) - expect(pane.label(thing, context)).toEqual('Contact'); - }); - it("returns a good label Person if Person", () => { - let thing = store.sym(base + 'thing3') - store.add(thing, ns.rdf('type'), ns.schema('Person'), doc) - expect(pane.label(thing, context)).toEqual('Person'); - }); - it("returns a good label Person if foaf:Person", () => { - let thing = store.sym(base + 'thing4') - store.add(thing, ns.rdf('type'), ns.foaf('Person'), doc) - expect(pane.label(thing, context)).toEqual('Person'); - }); - it("returns a good label Group if Group", () => { - let thing = store.sym(base + 'thing5') - - store.add(thing, ns.rdf('type'), ns.vcard('Group'), doc) - expect(pane.label(thing, context)).toEqual('Group'); - }); - it("returns a good label AddressBook if AddressBook", () => { - let thing = store.sym(base + 'thing6') - store.add(thing, ns.rdf('type'), ns.vcard('AddressBook'), doc) - expect(pane.label(thing, context)).toEqual('Address book'); - }); - it("returns a null label if not a person", () => { - let thing = store.sym(base + 'thing7') - expect(pane.label(store.sym('https://random.example.com/'), context)).toEqual(null); - // done() - }); - - }); // label tests - - describe("render tests", () => { // How to get the UI which comes over time? - it("renders an empty UI of an address book", () => { - const div = pane.render(book, context) - expect(div.outerHTML).toMatch("
"); - expect(div.innerHTML).toMatch(""); - }); - }); // render tests - - describe("data format tests", () => { - beforeAll(async () => { - store.removeDocument(doc); - parse(exampleData, store, doc.uri); - fetchMock.mockIf(/^https?.*$/, mockFetchFunction) - }); - - it("converts a bad format into a good one", async () => { - expect(store.the(testGroup, ns.vcard('hasMember'), null, testGroup.doc())).toEqual(aliceLocal) - const { del, ins } = await getDataModelIssues(groups) - expect(del.length).toEqual(1) - expect(ins.length).toEqual(1) - expect(del.toString()).toEqual(' .') - expect(ins.toString()).toEqual(' .') - mockUpdate(store, del, ins) - expect(store.the(testGroup, ns.vcard('hasMember'), null, testGroup.doc())).toEqual(aliceWebId) - - }); - - }); // data format tests - -}); // all tests diff --git a/__tests__/unit/setup.js b/__tests__/unit/setup.js deleted file mode 100644 index e5c90f3..0000000 --- a/__tests__/unit/setup.js +++ /dev/null @@ -1,74 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -import { ns, store } from "solid-ui"; -export { ns, store, rdf } from "solid-ui"; -// console.log('@@ store', store) -// console.log('@@ store.sym', store.sym) -export const subject = store.sym("https://janedoe.example/profile/card#me"); -export const doc = subject.doc(); -export const context = { - dom: document, - getOutliner: () => null, - session: { - paneRegistry: { - byName: (name) => { - return { - render: () => { - return document.createElement('div') - .appendChild(document.createTextNode(`mock ${name} pane`)); - } - }; - } - }, - store, - logic: {}, - }, -}; -const prefs = Object.keys(ns).filter(x => x !== 'default'); // default is bogus value -export const prefixes = prefs.map(prefix => `@prefix ${prefix}: ${ns[prefix]('')}.\n`).join(''); // In turtle -export let web = {}; -export let requests = []; -export function mockFetchFunction(req) { - return __awaiter(this, void 0, void 0, function* () { - if (req.method !== 'GET') { - requests.push(req); - if (req.method === 'PUT') { - const contents = yield req.text(); - web[req.url] = contents; // Update our dummy web - console.log(`Tetst: Updated ${req.url} on PUT to <<<${web[req.url]}>>>`); - } - return { status: 200 }; - } - const contents = web[req.url]; - if (contents !== undefined) { // - return { - body: prefixes + contents, - status: 200, - headers: { - "Content-Type": "text/turtle", - "WAC-Allow": 'user="write", public="read"', - "Accept-Patch": "application/sparql-update" - } - }; - } // if contents - return { - status: 404, - body: 'Not Found' - }; - }); -} -export function mockUpdate(store, del, ins) { - for (const st of del) { - store.remove(st); - } - for (const st of ins) { - store.addStatement(st); - } -} diff --git a/__tests__/unit/setup.ts b/__tests__/unit/setup.ts deleted file mode 100644 index e2aef70..0000000 --- a/__tests__/unit/setup.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { DataBrowserContext, PaneRegistry } from "pane-registry"; - -import { Statement, LiveStore } from "rdflib"; -import { ns, store, rdf } from "solid-ui" -export { ns, store, rdf } from "solid-ui" - -import { SolidLogic } from "solid-logic"; - -// console.log('@@ store', store) -// console.log('@@ store.sym', store.sym) - -export const subject = store.sym("https://janedoe.example/profile/card#me"); -export const doc = subject.doc(); - -export const context = { - dom: document, - getOutliner: () => null, - session: { - paneRegistry: { - byName: (name: string) => { - return { - render: () => { - return document.createElement('div') - .appendChild( - document.createTextNode(`mock ${name} pane`) - ); - } - } - } - } as PaneRegistry, - store, - logic: {} as SolidLogic, - }, -} as unknown as DataBrowserContext; - -const prefs = Object.keys(ns).filter(x => x !== 'default') // default is bogus value -export const prefixes = prefs.map(prefix => `@prefix ${prefix}: ${ns[prefix]('')}.\n`).join('') // In turtle - -export let web = {} -export let requests = [] - -export async function mockFetchFunction (req) { - if (req.method !== 'GET') { - requests.push(req) - if (req.method === 'PUT') { - const contents = await req.text() - web[req.url] = contents // Update our dummy web - console.log(`Tetst: Updated ${req.url} on PUT to <<<${web[req.url]}>>>`) - } - return { status: 200 } - } - const contents = web[req.url] - if (contents !== undefined) { // - return { - body: prefixes + contents, // Add namespaces to anything - status: 200, - headers: { - "Content-Type": "text/turtle", - "WAC-Allow": 'user="write", public="read"', - "Accept-Patch": "application/sparql-update" - } - } - } // if contents - return { - status: 404, - body: 'Not Found' - } -} - -export function mockUpdate (store: LiveStore, del: Statement[], ins: Statement[]) { - for (const st of del) { - store.remove(st) - } - for (const st of ins) { - store.addStatement(st) - } -} diff --git a/babel.config.js b/babel.config.js index 1f86f72..da4e036 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,13 +1,23 @@ -module.exports = { +export default { presets: [ [ - "@babel/preset-env", + '@babel/preset-env', { targets: { - node: "current", + node: 'current', }, }, ], - "@babel/preset-typescript", + '@babel/preset-typescript', ], -}; + plugins: [ + [ + 'babel-plugin-inline-import', { + extensions: [ + '.ttl', + '.sparql' + ] + } + ] + ] +} diff --git a/declarations.d.ts b/declarations.d.ts new file mode 100644 index 0000000..5cc7479 --- /dev/null +++ b/declarations.d.ts @@ -0,0 +1,9 @@ +declare module '*.ttl' { + const content: string; + export default content; +} + +declare module '*.sparql' { + const content: string; + export default content; +} diff --git a/diff.txt b/diff.txt deleted file mode 100644 index bf92fbc..0000000 --- a/diff.txt +++ /dev/null @@ -1,884 +0,0 @@ -diff --git a/js/panes/contact/contactPane.js b/js/panes/contact/contactPane.js -index 00eadfa..e408c2a 100644 ---- a/js/panes/contact/contactPane.js -+++ b/js/panes/contact/contactPane.js -@@ -22,203 +22,6 @@ if (typeof console == 'undefined') { // e.g. firefox extension. Node and browser - - - --////////////////////////////////////////////////////// SUBCRIPTIONS -- --$rdf.subscription = function(options, doc, onChange) { -- -- -- // for all Link: uuu; rel=rrr ---> { rrr: uuu } -- var linkRels = function(doc) { -- var links = {}; // map relationship to uri -- var linkHeaders = tabulator.fetcher.getHeader(doc, 'link'); -- if (!linkHeaders) return null; -- linkHeaders.map(function(headerValue){ -- var arg = headerValue.trim().split(';'); -- var uri = arg[0]; -- arg.slice(1).map(function(a){ -- var key = a.split('=')[0].trim(); -- var val = a.split('=')[1].trim(); -- if (key ==='rel') { -- links[val] = uri.trim(); -- } -- }); -- }); -- return links; -- }; -- -- -- var getChangesURI = function(doc, rel) { -- var links = linkRels(doc); -- if (!links[rel]) { -- console.log("No link header rel=" + rel + " on " + doc.uri) -- return null; -- } -- var changesURI = $rdf.uri.join(links[rel], doc.uri); -- // console.log("Found rel=" + rel + " URI: " + changesURI); -- return changesURI; -- }; -- -- -- --/////////////// Subscribe to changes by SSE -- -- -- var getChanges_SSE = function(doc, onChange) { -- var streamURI = getChangesURI(doc, 'events'); -- if (!streamURI) return; -- var source = new EventSource(streamURI); // @@@ just path?? -- console.log("Server Side Source"); -- -- source.addEventListener('message', function(e) { -- console.log("Server Side Event: " + e); -- alert("SSE: " + e) -- // $('ul').append('
  • ' + e.data + ' (message id: ' + e.lastEventId + ')
  • '); -- }, false); -- }; -- -- -- -- -- //////////////// Subscribe to changes websocket -- -- // This implementation uses web sockets using update-via -- -- var getChanges_WS2 = function(doc, onChange) { -- var router = new $rdf.UpdatesVia(tabulator.fetcher); // Pass fetcher do it can subscribe to headers -- var wsuri = getChangesURI(doc, 'changes').replace(/^http:/, 'ws:').replace(/^https:/, 'wss:'); -- router.register(wsuri, doc.uri); -- }; -- -- -- var getChanges_WS = function(doc, onChange) { -- var SQNS = $rdf.Namespace('http://www.w3.org/ns/pim/patch#'); -- var changesURI = getChangesURI(doc, 'updates'); // @@@@ use single -- var socket; -- try { -- socket = new WebSocket(changesURI); -- } catch(e) { -- socket = new MozWebSocket(changesURI); -- }; -- -- socket.onopen = function(event){ -- console.log("socket opened"); -- }; -- -- socket.onmessage = function (event) { -- console.log("socket received: " +event.data); -- var patchText = event.data; -- console.log("Success: patch received:" + patchText); -- -- // @@ check integrity of entire patch -- var patchKB = $rdf.graph(); -- var sts; -- try { -- $rdf.parse(patchText, patchKB, doc.uri, 'text/n3'); -- } catch(e) { -- console.log("Parse error in patch: "+e); -- }; -- clauses = {}; -- ['where', 'insert', 'delete'].map(function(pred){ -- sts = patchKB.statementsMatching(undefined, SQNS(pred), undefined); -- if (sts) clauses[pred] = sts[0].object; -- }); -- console.log("Performing patch!"); -- kb.applyPatch(clauses, doc, function(err){ -- if (err) { -- console.log("Incoming patch failed!!!\n" + err) -- alert("Incoming patch failed!!!\n" + err) -- socket.close(); -- } else { -- console.log("Incoming patch worked!!!!!!\n" + err) -- onChange(); // callback user -- }; -- }); -- }; -- -- }; // end getChanges -- -- -- ////////////////////////// Subscribe to changes using Long Poll -- -- // This implementation uses link headers and a diff returned by plain HTTP -- -- var getChanges_LongPoll = function(doc, onChange) { -- var changesURI = getChangesURI(doc, 'changes'); -- if (!changesURI) return "No advertized long poll URI"; -- console.log(tabulator.panes.utils.shortTime() + " Starting new long poll.") -- var xhr = $rdf.Util.XMLHTTPFactory(); -- xhr.alreadyProcessed = 0; -- -- xhr.onreadystatechange = function(){ -- switch (xhr.readyState) { -- case 0: -- case 1: -- return; -- case 3: -- console.log("Mid delta stream (" + xhr.responseText.length + ") "+ changesURI); -- handlePartial(); -- break; -- case 4: -- handlePartial(); -- console.log(tabulator.panes.utils.shortTime() + " End of delta stream " + changesURI); -- break; -- } -- }; -- -- try { -- xhr.open('GET', changesURI); -- } catch (er) { -- console.log("XHR open for GET changes failed <"+changesURI+">:\n\t" + er); -- } -- try { -- xhr.send(); -- } catch (er) { -- console.log("XHR send failed <"+changesURI+">:\n\t" + er); -- } -- -- var handlePartial = function() { -- // @@ check content type is text/n3 -- -- if (xhr.status >= 400) { -- console.log("HTTP (" + xhr.readyState + ") error " + xhr.status + "on change stream:" + xhr.statusText); -- console.log(" error body: " + xhr.responseText); -- xhr.abort(); -- return; -- } -- if (xhr.responseText.length > xhr.alreadyProcessed) { -- var patchText = xhr.responseText.slice(xhr.alreadyProcessed); -- xhr.alreadyProcessed = xhr.responseText.length; -- -- console.log(tabulator.panes.utils.shortTime() + " Long poll returns, processing...") -- xhr.headers = $rdf.Util.getHTTPHeaders(xhr); -- try { -- onChange(patchText); -- } catch (e) { -- console.log("Exception in patch update handler: " + e) -- // @@ Where to report error e? -- } -- getChanges_LongPoll(doc, onChange); // Queue another one -- -- } -- }; -- return null; // No error -- -- }; // end getChanges_LongPoll -- -- if (options.longPoll ) { -- getChanges_LongPoll(doc, onChange); -- } -- if (options.SSE) { -- getChanges_SSE(doc, onChange); -- } -- if (options.websockets) { -- getChanges_WS(doc, onChange); -- } -- --}; // subscription -- --/////////////////////////////////////////// End of subscription stufff -- - // Sets the best name we have and looks up a better one - tabulator.panes.utils.setName = function(element, subject) { - var kb = tabulator.kb, ns = tabulator.ns; -@@ -271,15 +74,15 @@ tabulator.panes.utils.deleteButtonWithCheck = function(dom, container, noun, del - - tabulator.panes.utils.adoptACLDefault = function(doc, aclDoc, defaultResource, defaultACLdoc) { - var kb = tabulator.kb; -- var auth = tabulator.ns.auth; -+ var ACL = tabulator.ns.acl; - var ns = tabulator.ns; -- var defaults = kb.each(undefined, auth('defaultForNew'), defaultResource, defaultACLdoc); -+ var defaults = kb.each(undefined, ACL('defaultForNew'), defaultResource, defaultACLdoc); - var proposed = []; - defaults.map(function(da) { -- proposed = proposed.concat(kb.statementsMatching(da, auth('agent'), undefined, defaultACLdoc)) -- .concat(kb.statementsMatching(da, auth('agentClass'), undefined, defaultACLdoc)) -- .concat(kb.statementsMatching(da, auth('mode'), undefined, defaultACLdoc)); -- proposed.push($rdf.st(da, auth('accessTo'), doc, defaultACLdoc)); // Suppose -+ proposed = proposed.concat(kb.statementsMatching(da, ACL('agent'), undefined, defaultACLdoc)) -+ .concat(kb.statementsMatching(da, ACL('agentClass'), undefined, defaultACLdoc)) -+ .concat(kb.statementsMatching(da, ACL('mode'), undefined, defaultACLdoc)); -+ proposed.push($rdf.st(da, ACL('accessTo'), doc, defaultACLdoc)); // Suppose - }); - var kb2 = $rdf.graph(); // Potential - derived is kept apart - proposed.map(function(st){ -@@ -292,29 +95,177 @@ tabulator.panes.utils.adoptACLDefault = function(doc, aclDoc, defaultResource, d - }); - - // @@@@@ ADD TRIPLES TO ACCES CONTROL ACL FILE -- until servers fixed @@@@@ -- var ccc = kb2.each(undefined, auth('accessTo'), doc) -- .filter(function(au){ return kb2.holds(au, auth('mode'), auth('Control'))}); -+ var ccc = kb2.each(undefined, ACL('accessTo'), doc) -+ .filter(function(au){ return kb2.holds(au, ACL('mode'), ACL('Control'))}); - ccc.map(function(au){ - var au2 = kb2.sym(au.uri + "__ACLACL"); -- kb2.add(au2, ns.rdf('type'), auth('Authorization'), aclDoc); -- kb2.add(au2, auth('accessTo'), aclDoc, aclDoc); -- kb2.add(au2, auth('mode'), auth('Read'), aclDoc); -- kb2.add(au2, auth('mode'), auth('Write'), aclDoc); -- kb2.each(au, auth('agent')).map(function(who){ -- kb2.add(au2, auth('agent'), who, aclDoc); -+ kb2.add(au2, ns.rdf('type'), ACL('Authorization'), aclDoc); -+ kb2.add(au2, ACL('accessTo'), aclDoc, aclDoc); -+ kb2.add(au2, ACL('mode'), ACL('Read'), aclDoc); -+ kb2.add(au2, ACL('mode'), ACL('Write'), aclDoc); -+ kb2.each(au, ACL('agent')).map(function(who){ -+ kb2.add(au2, ACL('agent'), who, aclDoc); - }); -- kb2.each(au, auth('agentClass')).map(function(who){ -- kb2.add(au2, auth('agentClass'), who, aclDoc); -+ kb2.each(au, ACL('agentClass')).map(function(who){ -+ kb2.add(au2, ACL('agentClass'), who, aclDoc); - }); - }); - - return kb2; - } - -+ -+// Read and conaonicalize the ACL for x in aclDoc -+// -+// Accumulate the access rights which each agent or class has -+// -+tabulator.panes.utils.readACL = function(x, aclDoc) { -+ var ac = {'agent': [], 'agentClass': []}; -+ var auths = kb.each(undefined, ACL('acccessTo'), x); -+ for (var pred in ['agent', 'agentClass']) { -+ auths.map(function(a){ -+ kb.each(a, ACL('mode')).map(function(mode){ -+ kb.each(a, ACL('agent')).map(function(agent){ -+ -+ if (!ac[pred][agent]) ac[pred][agent] = []; -+ ac[pred][agent][mode] = true; -+ agents[mode][agent] = a; -+ }); -+ }); -+ }); -+ } -+ return ac; -+} -+ -+// Compare two ACLs -+tabulator.panes.utils.sameACL = function(a, b) { -+ var contains = function(a, b) { -+ ['agent', 'agentClass'].map(function(pred){ -+ if (a[pred]) { -+ for (var ag in a[pred]) { -+ for (var mode in a[pred][agent]) { -+ if (!b[pred][agent] || !b[pred][agent][mode]) { -+ return false; -+ } -+ } -+ } -+ }; -+ }); -+ return true; -+ } -+ return contains(a, b) && contains(b,a); -+} -+ -+// Union N ACLs -+tabulator.panes.utils.ACLunion = function(list) { -+ var b = list[0]; -+ for (var k=1; k < list.length; k++) { -+ ['agent', 'agentClass'].map(function(pred){ -+ if (a[pred]) { -+ for (var ag in a[pred]) { -+ for (var mode in a[pred][ag]) { -+ if (!b[pred][ag]) b[pred][ag] = []; -+ b[pred][ag][mode] = true; -+ } -+ } -+ }; -+ }); -+ } -+ return b; -+} -+ -+ -+// Merge ACLs lists from things to form union -+ -+tabulator.panes.utils.loadUnionACL = function(subjectList, callback) { -+ var aclList = []; -+ var doList = function(list) { -+ if (list.length) { -+ doc = list.shift(); -+ tabulator.panes.utils.getACLorDefault(list[0], function(ok, defa, p3, p4, defaultHolder, defaultACLDoc){ -+ if (!ok) return callback(ok, p4); -+ acList.append((defa) ? tabulator.panes.utils.readACL(defaultHolder, defaultACLDoc) : -+ tabulator.panes.utils.readACL(p3, p4)); -+ doList(list.slice(1)); -+ }); -+ } else { // all gone -+ callback(true, tabulator.panes.utils.ACLunion(aclList)) -+ } -+ } -+ doList(subjectList); -+} -+ -+// Represents these as a RDF graph by combination of modes -+// -+tabulator.panes.utils.writeACL = function(kb, x, ac, aclDoc) { -+ var byCombo = []; -+ for (var pred in ['agent', 'agentClass']) { -+ for (var agent in ac[pred]) { -+ if (ac[pred][agent]) for (var agent in ac[pred][agent]) { -+ var modes = ac[pred][agent]; -+ var combo = []; -+ for (var mode in ac[pred][agent]) { -+ combo.append(mode.fromNT.uri) // -+ } -+ combo.sort() -+ combo = combo.join('\n'); -+ if (!byCombo[combo]) byCombo[combo] = []; -+ byCombo[combo].append([pred, agent]) -+ } -+ } -+ } -+ for (combo in byCombo) { -+ var a = kb.sym(aclDoc.uri + '#' + combo); -+ kb.add(a, tabulator.ns.rdf('type'), ACL('Authorization'), aclDoc); -+ var m = combo.split('\n'); -+ for (var i=0; i < m.length; i++) { -+ kb.add(a, ACL('mode'), kb.sym(m[i]), aclDoc); -+ } -+ var pairs = byCombo[combo]; -+ for (i=0; i< pairs.length; i++) { -+ var p = pairs[0], ag = pairs[1]; -+ kb.add(a, ACL(p), kb.sym(ag), aclDoc); -+ } -+ -+ } -+} -+ -+// Fix the ACl for an individual card as a function of the groups it is in -+// -+// All group files must be loaded first -+// -+ -+tabulator.panes.utils.fixIndividualCardACL = function(person, callback) { -+ var groups = tabulator.kb.each(undefined, tabulator.ns.vcard('hasMember'), person); -+ if (groups) { -+ tabulator.panes.utils.fixIndividualACL(person.doc(), groups, callback); -+ } -+ // @@ if no groups, then use default for People container or the book top container. -+} -+ -+tabulator.panes.utils.fixIndividualACL = function(doc, subjects, callback) { -+ tabulator.panes.utils.getACLorDefault(doc, function(ok, defa, p3, p4, defaultHolder, defaultACLDoc){ -+ if (!ok) return callback(ok, p4); -+ var ac = (defa) ? tabulator.panes.utils.readACL(defaultHolder, defaultACLDoc) : -+ tabulator.panes.utils.readACL(p3, p4); -+ tabulator.panes.utils.loadUnionACL(subjects, function(ok, union){ -+ if (tabulator.panes.utils.sameACL(union, ac)) { -+ console.log("Nice - same ACL. no change " + doc); -+ } else { -+ console.log("Group ACLs differ for " + doc); -+ console.log("Group ACLs " + union + "\n"); -+ console.log((defa ? "Default" : "Previous set") + " ACLs " + ac + "\n"); -+ // @@@ TBD -+ // serialize and store ACL. -+ } -+ }); -+ }) -+} -+ - tabulator.panes.utils.ACLControlBox = function(subject, dom, callback) { - var kb = tabulator.kb; - var updater = new tabulator.rdf.sparqlUpdate(kb); -- var auth = tabulator.ns.auth; -+ var ACL = tabulator.ns.acl; - var doc = $rdf.sym(subject.uri.split('#')[0]); // The ACL is actually to the doc describing the thing - - var table = dom.createElement('table'); -@@ -331,15 +282,15 @@ tabulator.panes.utils.ACLControlBox = function(subject, dom, callback) { - var bottomRow = table.appendChild(dom.createElement('tr')); - - var ACLControl = function(box, doc, aclDoc, kb) { -- var authorizations = kb.each(undefined, auth('accessTo'), doc, aclDoc); // ONLY LOOK IN ACL DOC -+ var authorizations = kb.each(undefined, ACL('accessTo'), doc, aclDoc); // ONLY LOOK IN ACL DOC - if (authorizations.length === 0) { - statusBlock.textContent += "Access control file exists but contains no authorizations! " + aclDoc + ")"; - } - for (i=0; i < authorizations.length; i++) { - var row = box.appendChild(dom.createElement('tr')); - var rowdiv1 = row.appendChild(dom.createElement('div')); -- row.setAttribute('style', 'margin: 1em; border: 0.1em solid black; border-radius: 0.5em; padding: 1em;') // doesn't work -- rowdiv1.setAttribute('style', 'margin: 1em; border: 0.1em solid black; border-radius: 1em; padding: 1em;'); -+ -+ rowdiv1.setAttribute('style', 'margin: 1em; border: 0.1em solid #444; border-radius: 0.5em; padding: 1em;'); - rowtable1 = rowdiv1.appendChild(dom.createElement('table')); - rowrow = rowtable1.appendChild(dom.createElement('tr')); - var left = rowrow.appendChild(dom.createElement('td')); -@@ -351,44 +302,105 @@ tabulator.panes.utils.ACLControlBox = function(subject, dom, callback) { - var rightTable = right.appendChild(dom.createElement('table')); - var a = authorizations[i]; - -- kb.each(a, auth('agent')).map(function(x){ -+ kb.each(a, ACL('agent')).map(function(x){ - var tr = leftTable.appendChild(dom.createElement('tr')); - tabulator.panes.utils.setName(tr, x); - tr.setAttribute('style', 'min-width: 12em'); - }); - -- kb.each(a, auth('agentClass')).map(function(x){ -+ kb.each(a, ACL('agentClass')).map(function(x){ - var tr = leftTable.appendChild(dom.createElement('tr')); - tr.textContent = tabulator.Util.label(x) + ' *'; // for now // later add # or members - }); - -- kb.each(a, auth('mode')).map(function(x){ -+ kb.each(a, ACL('mode')).map(function(x){ - var tr = rightTable.appendChild(dom.createElement('tr')); - tr.textContent = tabulator.Util.label(x); // for now // later add # or members - }); - } - } - -- tabulator.panes.utils.getACL(doc, function(ok, status, aclDoc, message) { -- var i, row, left, right, a; -- var auth = tabulator.ns.auth; -- var useDefault; -- var addDefaultButton = function() { -- useDefault = bottomRow.appendChild(dom.createElement('button')); -- useDefault.textContent = "Stop specific sharing for this group -- just use default."; -- useDefault.addEventListener('click', function(event) { -- updater.delete(doc, function(uri, ok, message){ -- if (!ok) { -- statusBlock.textContent += " (Error deleting access control file: "+message+")"; -- } else { -- statusBlock.textContent = " The sharing for this group is now the default."; -- bottomRow.removeChild(useDefault); -- } -- }); - -- }); -+ tabulator.panes.utils.getACLorDefault(doc, function(ok, defa, p3, p4, defaultHolder, defaultACLDoc){ -+ if (!ok) { -+ statusBlock.textContent += "Error reading " + (defa? " default " : "") + "ACL." -+ + " status " + p3 + ": " + p4; -+ } else { -+ if (defa) { -+ var defaults = kb.each(undefined, ACL('defaultForNew'), defaultHolder, defaultACLDoc); -+ if (!defaults.length) { -+ statusBlock.textContent += " (No defaults given.)"; -+ } else { -+ statusBlock.textContent = "The sharing for this group is the default."; -+ var kb2 = tabulator.panes.utils.adoptACLDefault(doc, aclDoc, defaultHolder, defaultACLDoc) -+ ACLControl(box, doc, aclDoc, kb2); // Add btton to save them as actual -+ -+ var editPlease = bottomRow.appendChild(dom.createElement('button')); -+ editPlease.textContent = "Set specific sharing\nfor this group"; -+ editPlease.addEventListener('click', function(event) { -+ updater.put(aclDoc, kb2.statements, -+ 'text/turtle', function(uri, ok, message){ -+ if (!ok) { -+ statusBlock.textContent += " (Error writing back access control file: "+message+")"; -+ } else { -+ statusBlock.textContent = " (Now editing specific access for this group)"; -+ bottomRow.removeChild(editPlease); -+ } -+ }); -+ -+ }); -+ } // defaults.length -+ } else { // Not using defaults -+ -+ ACLControl(box, p3, p4, kb); -+ addDefaultButton(); -+ -+ } // Not using defaults - } -+ -+ }); -+ -+ return table -+ -+}; // ACLControl -+ -+ -+tabulator.panes.utils.setACL = function(docURI, aclText, callback) { -+ var aclDoc = kb.any(kb.sym(docURI), -+ kb.sym('http://www.iana.org/assignments/link-relations/acl')); // @@ check that this get set by web.js -+ if (aclDoc) { // Great we already know where it is -+ webOperation('PUT', aclDoc.uri, { data: aclText, contentType: 'text/turtle'}, callback); -+ } else { -+ -+ fetcher.nowOrWhenFetched(docURI, undefined, function(ok, body){ -+ if (!ok) return callback(ok, "Gettting headers for ACL: " + body); -+ var aclDoc = kb.any(kb.sym(docURI), -+ kb.sym('http://www.iana.org/assignments/link-relations/acl')); // @@ check that this get set by web.js -+ if (!aclDoc) { -+ // complainIfBad(false, "No Link rel=ACL header for " + docURI); -+ callback(false, "No Link rel=ACL header for " + docURI); -+ } else { -+ webOperation('PUT', aclDoc.uri, { data: aclText, contentType: 'text/turtle'}, callback); -+ } -+ }) -+ } -+}; -+ - -+// Get ACL file or default if necessary -+// -+// callback(true, true, doc, aclDoc) The ACL did exist -+// callback(true, false, doc, aclDoc, defaultHolder, defaultACLDoc) ACL file did not exist but a default did -+// callback(false, false, status, message) error getting original -+// callback(false, true, status, message) error getting defualt -+ -+tabulator.panes.utils.getACLorDefault = function(doc, callback) { -+ -+ tabulator.panes.utils.getACL(doc, function(ok, status, aclDoc, message) { -+ var i, row, left, right, a; -+ var kb = tabulator.kb; -+ var ACL = tabulator.ns.acl; -+ if (!ok) return callback(false, false, status, message); - - // Recursively search for the ACL file which gives default access - var tryParent = function(uri) { -@@ -399,91 +411,48 @@ tabulator.panes.utils.ACLControlBox = function(subject, dom, callback) { - var left = uri.indexOf('/', uri.indexOf('//') + 2); - uri = uri.slice(0, right + 1); - var doc2 = $rdf.sym(uri); -- tabulator.panes.utils.getACL(doc2, function(ok, status, aclDoc2) { -+ tabulator.panes.utils.getACL(doc2, function(ok, status, defaultACLDoc) { - - if (!ok) { -- statusBlock.textContent += ("( No ACL pointer " + uri + ' ' + status + ")"); -+ return callback(false, true, status, "( No ACL pointer " + uri + ' ' + status + ")") - } else if (status === 403) { -- statusBlock.textContent += ("( ACL file FORBIDDEN. Stop." + uri + ")"); -+ return callback(false, true, status,"( default ACL file FORBIDDEN. Stop." + uri + ")"); - } else if (status === 404) { -- statusBlock.textContent += ("( No ACL file for set " + uri + ")"); - if (left >= right) { -- statusBlock.textContent += ("( Thats all folks.)"); -+ return callback(false, true, 499, "Nothing to hold a default"); - } else { - tryParent(uri); - } -+ } else if (status !== 200) { -+ return callback(false, true, status, "Error searching for default"); - } else { // 200 -- statusBlock.textContent += (" ACCESS set at " + uri + ". End search."); -- var defaults = kb.each(undefined, auth('defaultForNew'), kb.sym(uri), aclDoc2); -+ //statusBlock.textContent += (" ACCESS set at " + uri + ". End search."); -+ var defaults = kb.each(undefined, ACL('defaultForNew'), kb.sym(uri), defaultACLDoc); - if (!defaults.length) { -- statusBlock.textContent += " (No defaults given.)"; -+ tryParent(uri); // Keep searching - } else { -- statusBlock.textContent = "The sharing for this group is the default."; -- var kb2 = tabulator.panes.utils.adoptACLDefault(doc, aclDoc, kb.sym(uri), aclDoc2) -- ACLControl(box, doc, aclDoc, kb2); // Add btton to save them as actual -- -- var editPlease = bottomRow.appendChild(dom.createElement('button')); -- editPlease.textContent = "Set specific sharing\nfor this group"; -- editPlease.addEventListener('click', function(event) { -- updater.put(aclDoc, kb2.statements, -- 'text/turtle', function(uri, ok, message){ -- if (!ok) { -- statusBlock.textContent += " (Error writing back access control file: "+message+")"; -- } else { -- statusBlock.textContent = " (Now editing specific access for this group)"; -- bottomRow.removeChild(editPlease); -- } -- }); -- -- }); -+ var defaultHolder = kb.sym(uri); -+ callback(true, false, doc, aclDoc, defaultHolder, defaultACLDoc) - } - } - }); -- }; -+ }; // tryParent - - if (!ok) { -- statusBlock.textContent += ("( Access control information not provided " + uri +")"); -+ return callback(false, false, status , "Error accessing Access Control information for " + uri +")"); - } else if (status === 404) { -- statusBlock.textContent = '(No specific access control has been set.)\n'; // error message -- statusBlock.setAttribute('style', 'background-color: #ffe; padding:2em;'); -- tryParent(doc.uri); -- // @@ construct default one - the server should do that -+ tryParent(doc.uri); // @@ construct default one - the server should do that - } else if (status === 403) { -- statusBlock.textContent = '(Sharing not available to you)'; // error message -+ return callback(false, false, status, "(Sharing not available to you)"); - } else if (status !== 200) { -- statusBlock.textContent = message; // error message -- statusBlock.setAttribute('style', 'background-color: #f99; padding:2em;') -+ return callback(false, false, status, "Error " + status + " accessing Access Control information for " + uri); - } else { // 200 -- ACLControl(box, doc, aclDoc, kb); -- addDefaultButton(); -- } -- }); -- -- return table --}; // ACLControl -+ return callback(true, true, doc, aclDoc); -+ } -+ }); // Call to getACL -+} // getACLorDefault - - --tabulator.panes.utils.setACL = function(docURI, aclText, callback) { -- var aclDoc = kb.any(kb.sym(docURI), -- kb.sym('http://www.iana.org/assignments/link-relations/acl')); // @@ check that this get set by web.js -- if (aclDoc) { // Great we already know where it is -- webOperation('PUT', aclDoc.uri, { data: aclText, contentType: 'text/turtle'}, callback); -- } else { -- -- fetcher.nowOrWhenFetched(docURI, undefined, function(ok, body){ -- if (!ok) return callback(ok, "Gettting headers for ACL: " + body); -- var aclDoc = kb.any(kb.sym(docURI), -- kb.sym('http://www.iana.org/assignments/link-relations/acl')); // @@ check that this get set by web.js -- if (!aclDoc) { -- // complainIfBad(false, "No Link rel=ACL header for " + docURI); -- callback(false, "No Link rel=ACL header for " + docURI); -- } else { -- webOperation('PUT', aclDoc.uri, { data: aclText, contentType: 'text/turtle'}, callback); -- } -- }) -- } --}; -- - // Calls back (ok, status, acldoc, message) - // - // (false, errormessage) no link header -@@ -574,9 +543,9 @@ tabulator.panes.register( { - } - - var complainIfBad = function(ok,body){ -- if (ok) { -+ if (!ok) { -+ console.log("Error: " + body); - } -- else console.log("Sorry, failed to save your change:\n"+body, 'background-color: pink;'); - } - - var getOption = function (tracker, option){ // eg 'allowSubContacts' -@@ -966,7 +935,7 @@ tabulator.panes.register( { - // Write new group to web - // Creates an empty new group file and adds it to the index - // -- var createNewGroup = function(book, name, callback) { -+ var saveNewGroup = function(book, name, callback) { - var gix = kb.any(book, ns.vcard('groupIndex')); - - var x = subject.uri.split('#')[0] -@@ -1060,6 +1029,25 @@ tabulator.panes.register( { - return name ? name.value : '???'; - } - -+ var filterName = function(name) { -+ var filter = searchInput.value.trim().toLowerCase(); -+ if (filter.length === 0) return true; -+ var parts = filter.split(' '); // Each name part must be somewhere -+ for (var j=0; j< parts.length; j++) { -+ word = parts[j]; -+ if (name.toLowerCase().indexOf(word) <0 ) return false; -+ } -+ return true; -+ } -+ -+ var searchFilterNames = function() { -+ for (var i=0; i < peopleMainTable.children.length; i++) { -+ row = peopleMainTable.children[i] -+ row.setAttribute('style', -+ filterName(nameFor(row.subject)) ? '' : 'display: none;'); -+ } -+ } -+ - var bookTable = dom.createElement('table'); - bookTable.setAttribute('style', 'border-collapse: collapse; margin-right: 0;') - div.appendChild(bookTable); -@@ -1078,17 +1066,53 @@ tabulator.panes.register( { - var peopleFooter = bookFooter.appendChild(dom.createElement('td')); - var cardFooter = bookFooter.appendChild(dom.createElement('td')); - -+ var searchDiv = cardHeader.appendChild(dom.createElement('div')); -+ // searchDiv.setAttribute('style', 'border: 0.1em solid #888; border-radius: 0.5em'); -+ searchInput = cardHeader.appendChild(dom.createElement('input')); -+ searchInput.setAttribute('type', 'text'); -+ searchInput.setAttribute('style', 'border: 0.1em solid #444; border-radius: 0.5em; width: 100%;'); -+ // searchInput.addEventListener('input', searchFilterNames); -+ searchInput.addEventListener('input', function(e){ -+ searchFilterNames(); -+ }); -+ - var cardMain = bookMain.appendChild(dom.createElement('td')); - cardMain.setAttribute('style', 'margin: 0;'); // fill space available - var dataCellStyle = 'padding: 0.1em;' - - groupsHeader.textContent = "groups"; - groupsHeader.setAttribute('style', 'min-width: 10em; padding-bottom 0.2em;'); -+ var allGroups = groupsHeader.appendChild(dom.createElement('button')); -+ allGroups.textContent = "All"; -+ allGroups.setAttribute('style', 'margin-left: 1em;'); -+ allGroups.addEventListener('click', function(event){ -+ allGroups.state = allGroups.state ? 0 : 1; -+ peopleMainTable.innerHTML = ''; // clear in case refreshNames doesn't work for unknown reason -+ if (allGroups.state) { -+ for (var k=0; k < groupsMainTable.children.length; k++) { -+ var groupRow = groupsMainTable.children[k]; -+ var group = groupRow.subject; -+ -+ var groupList = kb.sym(group.uri.split('#')[0]); -+ selected[group.uri] = true; -+ -+ kb.fetcher.nowOrWhenFetched(groupList.uri, undefined, function(ok, message){ -+ if (!ok) return complainIfBad(ok, "Can't load group file: " + groupList + ": " + message); -+ groupRow.setAttribute('style', 'background-color: #cce;'); -+ refreshNames(); // @@ every time?? -+ }); -+ //refreshGroups(); -+ } // for each row -+ } else { -+ selected = {}; -+ refreshGroups(); -+ } -+ }); // on button click -+ - - peopleHeader.textContent = "name"; - peopleHeader.setAttribute('style', 'min-width: 18em;'); - peopleMain.setAttribute('style','overflow:scroll;'); -- // cardHeader.textContent = "contact details"; // clutter - - - var groups = kb.each(subject, ns.vcard('includesGroup')); -@@ -1099,7 +1123,7 @@ tabulator.panes.register( { - var cardPane = function(dom, subject, paneName) { - var p = tabulator.panes.byName(paneName); - var d = p.render(subject, dom); -- d.setAttribute('style', 'border: 0.1em solid #888; border-radius: 0.5em') -+ d.setAttribute('style', 'border: 0.1em solid #444; border-radius: 0.5em') - return d; - }; - -@@ -1156,19 +1180,29 @@ tabulator.panes.register( { - } - } - cards.sort(compareForSort); // @@ sort by name not UID later -+ for (var k=0; k < cards.length - 1;) { -+ if (cards[k].uri === cards[k+1].uri) { -+ cards.splice(k,1); -+ } else { -+ k++; -+ } -+ } -+ - peopleMainTable.innerHTML = ''; // clear - peopleHeader.textContent = (cards.length > 5 ? '' + cards.length + " contacts" : "contact"); - - for (var j =0; j < cards.length; j++) { - var personRow = peopleMainTable.appendChild(dom.createElement('tr')); -- personRow.setAttribute('style', dataCellStyle); -+ var personLeft = personRow.appendChild(dom.createElement('td')); -+ var personRight = personRow.appendChild(dom.createElement('td')); -+ personLeft.setAttribute('style', dataCellStyle); - var person = cards[j]; - var name = nameFor(person); -- personRow.textContent = name; -+ personLeft.textContent = name; - personRow.subject = person; - -- var setPersonListener = function toggle(personRow, person) { -- tabulator.panes.utils.deleteButtonWithCheck(dom, personRow, 'contact', function(){ -+ var setPersonListener = function toggle(personLeft, person) { -+ tabulator.panes.utils.deleteButtonWithCheck(dom, personRight, 'contact', function(){ - deleteThing(person); - refreshNames(); - cardMain.innerHTML = ''; -@@ -1181,12 +1215,17 @@ tabulator.panes.register( { - cardMain.innerHTML = ''; - if (!ok) return complainIfBad(ok, "Can't load card: " + group.uri.split('#')[0] + ": " + message) - // dump("Loaded card " + cardURI + '\n') -- cardMain.appendChild(cardPane(dom, person, 'contact')); -+ cardMain.appendChild(cardPane(dom, person, 'contact')); -+ cardMain.appendChild(dom.createElement('br')); -+ var anchor = cardMain.appendChild(dom.createElement('a')); -+ anchor.setAttribute('href', person.uri); -+ anchor.textContent = '->'; - }) - }); - }; - setPersonListener(personRow, person); - }; -+ searchFilterNames(); - - } - -@@ -1209,10 +1248,8 @@ tabulator.panes.register( { - // var groupLeft = groupRow.appendChild(dom.createElement('td')); - // var groupRight = groupRow.appendChild(dom.createElement('td')); - groupRow.textContent = name; -- // var checkBox = groupLeft.appendChild(dom.createElement('input')) -- // checkBox.setAttribute('type', 'checkbox'); // @@ set from personal last settings -- var foo = function toggle(groupRow, group) { -- tabulator.panes.utils.deleteButtonWithCheck(dom, groupRow, "group", function(){ -+ var foo = function toggle(groupRow, group, name) { -+ tabulator.panes.utils.deleteButtonWithCheck(dom, groupRow, "group " + name, function(){ - deleteThing(group); - }); - groupRow.addEventListener('click', function(event){ -@@ -1220,12 +1257,6 @@ tabulator.panes.register( { - var groupList = kb.sym(group.uri.split('#')[0]); - if (!event.altKey) { - selected = {}; // If alt key pressed, accumulate multiple -- /* -- cardMain.innerHTML = ''; -- cardMain.appendChild(tabulator.panes.utils.ACLControlBox(group, dom, function(ok, body){ -- if (!ok) cardMain.innerHTML = "Failed: " + body; -- })); -- */ - } - selected[group.uri] = selected[group.uri] ? false : true; - refreshGroups(); -@@ -1244,7 +1275,7 @@ tabulator.panes.register( { - }) - }, true); - }; -- foo(groupRow, group); -+ foo(groupRow, group, name); - } - - -@@ -1311,7 +1342,7 @@ tabulator.panes.register( { - // cardMain.appendChild(newContactForm(dom, kb, selected, createdNewContactCallback1)); - cardMain.appendChild(getNameForm(dom, kb, "Group", selected, - function(subject, name, selectedGroups) { -- createNewGroup(subject, name, function(success, body) { -+ saveNewGroup(subject, name, function(success, body) { - if (!success) { - console.log("Error: can\'t save new group:" + body); - cardMain.innerHTML = "Failed to save group" + body diff --git a/eslint.config.mjs b/eslint.config.mjs index 211baf9..4665be0 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,28 +1,95 @@ -import { defineConfig } from "eslint/config"; -import typescriptEslint from "@typescript-eslint/eslint-plugin"; -import globals from "globals"; -import tsParser from "@typescript-eslint/parser"; +import tseslintPlugin from '@typescript-eslint/eslint-plugin' +import globals from 'globals' +import tsParser from '@typescript-eslint/parser' +import neostandard from 'neostandard' -export default defineConfig([{ +export default [ + ...neostandard(), + { + ignores: [ + '**/*.html', + '**/*.md', + '**/*.json', + 'node_modules/**', + 'coverage/**', + 'dist/**', + 'shapes/**' + ], + }, + { + files: ['src/**/*.js', 'src/**/*.cjs', 'src/**/*.mjs'], + + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + Atomics: 'readonly', + SharedArrayBuffer: 'readonly', + } + }, + rules: { + semi: ['error', 'never'], + quotes: ['error', 'single'], + 'no-console': 'warn', + 'no-unused-vars': 'error', + 'no-undef': 'error' + }, + }, + { + files: ['src/**/*.ts'], plugins: { - "@typescript-eslint": typescriptEslint, + '@typescript-eslint': tseslintPlugin, }, languageOptions: { - globals: { - ...globals.browser, - ...globals.node, - Atomics: "readonly", - SharedArrayBuffer: "readonly", - }, - - parser: tsParser, + globals: { + ...globals.browser, + ...globals.node, + Atomics: 'readonly', + SharedArrayBuffer: 'readonly', + }, + parser: tsParser, + parserOptions: { + project: ['./tsconfig.json'] + }, }, - rules: { - "no-unused-vars": ["warn", { - argsIgnorePattern: "^_", - varsIgnorePattern: "^_", - }], + semi: ['error', 'never'], + quotes: ['error', 'single'], + 'no-console': 'warn', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': ['warn', { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }], + // '@typescript-eslint/no-explicit-any': 'warn', - codebase not ready for this }, -}]); \ No newline at end of file + }, + { + files: ['test/**/*.ts'], + plugins: { + '@typescript-eslint': tseslintPlugin, + }, + languageOptions: { + parser: tsParser, + parserOptions: { + project: ['./tsconfig.test.json'], + }, + }, + rules: { + semi: ['error', 'never'], + quotes: ['error', 'single'], + 'no-console': 'warn', // Allow console in tests + 'no-undef': 'off', // Tests may define globals + } + }, + { + files: ['test/**/**/*.js', 'test/**/*.js'], + rules: { + semi: ['error', 'never'], + quotes: ['error', 'single'], + 'no-console': 'off', // Allow console in tests + 'no-undef': 'off', // Tests may define globals + } + } +] diff --git a/individualForm.js b/individualForm.js deleted file mode 100644 index 5756e46..0000000 --- a/individualForm.js +++ /dev/null @@ -1,294 +0,0 @@ -module.exports = ` -# This turtle file defined the forms used in the contacts management -# -# Individuals and orgs are in one file as they share some -# forms (address, etc.) and interact with each other (roles) - -# Now hand-edited, was originally made using form editor. - -@prefix rdf: . -@prefix dct: . -@prefix owl: . -@prefix ui: . -@prefix schema: . -@prefix solid: . -@prefix vcard: . -@prefix pp: . -@prefix : <#>. - -# Ontology additions or interpretations needed for the form to work well - -# The ontology file doesn't make them disjoint. This makes the selector be a choice. -vcard:TelephoneType owl:disjointUnionOf ( vcard:Cell vcard:Home vcard:Work) . -vcard:Type owl:disjointUnionOf (vcard:Home vcard:Work) . # for email - -# Better field labels -vcard:Cell ui:label "mobile"@en . # app will imake nitial caps if nec -vcard:hasAddress ui:label "address"@en . -vcard:bday ui:label "born"@en. -vcard:hasEmail ui:label "email"@en . -vcard:hasTelephone ui:label "phone"@en . -vcard:note ui:label "notes"@en . - - - -# Ontology data to drive the classifier - -solid:InterestingOrganization owl:disjointUnionOf ( -# Airline - a Corpration -# Consortium - a Corporation or a NGO - schema:Corporation - schema:EducationalOrganization -# FundingScheme - eh? - schema:GovernmentOrganization -# LibrarySystem -# LocalBusiness - Corporation - schema:MedicalOrganization - schema:NGO - # NewsMediaOrganization - a Corporation or a NGO - schema:MusicGroup # e.g. a band - schema:Project # like Solid - schema:SportsOrganization # a Team - ) . - - - - - -# The forms themselves - -vcard:Individual - ui:creationForm :form1 . - -# The addressComment, etc., fields with a comment before each type of field -# were originally partly because the labels on the fields were clumsy like "hasAddress". -# This is fixed by adding the ui:label to the properties above, so let's try -# removing the little micro-headings - -# For org: -:orgDetailsForm a ui:Form ; dct:title "Contact details for an organozation"; - ui:parts ( - :OrgClassifier - - :fullNameField - :addresses - :eMails - :telephones - :noteField ) . -# For individual: -:form1 - dct:title "Contact Details for a person" ; - a ui:Form ; - ui:part - - :fullNameField, :roleField, :orgNameField, - :paymentPointerField, - # :addressesComment, - :addresses, - # :emailComment, - :eMails, -# :telephoneComment, - :telephones, -# :noteComment, - :noteField ; - ui:parts ( - :fullNameField :roleField :orgNameField - :paymentPointerField - # :addressesComment - :addresses - # :emailComment - :eMails - # :telephoneComment - :telephones :birthdayField - # :noteComment - :noteField ) . - - :fullNameField - a ui:SingleLineTextField ; - ui:label "Name"; - ui:maxLength "128" ; - ui:property vcard:fn ; - ui:size "40" . - - :roleField - a ui:SingleLineTextField ; - ui:suppressEmptyUneditable true; - ui:maxLength "128" ; - ui:property vcard:role ; - ui:size "40" . - - - :orgNameField - a ui:SingleLineTextField ; - ui:suppressEmptyUneditable true; - ui:maxLength "128" ; - ui:property vcard:organization-name ; - ui:size "40" . - - - :paymentPointerField - a ui:SingleLineTextField ; - ui:maxLength "128" ; - ui:property pp:PaymentPointer ; - ui:size "40" . - -:addressesComment - a ui:Comment ; - ui:suppressIfUneditable true; - ui:contents "Address" . - - -:addresses - dct:title "Address details" ; - a ui:Multiple ; - ui:part :oneAddress ; - ui:property vcard:hasAddress . - -:oneAddress - a ui:Group ; - ui:parts ( :id1409437207443 :id1409437292400 :id1409437421996 :id1409437467649 :id1409437569420 :id1409437646712 ). - -:id1409437207443 - a ui:SingleLineTextField ; - ui:maxLength "128" ; - ui:property vcard:street-address ; - ui:size "40" . - -:id1409437292400 - a ui:SingleLineTextField ; - ui:maxLength "128" ; - ui:property vcard:locality ; - ui:size "40" . - -:id1409437421996 - a ui:SingleLineTextField ; - ui:maxLength "25" ; - ui:property vcard:postal-code ; - ui:size "25" . - -:id1409437467649 - a ui:SingleLineTextField ; - ui:maxLength "128" ; - ui:property vcard:region ; - ui:size "40" . - -:id1409437569420 - a ui:SingleLineTextField ; - ui:maxLength "128" ; - ui:property vcard:country-name ; - ui:size "40" . - -:id1409437646712 - a ui:Classifier ; - ui:from rdf:Class ; - ui:property rdf:type . - - -############################## - -:emailComment - a ui:Comment ; - ui:suppressIfUneditable true; - - ui:contents "Email" . - - -:eMails - a ui:Multiple ; - ui:part :oneEMail ; - ui:property vcard:hasEmail . - -:oneEMail - a ui:Group ; # hint: side by side is good - ui:part :emailValue, :emailType ; - ui:parts ( :emailType :emailValue ). - -:emailValue - a ui:EmailField ; ui:label "email"; - ui:property vcard:value ; - ui:size "50" . - -:emailType - a ui:Classifier ; - ui:canMintNew "0" ; - ui:category vcard:Type ; - ui:from vcard:Type ; - ui:property rdf:type . - - -############################## - -:telephoneComment - a ui:Comment ; - ui:suppressIfUneditable true; - ui:contents "Phones" . - - -:telephones - a ui:Multiple ; - ui:part :onetelephone ; - ui:property vcard:hasTelephone . - -:onetelephone - a ui:Group ; - ui:part :telephoneValue, :telephoneType ; - ui:parts ( :telephoneType :telephoneValue ). - -:telephoneValue - a ui:PhoneField ; - ui:property vcard:value ; - ui:size "50" . - -:telephoneType - a ui:Classifier ; - ui:canMintNew "0" ; - ui:category vcard:TelephoneType ; - ui:from vcard:Type ; - ui:property rdf:type . - -############################## - -:birthdayField - a ui:DateField; - ui:label "Born"; - ui:suppressEmptyUneditable true; - ui:property vcard:bday . - -############################## - -:noteComment - a ui:Comment ; - ui:suppressIfUneditable true; - ui:contents "General Notes" . - -:noteField - a ui:MultiLineTextField ; - ui:suppressEmptyUneditable true; - - ui:property vcard:note . - - -############ organization forms - -:OrganizationCreationForm a ui:Form; schema:name "Form for editing a role" ; - ui:parts ( :OrgClassifier :homePageURIField ) . - - -:OrgClassifier a ui:Classifier; ui:label "What sort of organization?"@en; - ui:category solid:InterestingOrganization . - - -:instituteNameField - a ui:SingleLineTextField ; - ui:label "Institute Name"; - ui:maxLength "200" ; - ui:property schema:name ; - ui:size "80" . - - :homePageURIField a ui:NamedNodeURIField; - ui:property schema:url . # @@ ?? - - :instituteTypeField a ui:Classifier; - ui:label "What sort of organization"; - ui:category solid:InterestingOrganization . -` diff --git a/jest.config.js b/jest.config.js index a664266..a0ac1d9 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,11 +1,19 @@ -module.exports = { - "verbose": true, // Turn on console.log - +export default { + // verbose: true, // Uncomment for detailed test output + collectCoverage: true, + coverageDirectory: 'coverage', testEnvironment: 'jsdom', - setupFilesAfterEnv: ["./jest.setup.ts"], - transformIgnorePatterns: ["/node_modules/(?!lit-html).+\\.js"], - testEnvironmentOptions: { - customExportConditions: ['node'] + customExportConditions: ['node'], + }, + transform: { + '^.+\\.[tj]sx?$': ['babel-jest', { configFile: './babel.config.js' }], + }, + // Some npm packages publish ESM sources. By default Jest will NOT transform + // files in node_modules which causes syntax errors like "import ..." here. + // Allow transforming mime-types and mime-db so Babel can compile them for tests. + transformIgnorePatterns: ['/node_modules/(?!(mime-types|mime-db)/)'], + setupFilesAfterEnv: ['./jest.setup.ts'], + testMatch: ['**/test/**/*.test.ts?(x)', '**/?(*.)+(spec|test).ts?(x)'], + roots: ['/src', '/test'], } -}; diff --git a/jest.setup.ts b/jest.setup.ts index f501eab..20ed84b 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -1,10 +1,18 @@ -import "@testing-library/jest-dom"; -import fetchMock from "jest-fetch-mock"; +import '@testing-library/jest-dom' +import fetchMock from 'jest-fetch-mock' +import { TextEncoder, TextDecoder } from 'util' + +global.TextEncoder = TextEncoder; +global.TextDecoder = TextDecoder; + +// Mock external dependencies that solid-logic expects +jest.mock('$rdf', () => require('rdflib'), { virtual: true }) + +// Mock SolidLogic for solid-ui webpack bundle +jest.mock('SolidLogic', () => require('solid-logic'), { virtual: true }) fetchMock.enableMocks(); -// Polyfill for encoding which isn't present globally in jsdom -import { TextEncoder, TextDecoder } from 'util'; -global.TextEncoder = TextEncoder; -global.TextDecoder = TextDecoder; + + diff --git a/organizationForm.js b/organizationForm.js deleted file mode 100644 index 143e935..0000000 --- a/organizationForm.js +++ /dev/null @@ -1,60 +0,0 @@ -module.exports = ` -# Form to record episodes in the life of a person -# -# - -@prefix : <#> . - -@prefix rdf: . -@prefix owl: . -@prefix schema: . -@prefix solid: . -@prefix ui: . -@prefix vcard: . -@prefix : <#>. - - -# Ontology data to drive the classifier - -solid:InterestingOrganization owl:disjointUnionOf ( -# Airline - a Corporation -# Consortium - a Corporation or a NGO - schema:Corporation - schema:EducationalOrganization -# FundingScheme - eh? - schema:GovernmentOrganization -# LibrarySystem -# LocalBusiness - Corporation -# MedicalOrganization - a Corporation or a NGO - schema:NGO - # NewsMediaOrganization - a Corporation or a NGO -schema:PerformingGroup # a band -schema:Project # like Solid -schema:SportsOrganization # a Team - ) . - - :OrganizationCreationForm a ui:Form; schema:name "Form for editing a role" ; - ui:parts ( :OrgClassifier :homePageURIField ) . - - - :OrgClassifier a ui:Classifier; ui:label "What sort of organization?"@en; - ui:category solid:InterestingOrganization . - - - :instituteNameField - a ui:SingleLineTextField ; - ui:label "Institute Name"; - ui:maxLength "200" ; - ui:property schema:name ; - ui:size "80" . - - :homePageURIField a ui:NamedNodeURIField; - ui:property schema:url . # @@ ?? - - :initituteTypeField a ui:Classifier; - ui:label "What sort of organization"; - ui:category solid:InterestingOrganization . - - -# ends -` diff --git a/package-lock.json b/package-lock.json index 6072b41..090a9d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,7 @@ "version": "2.7.1", "license": "MIT", "dependencies": { - "lint-staged": "^16.2.0", - "solid-ui": "^2.6.1" + "mime-types": "^3.0.1" }, "devDependencies": { "@babel/cli": "^7.28.0", @@ -22,21 +21,33 @@ "@typescript-eslint/eslint-plugin": "^8.39.0", "@typescript-eslint/parser": "^8.39.0", "babel-jest": "^30.0.5", + "babel-loader": "^10.0.0", + "babel-plugin-inline-import": "^3.0.0", + "buffer": "^6.0.3", "eslint": "^9.33.0", "eslint-plugin-import": "^2.32.0", "globals": "^16.3.0", - "husky": "^9.1.7", "jest": "^30.0.5", "jest-environment-jsdom": "^30.0.5", "jest-fetch-mock": "^3.0.3", + "neostandard": "^0.12.2", + "pane-registry": "2.5.1-ee1545f", + "rdflib": "^2.3.0", + "solid-logic": "3.1.1-3343cc7", + "solid-ui": "2.6.1-c6fc7fe", "typescript": "^5.9.2", "typescript-transpile-only": "^0.0.4" + }, + "peerDependencies": { + "rdflib": "^2.3.0", + "solid-logic": "3.1.1-3343cc7", + "solid-ui": "2.6.1-c6fc7fe" } }, "node_modules/@adobe/css-tools": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", - "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", "dev": true, "license": "MIT" }, @@ -122,6 +133,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -217,14 +229,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -411,15 +423,15 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" @@ -1824,6 +1836,7 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1972,6 +1985,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -1995,6 +2009,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2003,6 +2018,7 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz", "integrity": "sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "ky": "^0.33.3", @@ -2014,9 +2030,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.0.tgz", + "integrity": "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==", "dev": true, "license": "MIT", "optional": true, @@ -2034,9 +2050,9 @@ "optional": true }, "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", + "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", "dev": true, "license": "MIT", "optional": true, @@ -2091,9 +2107,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -2189,6 +2205,13 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -2223,6 +2246,19 @@ "node": ">= 4" } }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "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" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2237,9 +2273,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.0.tgz", - "integrity": "sha512-BIhe0sW91JGPiaF1mOuPy5v8NflqfjIcDNpC+LbW9f609WVRX1rArrhi6Z2ymvrAry9jw+5POTj4t2t62o8Bmw==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "dev": true, "license": "MIT", "engines": { @@ -2277,6 +2313,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, "license": "MIT", "engines": { "node": ">=14" @@ -2286,6 +2323,7 @@ "version": "0.0.10", "resolved": "https://registry.npmjs.org/@frogcat/ttl2jsonld/-/ttl2jsonld-0.0.10.tgz", "integrity": "sha512-0NLM96V3ziZkkOlhixSZiXe8CzewECVNtSj04s2hW2e65SgzQPzM12VWSovuRIy+2UJA2Bjkf9405yrty9tgcg==", + "dev": true, "license": "MIT", "bin": { "ttl2jsonld": "bin/cli.js" @@ -2302,28 +2340,25 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "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==", + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" @@ -2361,6 +2396,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@inrupt/oidc-client/-/oidc-client-1.11.6.tgz", "integrity": "sha512-1rCTk1T6pdm/7gKozutZutk7jwmYBADlnkGGoI5ypke099NOCa5KFXjkQpbjsps0PRkKZ+0EaR70XN5+xqmViA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "acorn": "^7.4.1", @@ -2371,13 +2407,14 @@ } }, "node_modules/@inrupt/oidc-client-ext": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@inrupt/oidc-client-ext/-/oidc-client-ext-3.1.0.tgz", - "integrity": "sha512-xilTPaPgRJSh+AOtjkbtk4KLTAjLfWy3owb1aOdfz9Vo3Dh5Z80rx/m/Y/Uur3AiVK9LYGrR6AM+HoCEH8MCMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@inrupt/oidc-client-ext/-/oidc-client-ext-3.1.1.tgz", + "integrity": "sha512-vftKD2u5nufZTFkdUDMS3Uxj5xNQwArP11OFaALFkq6/3RwCAhe3lwOv8hNzL7Scv98T+KbAErBM0TwGGrS69g==", + "dev": true, "license": "MIT", "dependencies": { "@inrupt/oidc-client": "^1.11.6", - "@inrupt/solid-client-authn-core": "^3.1.0", + "@inrupt/solid-client-authn-core": "^3.1.1", "jose": "^5.1.3", "uuid": "^11.1.0" } @@ -2386,6 +2423,7 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -2395,22 +2433,24 @@ } }, "node_modules/@inrupt/solid-client-authn-browser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@inrupt/solid-client-authn-browser/-/solid-client-authn-browser-3.1.0.tgz", - "integrity": "sha512-TK8LdCuqJxZ6jvxWIJfRqji9lM7h69tbzlM0hoE/orrkQzxBUF7OOZUCXOpkIKDrl39BIfaacIOYhuBA8hkFYw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@inrupt/solid-client-authn-browser/-/solid-client-authn-browser-3.1.1.tgz", + "integrity": "sha512-Wd7TREmvdhTp+Sk88ei3hlg54sG1fNqkkPkuS+2tDBkcsXaViRQAEugVyh5pWRkd1xSFKrEzftb7UYEG4mJ0CQ==", + "dev": true, "license": "MIT", "dependencies": { - "@inrupt/oidc-client-ext": "^3.1.0", - "@inrupt/solid-client-authn-core": "^3.1.0", + "@inrupt/oidc-client-ext": "^3.1.1", + "@inrupt/solid-client-authn-core": "^3.1.1", "events": "^3.3.0", "jose": "^5.1.3", "uuid": "^11.1.0" } }, "node_modules/@inrupt/solid-client-authn-core": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@inrupt/solid-client-authn-core/-/solid-client-authn-core-3.1.0.tgz", - "integrity": "sha512-aoG8RvPBmYXTSqy2uJogpoVGPKsydC4mXNdm63BWCEMZ2QyaSRBjx4R4N6n5N2uy/aoib678Y7U3UtDCLDoFsQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@inrupt/solid-client-authn-core/-/solid-client-authn-core-3.1.1.tgz", + "integrity": "sha512-1oDSQCh/pVtPlTyvLQ2uwHo+hpLJF7izg82tjB+Ge8jqGYwkQyId0BrfncpCk//uJXxgRIcfAQp2MhXYbZo80Q==", + "dev": true, "license": "MIT", "dependencies": { "events": "^3.3.0", @@ -2541,16 +2581,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2565,20 +2595,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -2621,16 +2637,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -3083,9 +3089,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -3114,17 +3120,28 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -3154,9 +3171,10 @@ "optional": true }, "node_modules/@noble/curves": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", - "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "dev": true, "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -3172,6 +3190,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -3218,6 +3237,16 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3242,6 +3271,16 @@ "url": "https://opencollective.com/pkgr" } }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -3250,9 +3289,9 @@ "license": "MIT" }, "node_modules/@sinclair/typebox": { - "version": "0.34.38", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.38.tgz", - "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==", + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, "license": "MIT" }, @@ -3276,6 +3315,52 @@ "@sinonjs/commons": "^3.0.1" } }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.11.0.tgz", + "integrity": "sha512-PNRHbydNG5EH8NK4c+izdJlxajIR6GxcUhzsYNRsn6Myep4dsZt0qFCz3rCPnkvgO5FYibDcMqgNHUT+zvjYZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "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.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@testing-library/jest-dom": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", @@ -3360,6 +3445,28 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -3432,13 +3539,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", - "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", + "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/stack-utils": { @@ -3456,9 +3563,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", + "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", "dev": true, "license": "MIT", "dependencies": { @@ -3508,6 +3615,7 @@ "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", @@ -3996,19 +4104,196 @@ "win32" ] }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, "node_modules/@xmldom/xmldom": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" @@ -4021,7 +4306,9 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4029,6 +4316,19 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -4066,23 +4366,65 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "ajv": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/ansi-regex": { + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", @@ -4123,11 +4465,14 @@ } }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "Python-2.0" + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } }, "node_modules/aria-query": { "version": "5.3.2", @@ -4179,6 +4524,27 @@ "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.findlastindex": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", @@ -4239,6 +4605,23 @@ "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", @@ -4319,6 +4702,33 @@ "node": ">=8" } }, + "node_modules/babel-loader": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", + "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5.61.0" + } + }, + "node_modules/babel-plugin-inline-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-inline-import/-/babel-plugin-inline-import-3.0.0.tgz", + "integrity": "sha512-thnykl4FMb8QjMjVCuZoUmAM7r2mnTn5qJwrryCvDv6rugbJlTHZMctdjDtEgD0WBAXJOLJSGXN3loooEwx7UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-resolve": "0.0.2" + } + }, "node_modules/babel-plugin-istanbul": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", @@ -4449,6 +4859,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -4465,6 +4876,16 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz", + "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -4493,6 +4914,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -4502,9 +4924,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "dev": true, "funding": [ { @@ -4521,11 +4943,13 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -4548,6 +4972,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, "funding": [ { "type": "github", @@ -4646,9 +5071,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001731", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", - "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", + "version": "1.0.30001754", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", + "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", "dev": true, "funding": [ { @@ -4670,6 +5095,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", + "dev": true, "license": "Apache-2.0" }, "node_modules/chalk": { @@ -4725,10 +5151,20 @@ "fsevents": "~2.3.2" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, "node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -4748,37 +5184,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", - "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", - "license": "MIT", - "dependencies": { - "slice-ansi": "^7.1.0", - "string-width": "^8.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -4794,56 +5199,6 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4856,9 +5211,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, @@ -4882,12 +5237,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" - }, "node_modules/commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", @@ -4898,6 +5247,16 @@ "node": ">= 6" } }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4913,9 +5272,10 @@ "license": "MIT" }, "node_modules/core-js": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", - "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", + "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", + "dev": true, "hasInstallScript": true, "license": "MIT", "funding": { @@ -4924,13 +5284,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", - "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.1" + "browserslist": "^4.26.3" }, "funding": { "type": "opencollective", @@ -4941,6 +5301,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "dev": true, "license": "MIT", "dependencies": { "node-fetch": "^2.7.0" @@ -4965,6 +5326,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "dev": true, "license": "MIT" }, "node_modules/css.escape": { @@ -4992,6 +5354,7 @@ "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==", + "dev": true, "license": "MIT", "engines": { "node": ">= 12" @@ -5066,9 +5429,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -5211,9 +5574,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.193", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.193.tgz", - "integrity": "sha512-eePuBZXM9OVCwfYUhd2OzESeNGnWmLyeu0XAEjf7xjijNjHFdeJSzuRUGN4ueT2tEYo5YqjHramKEFxz67p3XA==", + "version": "1.5.245", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.245.tgz", + "integrity": "sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==", "dev": true, "license": "ISC" }, @@ -5231,11 +5594,26 @@ } }, "node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, "license": "MIT" }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -5249,18 +5627,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -5360,6 +5726,41 @@ "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.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -5434,6 +5835,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, "license": "MIT" }, "node_modules/escape-string-regexp": { @@ -5450,9 +5852,9 @@ } }, "node_modules/eslint": { - "version": "9.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.0.tgz", - "integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", "dependencies": { @@ -5462,7 +5864,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.0", + "@eslint/js": "9.39.1", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -5509,28 +5911,117 @@ } } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", + "node_modules/eslint-compat-utils/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, "node_modules/eslint-module-utils": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", @@ -5559,6 +6050,28 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, "node_modules/eslint-plugin-import": { "version": "2.32.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", @@ -5593,6 +6106,57 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import-x": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", + "integrity": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "^8.35.0", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.9", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3 || ^10.0.1", + "semver": "^7.7.2", + "stable-hash-x": "^0.2.0", + "unrs-resolver": "^1.9.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "eslint-import-resolver-node": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, + "eslint-import-resolver-node": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -5627,6 +6191,163 @@ "node": "*" } }, + "node_modules/eslint-plugin-n": { + "version": "17.23.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz", + "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/ignore": { + "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" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "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.9", + "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/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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" + }, + "engines": { + "node": "*" + } + }, + "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==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -5812,21 +6533,17 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.x" @@ -5922,6 +6639,23 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -5946,6 +6680,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, "funding": [ { "type": "github", @@ -5982,6 +6717,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -6078,6 +6814,7 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" @@ -6104,6 +6841,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -6155,6 +6893,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6175,18 +6923,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -6267,6 +7003,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6302,6 +7051,13 @@ "node": ">= 6" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -6356,6 +7112,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -6535,30 +7298,6 @@ "node": ">=10.17.0" } }, - "node_modules/husky": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", - "dev": true, - "license": "MIT", - "bin": { - "husky": "bin.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/i": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", - "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -6576,6 +7315,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -6619,6 +7359,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/resolve-from": { + "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" + } + }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -6785,6 +7535,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -6876,18 +7649,13 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/is-generator-fn": { @@ -6901,14 +7669,15 @@ } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -6962,6 +7731,7 @@ "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" @@ -7191,9 +7961,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -7235,9 +8005,9 @@ } }, "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -7273,7 +8043,25 @@ "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "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/jackspeak": { @@ -7899,9 +8687,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -8030,6 +8818,7 @@ "version": "5.10.0", "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -8043,13 +8832,14 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -8061,6 +8851,7 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -8153,6 +8944,7 @@ "version": "8.3.3", "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.3.3.tgz", "integrity": "sha512-9YcilrF+dLfg9NTEof/mJLMtbdX1RJ8dbWtJgE00cMOIohb1lIyJl710vFiTaiHTl6ZYODJuBd32xFvUhmv3kg==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "@digitalbazaar/http-client": "^3.4.1", @@ -8168,6 +8960,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -8180,8 +8973,25 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, "license": "ISC" }, + "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", @@ -8196,7 +9006,9 @@ "version": "0.33.3", "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", + "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=14.16" }, @@ -8208,6 +9020,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.11.0.tgz", "integrity": "sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==", + "dev": true, "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", @@ -8233,6 +9046,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", @@ -8278,54 +9092,18 @@ "dev": true, "license": "MIT" }, - "node_modules/lint-staged": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.6.tgz", - "integrity": "sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw==", + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true, "license": "MIT", - "dependencies": { - "commander": "^14.0.1", - "listr2": "^9.0.5", - "micromatch": "^4.0.8", - "nano-spawn": "^2.0.0", - "pidtree": "^0.6.0", - "string-argv": "^0.3.2", - "yaml": "^2.8.1" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, "engines": { - "node": ">=20.17" + "node": ">=6.11.5" }, "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", - "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/listr2": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", - "license": "MIT", - "dependencies": { - "cli-truncate": "^5.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20.0.0" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/locate-path": { @@ -8358,65 +9136,17 @@ "dev": true, "license": "MIT" }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", - "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "bin": { + "loose-envify": "cli.js" } }, "node_modules/lru-cache": { @@ -8494,6 +9224,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -8534,18 +9265,6 @@ "node": ">=6" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -8603,6 +9322,7 @@ "version": "1.26.0", "resolved": "https://registry.npmjs.org/n3/-/n3-1.26.0.tgz", "integrity": "sha512-SQknS0ua90rN+3RHuk8BeIqeYyqIH/+ecViZxX08jR4j6MugqWRjtONl3uANG/crWXnOM2WIqBJtjIhVYFha+w==", + "dev": true, "license": "MIT", "dependencies": { "buffer": "^6.0.3", @@ -8612,22 +9332,10 @@ "node": ">=12.0" } }, - "node_modules/nano-spawn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", - "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", - "license": "MIT", - "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" - } - }, "node_modules/napi-postinstall": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", - "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", "bin": { @@ -8647,11 +9355,61 @@ "dev": true, "license": "MIT" }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neostandard": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/neostandard/-/neostandard-0.12.2.tgz", + "integrity": "sha512-VZU8EZpSaNadp3rKEwBhVD1Kw8jE3AftQLkCyOaM7bWemL1LwsYRsBnAmXy2LjG9zO8t66qJdqB7ccwwORyrAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@stylistic/eslint-plugin": "2.11.0", + "eslint-import-resolver-typescript": "^3.10.1", + "eslint-plugin-import-x": "^4.16.1", + "eslint-plugin-n": "^17.20.0", + "eslint-plugin-promise": "^7.2.1", + "eslint-plugin-react": "^7.37.5", + "find-up": "^5.0.0", + "globals": "^15.15.0", + "peowly": "^1.3.2", + "typescript-eslint": "^8.35.1" + }, + "bin": { + "neostandard": "cli.mjs" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0" + } + }, + "node_modules/neostandard/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", "deprecated": "Use your platform's native DOMException instead", + "dev": true, "funding": [ { "type": "github", @@ -8671,6 +9429,7 @@ "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==", + "dev": true, "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -8691,18 +9450,21 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, "license": "MIT" }, "node_modules/node-fetch/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==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/node-fetch/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==", + "dev": true, "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -8717,9 +9479,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, @@ -8753,6 +9515,16 @@ "dev": true, "license": "MIT" }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -8797,6 +9569,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", @@ -8962,13 +9750,14 @@ "license": "BlueOak-1.0.0" }, "node_modules/pane-registry": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-2.5.1.tgz", - "integrity": "sha512-2tO5GAN7PV3IRPIomJnKqq1U/4WqrMt/goUiVWslscQOo8Ydf7IYg2vGK3K5SQJtcuTRH3KEgwRbSDfpsD4ygw==", + "version": "2.5.1-ee1545f", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-2.5.1-ee1545f.tgz", + "integrity": "sha512-FFKB8fQsW5sCMGzbFcnW+B95DlYdPh3hdmL0nYSiPs7rnJS9KB6TsZa6nh2OMhjbqBKcoqfPuZNbHwFY4WTcEQ==", + "dev": true, "license": "MIT", - "dependencies": { - "rdflib": "^2.2.37", - "solid-logic": "^3.1.1" + "peerDependencies": { + "rdflib": "^2.3.0", + "solid-logic": "3.1.1-3343cc7" } }, "node_modules/parent-module": { @@ -9026,6 +9815,13 @@ "node": ">=8" } }, + "node_modules/path-extra": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/path-extra/-/path-extra-1.0.3.tgz", + "integrity": "sha512-vYm3+GCkjUlT1rDvZnDVhNLXIRvwFPaN8ebHAFcuMJM/H0RBOPD7JrcldiNLd9AS3dhAyUHLa4Hny5wp1A+Ffw==", + "dev": true, + "license": "MIT" + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -9077,6 +9873,16 @@ "dev": true, "license": "ISC" }, + "node_modules/peowly": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/peowly/-/peowly-1.3.2.tgz", + "integrity": "sha512-BYIrwr8JCXY49jUZscgw311w9oGEKo7ux/s+BxrhKTQbiQ0iYNdZNJ5LgagaeercQdFHwnR7Z5IxxFWVQ+BasQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.6.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -9088,6 +9894,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -9096,18 +9903,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -9249,6 +10044,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -9261,6 +10057,25 @@ "dev": true, "license": "MIT" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -9313,6 +10128,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" @@ -9322,6 +10138,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "setimmediate": "^1.0.5" @@ -9331,13 +10148,16 @@ } }, "node_modules/rdflib": { - "version": "2.2.37", - "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-2.2.37.tgz", - "integrity": "sha512-rRMJs7CGaS2vEdkplKfbc9TSoKIrSa3Ls3x7P6LSTcKyyX0hIe51kjPkRbuhh4uJk36ZJeXY5ww99PZa9KAVww==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-2.3.0.tgz", + "integrity": "sha512-Md241rzw8XgGZYfHaQi5SunvaxOVUgjCVTcY4DHZpAkrNPrk93DGoexo6RgulymiR1DkCHRi8C8+Ab+0QmpcYg==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.26.9", "@frogcat/ttl2jsonld": "^0.0.10", + "@rdfjs/types": "^2.0.1", "@xmldom/xmldom": "^0.8.10", "cross-fetch": "^3.2.0", "jsonld": "^8.3.3", @@ -9356,6 +10176,7 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", @@ -9427,9 +10248,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "license": "MIT", "dependencies": { @@ -9461,18 +10282,18 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -9486,49 +10307,56 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/require-resolve": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/require-resolve/-/require-resolve-0.0.2.tgz", + "integrity": "sha512-eafQVaxdQsWUB8HybwognkdcIdKdQdQBwTxH48FuE6WI0owZGKp63QYr1MRp73PoX0AcyB7MDapZThYUY8FD0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "x-path": "^0.0.2" + } + }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -9555,67 +10383,24 @@ "node": ">=8" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "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" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/reusify": { @@ -9629,12 +10414,6 @@ "node": ">=0.10.0" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "license": "MIT" - }, "node_modules/rrweb-cssom": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", @@ -9690,6 +10469,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -9761,6 +10541,64 @@ "node": ">=v12.22.7" } }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -9775,6 +10613,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" @@ -9833,6 +10672,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, "license": "MIT" }, "node_modules/shebang-command": { @@ -9951,71 +10791,49 @@ "node": ">=6" } }, - "node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/solid-logic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-3.1.1.tgz", - "integrity": "sha512-eG9t6LFDk3HXV1+gBUrEINXIcfZeNvKqbjkcNYBbC++YcgG7uJyGJrbYE5SGCyV5dV2KZiDTwX9e34UvONFUfQ==", + "version": "3.1.1-3343cc7", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-3.1.1-3343cc7.tgz", + "integrity": "sha512-p4HQDNIBUfjNS35+XXQCxJqmoR/JpSwDpTRvedUZUn3tN1CBjju1ZtXv5KotiXtNhxfWv9/pCIm1EN7GtfDQyA==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@inrupt/solid-client-authn-browser": "^3.1.0", - "lint-staged": "^16.1.5", - "rdflib": "^2.2.37", "solid-namespace": "^0.5.4" + }, + "peerDependencies": { + "rdflib": "^2.3.0" } }, "node_modules/solid-namespace": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/solid-namespace/-/solid-namespace-0.5.4.tgz", "integrity": "sha512-oPAv8xIg2MOLz069JRdvsSbYCpQN+umPJJ9LBFPzCrYuSw+dW4TMUOTDxTWS5xy+B3XN4+Fx3iIS5Jm8abm4Mg==", + "dev": true, "license": "MIT" }, "node_modules/solid-ui": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-2.6.1.tgz", - "integrity": "sha512-3AUaVHhzM0Xe3Fxcr1dL6qf1L5j9q75DbuTgeTtFGY9/EfGoOj8qQy5IvuqWgYK8BE1jy+oVB6ZuBY4JzVIsGw==", + "version": "2.6.1-c6fc7fe", + "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-2.6.1-c6fc7fe.tgz", + "integrity": "sha512-kXO0ZL8SXpEjpuYCtPPuSFDA5aMoOi0l5GIhhWc1ALgW00O40AOW9A8t9rFUbgzNJWE4LQH1Q310ck3JRq1HWg==", + "dev": true, "license": "MIT", "dependencies": { "@noble/curves": "^1.9.6", - "acorn": "^8.15.0", + "@noble/hashes": "^1.8.0", "escape-html": "^1.0.3", - "i": "^0.3.7", "mime-types": "^3.0.1", - "pane-registry": "^2.5.1", - "rdflib": "^2.2.37", - "solid-logic": "^3.1.1", + "pane-registry": "^2.5.1-ee1545f", "solid-namespace": "^0.5.4", "uuid": "^11.1.0" }, "optionalDependencies": { "fsevents": "*" + }, + "peerDependencies": { + "rdflib": "^2.3.0", + "solid-logic": "3.1.1-3343cc7" } }, "node_modules/source-map": { @@ -10046,6 +10864,23 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -10087,20 +10922,12 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -10116,19 +10943,18 @@ } }, "node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/string-width-cjs": { @@ -10147,48 +10973,43 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "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": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "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": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "node_modules/string.prototype.trim": { @@ -10372,6 +11193,133 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -10408,7 +11356,56 @@ "brace-expansion": "^1.1.7" }, "engines": { - "node": "*" + "node": "*" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/tldts": { @@ -10442,6 +11439,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -10489,6 +11487,42 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, + "node_modules/ts-declaration-location/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -10660,6 +11694,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz", + "integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.3", + "@typescript-eslint/parser": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/typescript-transpile-only": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/typescript-transpile-only/-/typescript-transpile-only-0.0.4.tgz", @@ -10699,6 +11757,7 @@ "version": "5.29.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "dev": true, "license": "MIT", "dependencies": { "@fastify/busboy": "^2.0.0" @@ -10708,9 +11767,9 @@ } }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, @@ -10739,9 +11798,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, "license": "MIT", "engines": { @@ -10749,9 +11808,9 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, "license": "MIT", "engines": { @@ -10794,9 +11853,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "dev": true, "funding": [ { @@ -10838,6 +11897,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -10885,10 +11945,25 @@ "makeerror": "1.0.12" } }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.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==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -10904,6 +11979,112 @@ "node": ">=12" } }, + "node_modules/webpack": { + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.26.3", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -11057,17 +12238,18 @@ } }, "node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -11092,94 +12274,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -11236,6 +12330,16 @@ } } }, + "node_modules/x-path": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/x-path/-/x-path-0.0.2.tgz", + "integrity": "sha512-zQ4WFI0XfJN1uEkkrB19Y4TuXOlHqKSxUJo0Yt+axPjRm8tCG6SJ6+Wo3/+Kjg4c2c8IvBXuJ0uYoshxNn4qMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-extra": "^1.0.2" + } + }, "node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -11270,18 +12374,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -11311,38 +12403,6 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 2f95907..25e8a4f 100644 --- a/package.json +++ b/package.json @@ -2,21 +2,31 @@ "name": "contacts-pane", "version": "2.7.1", "description": "Contacts Pane: Contacts manager for Address Book, Groups, and Individuals.", - "main": "./contactsPane.js", + "main": "dist/contactsPane.js", + "files": [ + "dist/", + "README.md", + "LICENSE" + ], "scripts": { - "build": "npm run clean && npm run build-lib", - "clean": "rm -rf lib", - "build-lib": "mkdir lib && make && npx tsc-transpile-only src/*.ts --outDir lib", - "lint": "eslint '*.js'", - "lint-fix": "eslint '*.js' --fix", - "test": "npm run lint && npm run build && npx tsc --target es2015 --moduleResolution node --allowSyntheticDefaultImports __tests__/unit/*.ts && jest __tests__/unit/*test.ts", - "jest": "jest __tests__/unit/*test.ts", - "prepublishOnly": "npm run lint && npm run build && npm run jest", + "clean": "rm -rf dist", + "build": "npm run clean && npm run typecheck && npm run build-dist", + "build-dist": "npm run build-js && npm run build-types", + "build-js": "babel src --out-dir dist --extensions '.ts,.js' --source-maps", + "build-types": "tsc --emitDeclarationOnly", + "lint": "eslint", + "lint-fix": "eslint --fix", + "typecheck": "tsc --noEmit", + "typecheck-test": "tsc --noEmit -p tsconfig.test.json", + "test": "jest --no-coverage", + "test-coverage": "jest --coverage", + "prepublishOnly": "npm run build && npm run lint && npm run test", + "preversion": "npm run lint && npm run test", "postpublish": "git push origin main --follow-tags" }, "repository": { "type": "git", - "url": "https://github.com/solid/contacts-pane" + "url": "git+https://github.com/solid/contacts-pane.git" }, "keywords": [ "solid", @@ -38,8 +48,12 @@ }, "homepage": "https://github.com/solid/contacts-pane", "dependencies": { - "lint-staged": "^16.2.0", - "solid-ui": "^2.6.1" + "mime-types": "^3.0.1" + }, + "peerDependencies": { + "rdflib": "^2.3.0", + "solid-logic": "3.1.1-3343cc7", + "solid-ui": "2.6.1-c6fc7fe" }, "devDependencies": { "@babel/cli": "^7.28.0", @@ -51,25 +65,21 @@ "@typescript-eslint/eslint-plugin": "^8.39.0", "@typescript-eslint/parser": "^8.39.0", "babel-jest": "^30.0.5", + "babel-loader": "^10.0.0", + "babel-plugin-inline-import": "^3.0.0", + "buffer": "^6.0.3", "eslint": "^9.33.0", "eslint-plugin-import": "^2.32.0", "globals": "^16.3.0", - "husky": "^9.1.7", "jest": "^30.0.5", "jest-environment-jsdom": "^30.0.5", "jest-fetch-mock": "^3.0.3", + "neostandard": "^0.12.2", + "pane-registry": "2.5.1-ee1545f", + "rdflib": "^2.3.0", + "solid-logic": "3.1.1-3343cc7", + "solid-ui": "2.6.1-c6fc7fe", "typescript": "^5.9.2", "typescript-transpile-only": "^0.0.4" - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged", - "pre-push": "npm test" - } - }, - "lint-staged": { - "*.js": [ - "eslint" - ] } } diff --git a/src/autocompleteBar.ts b/src/autocompleteBar.ts index 6e56ed9..dba7738 100644 --- a/src/autocompleteBar.ts +++ b/src/autocompleteBar.ts @@ -6,20 +6,18 @@ import { ns, widgets, icons } from 'solid-ui' import { renderAutoComplete } from './autocompletePicker' // dbpediaParameters import { wikidataParameters } from './publicData' - const WEBID_NOUN = 'Solid ID' const kb = store -const AUTOCOMPLETE_THRESHOLD = 4 // don't check until this many characters typed -const AUTOCOMPLETE_ROWS = 12 // 20? +// const AUTOCOMPLETE_THRESHOLD = 4 // don't check until this many characters typed +// const AUTOCOMPLETE_ROWS = 12 // 20? const GREEN_PLUS = icons.iconBase + 'noun_34653_green.svg' const SEARCH_ICON = icons.iconBase + 'noun_Search_875351.svg' export async function renderAutocompleteControl (dom:HTMLDocument, - person:NamedNode, options, addOneIdAndRefresh): Promise { - + person:NamedNode, options, addOneIdAndRefresh): Promise { async function autoCompleteDone (object, _name) { const webid = object.uri removeDecorated() @@ -34,8 +32,10 @@ export async function renderAutocompleteControl (dom:HTMLDocument, return addOneIdAndRefresh(person, webid) } function removeDecorated () { - creationArea.removeChild(decoratedAutocomplete) - decoratedAutocomplete = null + if (decoratedAutocomplete) { + creationArea.removeChild(decoratedAutocomplete) + decoratedAutocomplete = null + } } async function searchButtonHandler (_event) { if (decoratedAutocomplete) { @@ -63,12 +63,12 @@ export async function renderAutocompleteControl (dom:HTMLDocument, const klass = options.class const acOptions = { queryParams, - class:klass, + class: klass, acceptButton, cancelButton } - var decoratedAutocomplete = null + var decoratedAutocomplete: HTMLDivElement | null = null // const { dom } = dataBrowserContext options = options || {} options.editable = kb.updater.editable(person.doc().uri, kb) @@ -77,7 +77,6 @@ export async function renderAutocompleteControl (dom:HTMLDocument, creationArea.setAttribute('style', 'display: flex; flex-flow: wrap;') if (options.editable) { - // creationArea.appendChild(await renderAutoComplete(dom, options, autoCompleteDone)) wait for searchButton creationArea.style.width = '100%' const plus = creationArea.appendChild(widgets.button(dom, GREEN_PLUS, options.idNoun, greenButtonHandler)) diff --git a/src/autocompleteField.ts b/src/autocompleteField.ts index 724fe49..8ea182f 100644 --- a/src/autocompleteField.ts +++ b/src/autocompleteField.ts @@ -5,8 +5,8 @@ import { store } from 'solid-logic' import { ns, style, widgets } from 'solid-ui' import { renderAutoComplete } from './autocompletePicker' // dbpediaParameters -const AUTOCOMPLETE_THRESHOLD = 4 // don't check until this many characters typed -const AUTOCOMPLETE_ROWS = 12 // 20? +// const AUTOCOMPLETE_THRESHOLD = 4 // don't check until this many characters typed +// const AUTOCOMPLETE_ROWS = 12 // 20? /** * Render a autocomplete form field @@ -24,7 +24,7 @@ const AUTOCOMPLETE_ROWS = 12 // 20? * * @returns The HTML widget created */ -// eslint-disable-next-line complexity + export function autocompleteField ( // @@ are they allowed too be async?? dom: HTMLDocument, container: HTMLElement | undefined, @@ -34,7 +34,6 @@ export function autocompleteField ( // @@ are they allowed too be async?? doc: NamedNode | undefined, callbackFunction: (ok: boolean, errorMessage: string) => void ): HTMLElement { - async function addOneIdAndRefresh (result, _name) { const ds = kb.statementsMatching(subject, property as any) // remove any multiple values @@ -101,8 +100,8 @@ export function autocompleteField ( // @@ are they allowed too be async?? const uri = widgets.mostSpecificClassURI(form) let params = widgets.fieldParams[uri] if (params === undefined) params = {} // non-bottom field types can do this - const theStyle = params.style || style.textInputStyle - const klass = kb.the(form, ns.ui('category'), null, formDoc) + // const theStyle = params.style || style.textInputStyle + const klass = kb.the(form, ns.ui('category'), null, formDoc) as NamedNode /* { label: string; logo: string; @@ -114,24 +113,28 @@ export function autocompleteField ( // @@ are they allowed too be async?? } */ - queryParams.endPoint = endPoint.uri - const searchByNameQuery = kb.the(form, ns.ui('searchByNameQuery'), null, formDoc) - queryParams.searchByNameQuery = searchByNameQuery - var queryParams = {label: 'from form', logo: '', class: klass, endPoint, searchByNameQuery} + if (!klass) { + box.appendChild( + dom.createTextNode('Error: No class given for autocomplete field: ' + form) + ) + return box + } + + const queryParams = { label: 'from form', logo: '', class: klass, endPoint: endPoint.value, searchByNameQuery: searchByNameQuery?.value } const options = { // cancelButton?: HTMLElement, - // acceptButton?: HTMLElement, - class: klass, - queryParams } + // acceptButton?: HTMLElement, + class: klass, + queryParams + } // const acWiget = rhs.appendChild(await renderAutoComplete(dom, options, addOneIdAndRefresh)) // @@ set existing value is any renderAutoComplete(dom, options, addOneIdAndRefresh).then(acWiget => rhs.appendChild(acWiget)) - const field = dom.createElement('input') ;(field as any).style = style.textInputStyle // Do we have to override length etc? rhs.appendChild(field) @@ -171,10 +174,4 @@ export function autocompleteField ( // @@ are they allowed too be async?? return box } - - - - - - // ends diff --git a/src/autocompletePicker.ts b/src/autocompletePicker.ts index 946181b..9b8f951 100644 --- a/src/autocompletePicker.ts +++ b/src/autocompletePicker.ts @@ -15,7 +15,7 @@ const AUTOCOMPLETE_ROWS = 20 // 20? const AUTOCOMPLETE_ROWS_STRETCH = 40 const AUTOCOMPLETE_DEBOUNCE_MS = 300 -const autocompleteRowStyle = 'border: 0.2em solid straw;' // @@ white +// const autocompleteRowStyle = 'border: 0.2em solid straw;' // @@ white /* Autocomplete happens in four phases: @@ -29,10 +29,12 @@ Autocomplete happens in four phases: 5. Optionally waiting for accept button to be pressed */ -type AutocompleteOptions = { cancelButton?: HTMLElement, - acceptButton?: HTMLElement, - class: NamedNode, - queryParams: QueryParameters } +type AutocompleteOptions = { + cancelButton?: HTMLElement, + acceptButton?: HTMLElement, + class: NamedNode, + queryParams: QueryParameters +} interface Callback1 { (subject: NamedNode, name: string): void; @@ -48,27 +50,29 @@ export async function renderAutoComplete (dom: HTMLDocument, options:Autocomplet style.setStyle(errorRow, 'autocompleteRowStyle') errorRow.style.padding = '1em' } + /* function remove (ele?: HTMLElement) { - if (ele) { + if (ele && ele.parentNode) { ele.parentNode.removeChild(ele) } } + */ function finish (object, name) { - console.log('Auto complete: finish! ' + object) - // remove(options.cancelButton) + console.log('Auto complete: finish! ' + object) + // remove(options.cancelButton) // remove(options.acceptButton) // remove(div) callback(object, name) } - async function gotIt(object:NamedNode, name:string) { + async function gotIt (object:NamedNode, name:string) { if (options.acceptButton) { - (options.acceptButton as any).disabled = false - searchInput.value = name // complete it - foundName = name - foundObject = object - console.log('Auto complete: name: ' + name) - console.log('Auto complete: waiting for accept ' + object) - return + (options.acceptButton as any).disabled = false + searchInput.value = name // complete it + foundName = name + foundObject = object + console.log('Auto complete: name: ' + name) + console.log('Auto complete: waiting for accept ' + object) + return } finish(object, name) } @@ -81,10 +85,12 @@ export async function renderAutoComplete (dom: HTMLDocument, options:Autocomplet } } + /* async function cancelButtonHandler (_event) { console.log('Auto complete: Canceled by user! ') div.innerHTML = '' // Clear out the table } + */ function nameMatch (filter:string, candidate: string):boolean { const parts = filter.split(' ') // Each name part must be somewhere @@ -95,19 +101,21 @@ export async function renderAutoComplete (dom: HTMLDocument, options:Autocomplet return true } + /* function cancelText (_event) { - searchInput.value = ''; - if (options.acceptButton) { - (options.acceptButton as any).disabled == true; // start again - } - candidatesLoaded = false + searchInput.value = '' + if (options.acceptButton) { + (options.acceptButton as any).disabled = true // start again + } + _candidatesLoaded = false } + */ function thinOut (filter) { - var hits = 0 - var pick = null, pickedName = '' + let hits = 0 + let pick: string | null = null; let pickedName = '' for (let j = table.children.length - 1; j > 0; j--) { // backwards as we are removing rows - let row = table.children[j] + const row = table.children[j] if (nameMatch(filter, row.textContent)) { hits += 1 pick = row.getAttribute('subject') @@ -118,32 +126,32 @@ export async function renderAutoComplete (dom: HTMLDocument, options:Autocomplet ;(row as any).style.display = 'none' } } - if (hits == 1) { // Maybe require green confirmation button be clicked? + if (hits === 1 && pick) { // Maybe require green confirmation button be clicked? console.log(` auto complete elimination: "${filter}" -> "${pickedName}"`) gotIt(store.sym(pick), pickedName) // uri, name } } function clearList () { - while (table.children.length > 1) { + while (table.children.length > 1 && table.lastChild) { table.removeChild(table.lastChild) } } - async function inputEventHHandler(_event) { + async function inputEventHHandler (_event) { if (runningTimeout) { clearTimeout(runningTimeout) } setTimeout(refreshList, AUTOCOMPLETE_DEBOUNCE_MS) } - async function refreshList() { + async function refreshList () { if (inputEventHandlerLock) { - console.log (`Ignoring "${searchInput.value}" because of lock `) + console.log(`Ignoring "${searchInput.value}" because of lock `) return } inputEventHandlerLock = true - var languagePrefs = await getPreferredLanguages() + const languagePrefs = await getPreferredLanguages() const filter = searchInput.value.trim().toLowerCase() if (filter.length < AUTOCOMPLETE_THRESHOLD) { // too small clearList() @@ -151,11 +159,11 @@ export async function renderAutoComplete (dom: HTMLDocument, options:Autocomplet numberOfRows = AUTOCOMPLETE_ROWS } else { if (allDisplayed && lastFilter && filter.startsWith(lastFilter)) { - thinOut(filter) // reversible? - inputEventHandlerLock = false - return + thinOut(filter) // reversible? + inputEventHandlerLock = false + return } - var bindings + let bindings try { bindings = await queryPublicDataByName(filter, OrgClass, options.queryParams) // bindings = await queryDbpedia(sparql) @@ -178,41 +186,40 @@ export async function renderAutoComplete (dom: HTMLDocument, options:Autocomplet } allDisplayed = loadedEnough && slimmed.length <= numberOfRows console.log(` Filter:"${filter}" bindings: ${bindings.length}, slimmed to ${slimmed.length}; rows: ${numberOfRows}, Enough? ${loadedEnough}, All displayed? ${allDisplayed}`) - slimmed.slice(0,numberOfRows).forEach(binding => { + slimmed.slice(0, numberOfRows).forEach(binding => { const row = table.appendChild(dom.createElement('tr')) style.setStyle(row, 'autocompleteRowStyle') - var uri = binding.subject.value - var name = binding.name.value + const uri = binding.subject.value + const name = binding.name?.value row.setAttribute('style', 'padding: 0.3em;') row.setAttribute('subject', uri) row.style.color = allDisplayed ? '#080' : '#000' // green means 'you should find it here' - row.textContent = name + row.textContent = name || '' row.addEventListener('click', async _event => { console.log(' click row textContent: ' + row.textContent) console.log(' click name: ' + name) - gotIt(store.sym(uri), name) + gotIt(store.sym(uri), name || '') }) }) } inputEventHandlerLock = false } // refreshList - -/* sparqlForSearch + /* sparqlForSearch * * name -- e.g., "mass" * theType -- e.g., */ + /* function sparqlForSearch (name:string, theType:NamedNode):string { - let clean = name.replace(/\W/g, '') // Remove non alphanum so as to protect regexp + const clean = name.replace(/\W/g, '') // Remove non alphanum so as to protect regexp const sparql = `select distinct ?subject, ?name where { ?subject a <${theType.uri}>; rdfs:label ?name FILTER regex(?name, "${clean}", "i") } LIMIT ${AUTOCOMPLETE_LIMIT}` return sparql } - - const queryParams: QueryParameters = options.queryParams +*/ const OrgClass = options.class // kb.sym('http://umbel.org/umbel/rc/EducationalOrganization') // @@@ other if (options.acceptButton) { options.acceptButton.addEventListener('click', acceptButtonHandler, false) @@ -221,15 +228,16 @@ export async function renderAutoComplete (dom: HTMLDocument, options:Autocomplet // options.cancelButton.addEventListener('click', cancelButtonHandler, false) } + // @ts-ignore let candidatesLoaded = false - let runningTimeout = null + const runningTimeout = null let inputEventHandlerLock = false let allDisplayed = false - var lastFilter = null + var lastFilter: string | null = null var numberOfRows = AUTOCOMPLETE_ROWS - var div = dom.createElement('div') - var foundName = null // once found accepted string must match this - var foundObject = null + const div = dom.createElement('div') + var foundName: string | null = null // once found accepted string must match this + var foundObject: NamedNode | null = null var table = div.appendChild(dom.createElement('table')) table.setAttribute('style', 'max-width: 30em; margin: 0.5em;') const head = table.appendChild(dom.createElement('tr')) @@ -244,10 +252,8 @@ export async function renderAutoComplete (dom: HTMLDocument, options:Autocomplet if (event.keyCode === 13) { acceptButtonHandler(event) } - }, false); + }, false) searchInput.addEventListener('input', inputEventHHandler) return div -} // renderAutoComplete - -const ends = 'ENDS'; +} // renderAutoComplete22q1 diff --git a/card.ai b/src/card.ai similarity index 100% rename from card.ai rename to src/card.ai diff --git a/card.png b/src/card.png similarity index 100% rename from card.png rename to src/card.png diff --git a/contactLogic.js b/src/contactLogic.js similarity index 93% rename from contactLogic.js rename to src/contactLogic.js index 5320686..b23be0b 100644 --- a/contactLogic.js +++ b/src/contactLogic.js @@ -1,11 +1,11 @@ // Logic for solid contacts import * as UI from 'solid-ui' +import * as $rdf from 'rdflib' import { store } from 'solid-logic' import { getPersonas } from './webidControl' const ns = UI.ns -const $rdf = UI.rdf const utils = UI.utils const kb = store const updater = kb.updater @@ -64,7 +64,7 @@ export async function saveNewContact (book, name, selectedGroups, klass) { try { await updater.updateMany([], agenda) // @@ in future, updater.updateMany } catch (e) { - console.error("Error: can't update " + person + ' as new contact:' + e) + console.error('Error: can\'t update ' + person + ' as new contact:' + e) throw new Error('Updating new contact: ' + e) } return person @@ -128,9 +128,9 @@ export async function addPersonToGroup (thing, group) { } const types = kb.findTypeURIs(thing) - for (const ty in types) { - // console.log(' drop object type includes: ' + ty) // @@ Allow email addresses and phone numbers to be dropped? - } + // for (const ty in types) { + // console.log(' drop object type includes: ' + ty) // @@ Allow email addresses and phone numbers to be dropped? + // } if (!(ns.vcard('Individual').uri in types || ns.vcard('Organization').uri in types)) { return alert(`Can't add ${thing} to a group: it has to be an individual or another group.`) @@ -194,21 +194,21 @@ export function groupMembers (kb, group) { return b } -export function isLocal(group, item) { +export function isLocal (group, item) { const tree = group.dir().dir().dir() const local = item.uri && item.uri.startsWith(tree.uri) // console.log(` isLocal ${local} for ${item.uri} in group ${group} tree ${tree.uri}`) return local } -export function getSameAs(kb, item, doc) { +export function getSameAs (kb, item, doc) { return kb.each(item, ns.owl('sameAs'), null, doc).concat( - kb.each(null, ns.owl('sameAs'), item, doc)) + kb.each(null, ns.owl('sameAs'), item, doc)) } -export async function getDataModelIssues(groups) { - let del = [] - let ins = [] +export async function getDataModelIssues (groups) { + const del = [] + const ins = [] groups.forEach(group => { const members = kb.each(group, ns.vcard('hasMember'), null, group.doc()) members.forEach((member) => { @@ -226,7 +226,7 @@ export async function getDataModelIssues(groups) { } // if }) // member }) // next group - return {del, ins } + return { del, ins } } // getDataModelIssues // Ends diff --git a/contactsPane.js b/src/contactsPane.js similarity index 97% rename from contactsPane.js rename to src/contactsPane.js index 5b4a056..452d093 100644 --- a/contactsPane.js +++ b/src/contactsPane.js @@ -8,22 +8,17 @@ to change its state according to an ontology, comment on it, etc. ** http://tools.ietf.org/html/rfc6350 ** http://www.iana.org/assignments/vcard-elements/vcard-elements.xhtml ** -** Feross "Standard" style note: Callback functions should not be called "callback" -** or the "standard" linter will complain if the first param is not a node.js error code. (2018-01) -** Hence "callbackFunction" */ /* global alert, confirm */ import { authn } from 'solid-logic' -import { addPersonToGroup, saveNewContact, saveNewGroup, groupMembers } from './contactLogic' +import { addPersonToGroup, saveNewContact, saveNewGroup, groupMembers, getDataModelIssues } from './contactLogic' import * as UI from 'solid-ui' import { mintNewAddressBook } from './mintNewAddressBook' import { renderIndividual } from './individual' import { toolsPane } from './toolsPane' import { groupMembership } from './groupMembershipControl' -import { getDataModelIssues } from './contactLogic' -// const $rdf = UI.rdf const ns = UI.ns const utils = UI.utils const style = UI.style @@ -71,9 +66,9 @@ export default { { noun: 'address book', appPathSegment: 'contactorator.timbl.com' }, function (ws, newBase) { thisPane.clone(thisAddressBook, newBase, { // @@ clone is not a thing - use mintNew - me: me, - div: div, - dom: dom + me, + div, + dom }) } ) @@ -103,10 +98,10 @@ export default { const context = { target: subject, - me: me, + me, noun: 'address book', - div: div, - dom: dom + div, + dom } // missing: statusRegion // Render a 3-column browser for an address book or a group @@ -190,7 +185,7 @@ export default { if (!ok) { return complainIfBad( ok, - "Can't load card: " + local + ': ' + message + 'Can\'t load card: ' + local + ': ' + message ) } // console.log("Loaded card " + local + '\n') @@ -227,11 +222,11 @@ export default { const groups = groupMembership(person) let removeFromGroups = [] // find person WebID's - groups.map( group => { + groups.forEach(group => { const webids = getSameAs(kb, person, group.doc()) // for each check in each Group that it is not used by an other person then delete - webids.map( webid => { - if (getSameAs(kb, webid, group.doc()).length = 1) { + webids.forEach(webid => { + if (getSameAs(kb, webid, group.doc()).length === 1) { removeFromGroups = removeFromGroups.concat(kb.statementsMatching(group, ns.vcard('hasMember'), webid, group.doc())) } }) @@ -289,7 +284,7 @@ export default { message ) { if (!ok) { - const msg = "Can't load group file: " + group + ': ' + message + const msg = 'Can\'t load group file: ' + group + ': ' + message badness.push(msg) return complainIfBad(ok, msg) } @@ -522,7 +517,7 @@ export default { if (!ok) { return complainIfBad( ok, - "Can't load group file: " + groupList + ': ' + message + 'Can\'t load group file: ' + groupList + ': ' + message ) } refreshNames() @@ -601,8 +596,7 @@ export default { // await checkDataModel(groups) } // syncGroupTable - - async function checkDataModel () { + async function checkDataModel () { // await kb.fetcher.load(groups) // asssume loaded already const groups = await loadAllGroups() @@ -632,7 +626,7 @@ export default { try { group = await saveNewGroup(book, name) } catch (err) { - console.log("Error: can't save new group:" + err) + console.log('Error: can\'t save new group:' + err) cardMain.innerHTML = 'Failed to save group' + err return } @@ -657,7 +651,7 @@ export default { try { await kb.fetcher.load(ourBook) } catch (err) { - throw new Error("Book won't load:" + ourBook) + throw new Error('Book won\'t load:' + ourBook) } const nameEmailIndex = kb.any(ourBook, ns.vcard('nameEmailIndex')) @@ -675,7 +669,7 @@ export default { try { person = await saveNewContact(book, name, selectedGroups, klass) } catch (err) { - const msg = "Error: can't save new contact: " + err + const msg = 'Error: can\'t save new contact: ' + err console.log(msg) alert(msg) } @@ -877,7 +871,7 @@ export default { div.appendChild(dom.createElement('hr')) // const groups = await loadAllGroups() @@@ - checkDataModel().then(()=> {console.log('async checkDataModel done.')}) + checkDataModel().then(() => { console.log('async checkDataModel done.') }) // div.appendChild(newAddressBookButton(book)) // later // end of AddressBook instance @@ -960,3 +954,8 @@ export default { } // render function } // pane object // ends + +export function getSameAs (kb, item, doc) { + return kb.each(item, ns.owl('sameAs'), null, doc).concat( + kb.each(null, ns.owl('sameAs'), item, doc)) +} diff --git a/groupMembershipControl.js b/src/groupMembershipControl.js similarity index 95% rename from groupMembershipControl.js rename to src/groupMembershipControl.js index 6489601..6ea6140 100644 --- a/groupMembershipControl.js +++ b/src/groupMembershipControl.js @@ -1,9 +1,7 @@ - // Render a control to record the group memberships we have for this agent import * as UI from 'solid-ui' import { store } from 'solid-logic' -// const $rdf = UI.rdf const ns = UI.ns // const buttons = UI.buttonsn no // const widgets = UI.widgets @@ -29,10 +27,9 @@ export async function renderGroupMemberships (person, context) { const thingwebids = kb.each(null, ns.owl('sameAs'), thing, group.doc()) // WebID can be deleted only if not used in another thing let webids = [] - thingwebids.map(webid => { + thingwebids.forEach(webid => { if (kb.statementsMatching(webid, ns.owl('sameAs'), thing, group.doc())) webids = webids.concat(webid) - } - ) + }) let thingOrWebid = thing if (webids.length > 0) thingOrWebid = webids[0] const groups = kb.each(null, ns.vcard('hasMember'), thingOrWebid) // in all groups a person has same structure @@ -47,9 +44,9 @@ export async function renderGroupMemberships (person, context) { let del = kb .statementsMatching(person, undefined, undefined, group.doc()) .concat(kb.statementsMatching(undefined, undefined, person, group.doc())) - webids.map(webid => { + webids.forEach(webid => { if (kb.statementsMatching(webid, ns.owl('sameAs'), undefined, group.doc()).length < 2) { - del = del.concat(kb.statementsMatching(undefined, undefined, webid, group.doc())) + del = del.concat(kb.statementsMatching(undefined, undefined, webid, group.doc())) } }) kb.updater.update(del, [], function (uri, ok, err) { diff --git a/individual.js b/src/individual.js similarity index 96% rename from individual.js rename to src/individual.js index fd20029..e0f5730 100644 --- a/individual.js +++ b/src/individual.js @@ -2,11 +2,11 @@ import * as UI from 'solid-ui' import { authn, store } from 'solid-logic' import { renderMugshotGallery } from './mugshotGallery' import { renderWebIdControl, renderPublicIdControl } from './webidControl' -import { renderGroupMemberships } from './groupMembershipControl.js' -import textOfForms from './lib/forms' -import VCARD_ONTOLOGY_TEXT from './lib/vcard.js' +import { renderGroupMemberships } from './groupMembershipControl' +import textOfForms from './ontology/forms.ttl' +import VCARD_ONTOLOGY_TEXT from './ontology/vcard.ttl' +import * as $rdf from 'rdflib' -const $rdf = UI.rdf const ns = UI.ns const kb = store const style = UI.style diff --git a/mintNewAddressBook.js b/src/mintNewAddressBook.js similarity index 97% rename from mintNewAddressBook.js rename to src/mintNewAddressBook.js index 984c584..ed1a3d5 100644 --- a/mintNewAddressBook.js +++ b/src/mintNewAddressBook.js @@ -1,12 +1,12 @@ import * as UI from 'solid-ui' import { solidLogicSingleton } from 'solid-logic' +import * as $rdf from 'rdflib' const { setACLUserPublic } = solidLogicSingleton.acl // const mime = require('mime-types') // const toolsPane0 = require('./toolsPane') // const toolsPane = toolsPane0.toolsPane -const $rdf = UI.rdf // const ns = UI.ns // const utils = UI.utils @@ -98,14 +98,14 @@ export function mintNewAddressBook (dataBrowserContext, context) { const p = div.appendChild(dom.createElement('p')) p.setAttribute('style', 'font-size: 140%;') p.innerHTML = - "Your new " + + '\'>new ' + appInstanceNoun + ' is ready. ' + - "


    Go to new " + + '\'>Go to new ' + appInstanceNoun + '' const newContext = Object.assign( diff --git a/mugshotGallery.js b/src/mugshotGallery.js similarity index 98% rename from mugshotGallery.js rename to src/mugshotGallery.js index 5e239c6..16ea727 100644 --- a/mugshotGallery.js +++ b/src/mugshotGallery.js @@ -1,8 +1,8 @@ import * as UI from 'solid-ui' import { store } from 'solid-logic' -import * as mime from 'mime-types' +import mime from 'mime-types' +import * as $rdf from 'rdflib' -const $rdf = UI.rdf const ns = UI.ns const utils = UI.utils const kb = store @@ -87,8 +87,8 @@ export function renderMugshotGallery (dom, subject) { ) kb.fetcher .webOperation('PUT', pic.uri, { - data: data, - contentType: contentType + data, + contentType }) .then(function (response) { if (!response.ok) { @@ -203,15 +203,14 @@ export function renderMugshotGallery (dom, subject) { // img.setAttribute('src', image.uri) use token and works with NSS but not with CSS // we need to get image with authenticated fetch store.fetcher._fetch(image.uri) - .then(function(response) { + .then(function (response) { return response.blob() }) - .then(function(myBlob) { + .then(function (myBlob) { const objectURL = URL.createObjectURL(myBlob) img.setAttribute('src', objectURL) }) UI.widgets.makeDraggable(img, image) - } return img } diff --git a/src/forms.ttl b/src/ontology/forms.ttl similarity index 100% rename from src/forms.ttl rename to src/ontology/forms.ttl diff --git a/organizationForm.ttl b/src/ontology/organizationForm.ttl similarity index 100% rename from organizationForm.ttl rename to src/ontology/organizationForm.ttl diff --git a/src/vcard.ttl b/src/ontology/vcard.ttl similarity index 100% rename from src/vcard.ttl rename to src/ontology/vcard.ttl diff --git a/src/publicData.ts b/src/publicData.ts index e893ea4..4651210 100644 --- a/src/publicData.ts +++ b/src/publicData.ts @@ -5,7 +5,7 @@ import { Literal, NamedNode, parse } from 'rdflib' import { store } from 'solid-logic' import { ns } from 'solid-ui' -import * as instituteDetailsQuery from '../lib/instituteDetailsQuery.js' +import instituteDetailsQuery from './instituteDetailsQuery.sparql' export const AUTOCOMPLETE_LIMIT = 3000 // How many to get from server @@ -26,7 +26,8 @@ interface Binding { type Bindings = Binding[] export type QueryParameters = -{ label: string; +{ + label: string; logo: string; searchByNameQuery?: string; searchByNameURI?: string; @@ -51,15 +52,15 @@ export const wikidataClasses = { } export async function getPreferredLanguages () { - return [ 'fr', 'en', 'de', 'it'] // @@ testing only -- code me later + return ['fr', 'en', 'de', 'it'] // @@ testing only -- code me later } export const escoParameters:QueryParameters = { label: 'ESCO', logo: 'https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif', - searchByNameQuery: null, // No sparql endpoint + searchByNameQuery: undefined, // No sparql endpoint searchByNameURI: 'https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)', - endpoint: null, - class: {} + endpoint: undefined, + class: {} } export const dbpediaParameters:QueryParameters = { @@ -70,19 +71,20 @@ export const dbpediaParameters:QueryParameters = { FILTER regex(?name, "$(name)", "i") } LIMIT $(limit)`, endpoint: 'https://dbpedia.org/sparql/', - class: { AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization'} + class: { AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization' } } export const wikidataParameters = { label: 'WikiData', logo: 'https://www.wikimedia.org/static/images/project-logos/wikidatawiki.png', endpoint: 'https://query.wikidata.org/sparql', - class: { AcademicInsitution: 'http://www.wikidata.org/entity/Q4671277', - Enterprise: 'http://www.wikidata.org/entity/Q6881511', - Business: 'http://www.wikidata.org/entity/Q4830453', - NGO: 'http://www.wikidata.org/entity/Q79913', - CharitableOrganization: 'http://www.wikidata.org/entity/Q708676', - Insitute: 'http://www.wikidata.org/entity/Q1664720', + class: { + AcademicInsitution: 'http://www.wikidata.org/entity/Q4671277', + Enterprise: 'http://www.wikidata.org/entity/Q6881511', + Business: 'http://www.wikidata.org/entity/Q4830453', + NGO: 'http://www.wikidata.org/entity/Q79913', + CharitableOrganization: 'http://www.wikidata.org/entity/Q708676', + Insitute: 'http://www.wikidata.org/entity/Q1664720', }, searchByNameQuery: `SELECT ?subject ?name WHERE { @@ -115,26 +117,26 @@ WHERE * remove dupliacte names for the same thing, leaving the user's * preferred language version */ -export function filterByLanguage (bindings, languagePrefs) { - let uris = {} +export function filterByLanguage (bindings: Bindings, languagePrefs: string[]): Bindings { + const uris: Record = {} bindings.forEach(binding => { // Organize names by their subject const uri = binding.subject.value uris[uri] = uris[uri] || [] uris[uri].push(binding) }) - var languagePrefs2 = languagePrefs + const languagePrefs2 = languagePrefs languagePrefs2.reverse() // prefered last - var slimmed = [] + const slimmed: Binding[] = [] for (const u in uris) { // needs hasOwnProperty ? const bindings = uris[u] - const sortMe = bindings.map(binding => { - return [ languagePrefs2.indexOf(binding.name['xml:lang']), binding] + const sortMe = bindings.map(binding => { + return [languagePrefs2.indexOf(binding.name?.['xml:lang'] || ''), binding] }) sortMe.sort() // best at th ebottom sortMe.reverse() // best at the top - slimmed.push(sortMe[0][1]) + slimmed.push(sortMe[0][1] as Binding) } // map u console.log(` Filter by language: ${bindings.length} -> ${slimmed.length}`) return slimmed @@ -154,13 +156,13 @@ export var predMap = { // allow other mappings top added in theory class: ns.rdf('type'), // logo: ns.schema('logo'), sealImage: ns.schema('logo'), - //image: ns.schema('image'), defaults to shema - shortName:ns.foaf('nick'), + // image: ns.schema('image'), defaults to shema + shortName: ns.foaf('nick'), subsidiary: ns.schema('subOrganization') } export function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc) { - var results = {} + const results = {} console.log(`loadFromBindings: subject: ${solidSubject}`) console.log(` doc: ${doc}`) bindings.forEach(binding => { @@ -177,7 +179,7 @@ export function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc) { values.forEach(combined => { const result = JSON.parse(combined) const { type, value } = result - var obj + let obj if (type === 'uri') { obj = kb.sym(value) } else if (type === 'literal') { @@ -185,7 +187,7 @@ export function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc) { } else { throw new Error(`loadFromBindings: unexpected type: ${type}`) } - if (key == 'type') { + if (key === 'type') { if (wikidataClassMap[value]) { obj = wikidataClassMap[value] } else { @@ -194,13 +196,16 @@ export function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc) { } else if (key === 'coordinates') { // const latlong = value // Like 'Point(-71.106111111 42.375)' console.log(' @@@ hey a point: ' + value) - const regexp =/.*\(([-0-9\.-]*) ([-0-9\.-]*)\)/ + // eslint-disable-next-line no-useless-escape + const regexp = /.*\(([-0-9\.-]*) ([-0-9\.-]*)\)/ const match = regexp.exec(value) - const float = ns.xsd('float') - const latitude = new Literal(match[1], null, float) - const longitude = new Literal(match[2], null, float) - kb.add(solidSubject, ns.schema('longitude'), longitude, doc) - kb.add(solidSubject, ns.schema('latitude'), latitude, doc) + if (match) { + const float = ns.xsd('float') + const latitude = new Literal(match[1], null, float) + const longitude = new Literal(match[2], null, float) + kb.add(solidSubject, ns.schema('longitude'), longitude, doc) + kb.add(solidSubject, ns.schema('latitude'), latitude, doc) + } } else if (predMap[key]) { const pred = predMap[key] || ns.schema(key) // fallback to just using schema.org kb.add(solidSubject, pred, obj, doc) // @@ deal with non-string and objects @@ -216,107 +221,118 @@ export function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc) { /* Query all entities of given class and partially matching name */ export async function queryESCODataByName (filter: string, theClass:NamedNode, queryTarget: QueryParameters): Promise { + if (!queryTarget.searchByNameURI) { + throw new Error('Query target searchByNameURI is required for ESCO queries') + } const queryURI = queryTarget.searchByNameURI .replace('$(name)', filter) .replace('$(limit)', '' + AUTOCOMPLETE_LIMIT) - .replace('$(class)', theClass) + .replace('$(class)', theClass.uri) console.log('Querying ESCO data - uri: ' + queryURI) - const options = { credentials: 'omit', - headers: { 'Accept': 'application/json'} + const options = { + credentials: 'omit' as const, + headers: { Accept: 'application/json' } } // CORS - var response - response = await store.fetcher.webOperation('GET', queryURI, options) - //complain('Error querying db of organizations: ' + err) + const response = await store.fetcher.webOperation('GET', queryURI, options) + // complain('Error querying db of organizations: ' + err) const text = response.responseText - console.log(' Query result text' + text.slice(0,500) + '...') + if (!text) throw new Error('No response text from ESCO query ' + queryURI) + console.log(' Query result text' + text.slice(0, 500) + '...') if (text.length === 0) throw new Error('Wot no text back from ESCO query ' + queryURI) const json = JSON.parse(text) - console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0,500) + '...') + console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...') const results = json._embedded.results // Array const bindings = results.map(result => { const name = result.title const uri = result.uri // like http://data.europa.eu/esco/occupation/57af9090-55b4-4911-b2d0-86db01c00b02 - return { name: { value: name, type: 'literal'}, uri: {type: 'IRI', value: uri}} // simulate SPARQL bindings + return { name: { value: name, type: 'literal' }, uri: { type: 'IRI', value: uri } } // simulate SPARQL bindings }) return bindings // return queryPublicDataSelect(sparql, queryTarget) } - /* Query all entities of given class and partially matching name */ export async function queryPublicDataByName (filter: string, theClass:NamedNode, queryTarget: QueryParameters): Promise { - const sparql = queryTarget.searchByNameQuery + const sparql = queryTarget.searchByNameQuery! .replace('$(name)', filter) .replace('$(limit)', '' + AUTOCOMPLETE_LIMIT) - .replace('$(class)', theClass) + .replace('$(class)', theClass.uri) console.log('Querying public data - sparql: ' + sparql) return queryPublicDataSelect(sparql, queryTarget) } export async function queryPublicDataSelect (sparql: string, queryTarget: QueryParameters): Promise { - const myUrlWithParams = new URL(queryTarget.endpoint); - myUrlWithParams.searchParams.append("query", sparql); + if (!queryTarget.endpoint) { + throw new Error('Query target endpoint is required') + } + const myUrlWithParams = new URL(queryTarget.endpoint!) + myUrlWithParams.searchParams.append('query', sparql) const queryURI = myUrlWithParams.href - console.log(' queryPublicDataSelect uri: ' + queryURI); + console.log(' queryPublicDataSelect uri: ' + queryURI) - const options = { credentials: 'omit', - headers: { 'Accept': 'application/json'} + const options = { + credentials: 'omit' as const, + headers: { Accept: 'application/json' } } // CORS - var response - response = await store.fetcher.webOperation('GET', queryURI, options) - //complain('Error querying db of organizations: ' + err) + const response = await store.fetcher.webOperation('GET', queryURI, options) + // complain('Error querying db of organizations: ' + err) const text = response.responseText // console.log(' Query result text' + text.slice(0,100) + '...') - if (text.length === 0) throw new Error('Wot no text back from query ' + queryURI) - const json = JSON.parse(text) - console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0,100) + '...') - const bindings = json.results.bindings - return bindings + if (!text || text.length === 0) { throw new Error('Wot no text back from query ' + queryURI) } else { + const json = JSON.parse(text) + console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 100) + '...') + const bindings = json.results.bindings + return bindings + } } -export async function queryPublicDataConstruct (sparql: string, pubicId: NamedNode, queryTarget: QueryParameters): Promise { +export async function queryPublicDataConstruct (sparql: string, publicId: NamedNode, queryTarget: QueryParameters): Promise { console.log('queryPublicDataConstruct: sparql:', sparql) - const myUrlWithParams = new URL(queryTarget.endpoint); - myUrlWithParams.searchParams.append("query", sparql); + if (!queryTarget.endpoint) { + throw new Error('Query target endpoint is required') + } + const myUrlWithParams = new URL(queryTarget.endpoint) + myUrlWithParams.searchParams.append('query', sparql) const queryURI = myUrlWithParams.href - console.log(' queryPublicDataConstruct uri: ' + queryURI); - const options = { credentials: 'omit', // CORS - headers: { 'Accept': 'text/turtle'} + console.log(' queryPublicDataConstruct uri: ' + queryURI) + const options = { + credentials: 'omit' as const, // CORS + headers: { Accept: 'text/turtle' } } const response = await store.fetcher.webOperation('GET', queryURI, options) const text = response.responseText - const report = text.lenth > 500 ? text.slice(0,200) + ' ... ' + text.slice(-200) : text + const report = text && text.length > 500 ? text.slice(0, 200) + ' ... ' + text.slice(-200) : text console.log(' queryPublicDataConstruct result text:' + report) - if (text.length === 0) throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI) - parse(text, store, pubicId.uri, 'text/turtle') - return + if (!text || text.length === 0) { throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI) } else { parse(text, store, publicId.uri, 'text/turtle') } } export async function loadPublicDataThing (kb, subject: NamedNode, publicDataID: NamedNode) { - if (publicDataID.uri.startsWith('https://dbpedia.org/resource/')) { return getDbpediaDetails(kb, subject, publicDataID) } else if (publicDataID.uri.match(/^https?:\/\/www\.wikidata\.org\/entity\/.*/)) { - const QId = publicDataID.uri.split('/')[4] - const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl` - // In fact loading the data URI gives much to much irrelevant data, from wikidata. + // Previous approach: + // const QId = publicDataID.uri.split('/')[4] + // const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl` + // Not used because loading the data URI gives much too much irrelevant data from Wikidata. await getWikidataDetails(kb, subject, publicDataID) // await getWikidataLocation(kb, subject, publicDataID) -- should get that in the details query now } else { - const iDToFetch = publicDataID.uri.startsWith('http:') ? kb.sym('https:' + publicDataID.uri.slice(5)) - : publicDataID - return kb.fetcher.load(iDToFetch, { credentials: 'omit', - headers: { 'Accept': 'text/turtle'} + const iDToFetch = publicDataID.uri.startsWith('http:') + ? kb.sym('https:' + publicDataID.uri.slice(5)) + : publicDataID + return kb.fetcher.load(iDToFetch, { + credentials: 'omit', + headers: { Accept: 'text/turtle' } }) } } export async function getWikidataDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) { const subjRegexp = /wd:Q49108/g - const sparql = instituteDetailsQuery.replace(subjRegexp, publicDataID) + const sparql = instituteDetailsQuery.replace(subjRegexp, publicDataID.value) await queryPublicDataConstruct(sparql, publicDataID, wikidataParameters) console.log('getWikidataDetails: loaded.', publicDataID) } @@ -335,9 +351,9 @@ optional { $(subject) wdt:P1813 ?shortName } optional { $(subject) wdt:P355 ?subsidiary } # SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en,de,it" } }` - .replace(subjectRegexp, publicDataID) + .replace(subjectRegexp, publicDataID.uri) const bindings = await queryPublicDataSelect(sparql, wikidataParameters) - loadFromBindings (kb, publicDataID, bindings, publicDataID.doc()) //arg2 was solidSubject + loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()) // arg2 was solidSubject } export async function getWikidataLocation (kb, solidSubject:NamedNode, publicDataID:NamedNode) { @@ -351,14 +367,13 @@ export async function getWikidataLocation (kb, solidSubject:NamedNode, publicDat optional { ?location wdt:P17 ?country } # SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en,de,it" } -}`.replace(subjectRegexp, publicDataID) - console.log( ' location query sparql:' + sparql) +}`.replace(subjectRegexp, publicDataID.uri) + console.log(' location query sparql:' + sparql) const bindings = await queryPublicDataSelect(sparql, wikidataParameters) console.log(' location query bindings:', bindings) - loadFromBindings (kb, publicDataID, bindings, publicDataID.doc()) // was solidSubject + loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()) // was solidSubject } - export async function getDbpediaDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) { // Note below the string form of the named node with <> works in SPARQL const sparql = `select distinct ?city, ?state, ?country, ?homepage, ?logo, ?lat, ?long, WHERE { @@ -369,17 +384,20 @@ export async function getDbpediaDetails (kb, solidSubject:NamedNode, publicDataI OPTIONAL { ${publicDataID} foaf:lat ?lat; foaf:long ?long } OPTIONAL { ${publicDataID} ?country } }` - const predMap = { - city: ns.vcard('locality'), - state: ns.vcard('region'), - country: ns.vcard('country-name'), - homepage: ns.foaf('homepage'), - lat: ns.geo('latitude'), - long: ns.geo('longitude'), - } + /* + const predMap = { + city: ns.vcard('locality'), + state: ns.vcard('region'), + country: ns.vcard('country-name'), + homepage: ns.foaf('homepage'), + lat: ns.geo('latitude'), + long: ns.geo('longitude'), + } + */ const bindings = await queryPublicDataSelect(sparql, dbpediaParameters) - bindings.forEach(binding => { + return bindings.map(binding => { const uri = binding.subject.value // @@ To be written - const name = binding.name.value + const name = binding.name?.value + return { uri, name } }) } diff --git a/toolsPane.js b/src/toolsPane.js similarity index 98% rename from toolsPane.js rename to src/toolsPane.js index 6815987..08cc99c 100644 --- a/toolsPane.js +++ b/src/toolsPane.js @@ -5,6 +5,7 @@ import * as UI from 'solid-ui' import { store } from 'solid-logic' import { saveNewGroup, addPersonToGroup, groupMembers } from './contactLogic' + export function toolsPane ( selectAllGroups, selectedGroups, @@ -41,10 +42,10 @@ export function toolsPane ( const context = { target: book, - me: me, + me, noun: 'address book', div: pane, - dom: dom, + dom, statusRegion: statusBlock } @@ -437,7 +438,7 @@ export function toolsPane ( } stats.groupMembers = [] kb.each(null, ns.vcard('hasMember')) - .map(group => { stats.groupMembers = stats.groupMembers.concat(groupMembers(kb, group)) }) + .forEach(group => { stats.groupMembers = stats.groupMembers.concat(groupMembers(kb, group)) }) log(' Naive group members ' + stats.groupMembers.length) stats.groupMemberSet = [] for (let j = 0; j < stats.groupMembers.length; j++) { @@ -548,7 +549,7 @@ export function toolsPane ( const data = sz.statementsToN3(sts) return kb.fetcher.webOperation('PUT', cleanPeople, { - data: data, + data, contentType: 'text/turtle' }) }) @@ -579,7 +580,7 @@ export function toolsPane ( const data = sz.statementsToN3(sts) return kb.fetcher.webOperation('PUT', cleanGroup, { - data: data, + data, contentType: 'text/turtle' }) }) @@ -626,7 +627,7 @@ export function toolsPane ( if (confirm('Write new clean versions?')) { resolve(true) } else { - reject() + reject(new Error('User cancelled writing clean versions')) } }) }) @@ -726,7 +727,7 @@ export function toolsPane ( fixGrouplessButton.addEventListener('click', _event => fixGroupless(book)) async function fixToOldDataModel (book) { - async function updateToOldDataModel(groups) { + async function updateToOldDataModel (groups) { let ds = [] let ins = [] groups.forEach(group => { @@ -751,7 +752,7 @@ export function toolsPane ( if (ds.length && confirm('Groups can be updated to old data model ?')) { await kb.updater.updateMany(ds, ins) alert('Update done') - } else { if (!ds.length) alert('Nothing to update.\nAll Groups already use the old data model.')} + } else { if (!ds.length) alert('Nothing to update.\nAll Groups already use the old data model.') } } let groups = kb.each(book, VCARD('includesGroup')) const strings = new Set(groups.map(group => group.uri)) // remove dups @@ -763,7 +764,6 @@ export function toolsPane ( fixToOldDataModelButton.style.cssText = buttonStyle fixToOldDataModelButton.textContent = 'Revert groups to old data model' fixToOldDataModelButton.addEventListener('click', _event => fixToOldDataModel(book)) - } // main main() return pane diff --git a/webidControl.js b/src/webidControl.js similarity index 98% rename from webidControl.js rename to src/webidControl.js index cc161aa..f28d50e 100644 --- a/webidControl.js +++ b/src/webidControl.js @@ -1,13 +1,13 @@ // Render a control to record the webids we have for this agent -/* eslint-disable multiline-ternary */ + import * as UI from 'solid-ui' import { store } from 'solid-logic' import { updateMany } from './contactLogic' // import { renderAutoComplete } from './lib/autocompletePicker' // dbpediaParameters -import { renderAutocompleteControl } from './lib/autocompleteBar' +import { renderAutocompleteControl } from './autocompleteBar' // import { wikidataParameters, loadPublicDataThing, wikidataClasses } from './lib/publicData' // dbpediaParameters +import * as $rdf from 'rdflib' -const $rdf = UI.rdf const ns = UI.ns const widgets = UI.widgets const utils = UI.utils @@ -38,6 +38,7 @@ export async function addWebIDToContacts (person, webid, urlType, kb) { // check this is a url try { + // eslint-disable-next-line no-unused-vars const _url = new URL(webid) } catch (error) { throw new Error(`${WEBID_NOUN}: ${webid} is not a valid url.`) diff --git a/test/unit/data-reformat-test.test.ts b/test/unit/data-reformat-test.test.ts new file mode 100644 index 0000000..38810d8 --- /dev/null +++ b/test/unit/data-reformat-test.test.ts @@ -0,0 +1,178 @@ +import { getDataModelIssues } from '../../src/contactLogic' +import fetchMock from 'jest-fetch-mock' +import { ns } from 'solid-ui' +import { store } from 'solid-logic' +import pane from '../../src/contactsPane' +import { parse, sym } from 'rdflib' +import { context, doc, mockFetchFunction, mockUpdate, prefixes, web } from './setup' + +// This was at testingsolidos.solidcommunity.net + +const base = doc.dir()?.uri || '' +const webid1 = sym(base + 'People/localPerson/index.ttl#this') + +const exampleData = prefixes + ` + +:homeGroup1 a vcard:Group; + vcard:fn "Happy Home"; + vcard:hasMember ${webid1} . + +:homeGroup2 a vcard:Group; + vcard:fn "Home"; + vcard:hasMember :localPerson. + +:homeGroup3 a vcard:Group; + vcard:fn "Home"; + vcard:hasMember :localPerson. + +` + +const book = sym(base + 'book.ttl#this') + +const aliceLocal = sym(base + 'People/aaaaaaaaaa/index.ttl#this') +const aliceWebId = sym('https://alice.example/card#me') + +web[aliceLocal.doc().uri] = '<#this> a vcard:Individual, schema:Person; vcard:fn "Alice".' + +const bobLocal = sym(base + 'People/bbbbbbbbbb/index.ttl#this') +const bobWebId = sym('https://bob.example.net/#me') +web[bobLocal.doc().uri] = `<#this> a vcard:Individual, schema:Person; + vcard:hasURL [ vcard:type vcard:WebId; vcard:value ${bobWebId} ]; + vcard:fn "Bob".` + +web[base + 'book.ttl'] = ` +<#this> a vcard:AddressBook; + vcard:fn """Contacts: Test address book"""; + vcard:nameEmailIndex ; + vcard:groupIndex . +` + +web[base + 'groups.ttl'] = ` + a vcard:Group ; + vcard:fn "Test group". + a vcard:Group ; + vcard:fn "Home group". + a vcard:Group ; + vcard:fn "Work group". +` + +const testGroup = sym(base + 'Group/Test.ttl#this') +web[testGroup.doc().uri] = ` +<#this> a vcard:Group; + vcard:fn "Test Group"; + vcard:hasMember ${aliceLocal} . +# , +# <../People/aaaaaaaaaa/index.ttl#this>, +# <../People/bbbbbbbbbbb/index.ttl#this> . + + ${aliceLocal} = ${aliceWebId} . +` +const homeGroup = sym(base + 'Group/Home.ttl#this') +web[homeGroup.doc().uri] = ` +<#this> a vcard:Group; + vcard:fn "Home Group"; + vcard:hasMember + <../People/aaaaaaaaaa/index.ttl#this>, + <../People/bbbbbbbbbb/index.ttl#this> . +` + +const workGroup = sym(base + 'Group/Work.ttl#this') +web[workGroup.doc().uri] = ` +<#this> a vcard:Group; + vcard:fn "Work Group"; + vcard:hasMember + , + , + .` + +web[base + 'People/aaaaaaaaaa/index.ttl'] = ` + <#this> vcard:fn "Alice" . +` + +const groups = [testGroup, homeGroup, workGroup] + +for (const uri in web) { + console.log(` parsing "${uri}" (${web[uri].length})`) + parse(prefixes + web[uri], store, uri) +} + +describe('contacts-pane', () => { + describe('returns right label', () => { + beforeAll(async () => { + store.removeDocument(doc) + // parse(exampleData, store, doc.uri); + // const label = pane.label(subject, context); + }) + /* +if (t[ns.vcard('Individual').uri]) return 'Contact' +if (t[ns.vcard('Organization').uri]) return 'contact' +if (t[ns.foaf('Person').uri]) return 'Person' +if (t[ns.schema('Person').uri]) return 'Person' +if (t[ns.vcard('Group').uri]) return 'Group' +if (t[ns.vcard('AddressBook').uri]) return 'Address book' +*/ + it('returns a good label contact if Organization', () => { + const thing = sym(base + 'thing1') + store.add(thing, ns.rdf('type'), ns.vcard('Organization'), doc) + expect(pane.label(thing, context)).toEqual('contact') + }) + + it('returns a good label Contact for Individual', () => { + const thing = sym(base + 'thing2') + store.add(thing, ns.rdf('type'), ns.vcard('Individual'), doc) + expect(pane.label(thing, context)).toEqual('Contact') + }) + it('returns a good label Person if Person', () => { + const thing = sym(base + 'thing3') + store.add(thing, ns.rdf('type'), ns.schema('Person'), doc) + expect(pane.label(thing, context)).toEqual('Person') + }) + it('returns a good label Person if foaf:Person', () => { + const thing = sym(base + 'thing4') + store.add(thing, ns.rdf('type'), ns.foaf('Person'), doc) + expect(pane.label(thing, context)).toEqual('Person') + }) + it('returns a good label Group if Group', () => { + const thing = sym(base + 'thing5') + + store.add(thing, ns.rdf('type'), ns.vcard('Group'), doc) + expect(pane.label(thing, context)).toEqual('Group') + }) + it('returns a good label AddressBook if AddressBook', () => { + const thing = sym(base + 'thing6') + store.add(thing, ns.rdf('type'), ns.vcard('AddressBook'), doc) + expect(pane.label(thing, context)).toEqual('Address book') + }) + it('returns a null label if not a person', () => { + expect(pane.label(sym('https://random.example.com/'), context)).toEqual(null) + // done() + }) + }) // label tests + + describe('render tests', () => { // How to get the UI which comes over time? + it('renders an empty UI of an address book', () => { + const div = pane.render(book, context) + expect(div.outerHTML).toMatch('
    ') + expect(div.innerHTML).toMatch('') + }) + }) // render tests + + describe('data format tests', () => { + beforeAll(async () => { + store.removeDocument(doc) + parse(exampleData, store, doc.uri) + fetchMock.mockIf(/^https?.*$/, mockFetchFunction) + }) + + it('converts a bad format into a good one', async () => { + expect(store.the(testGroup, ns.vcard('hasMember'), null, testGroup.doc())).toEqual(aliceLocal) + const { del, ins } = await getDataModelIssues(groups) + expect(del.length).toEqual(1) + expect(ins.length).toEqual(1) + expect(del.toString()).toEqual(' .') + expect(ins.toString()).toEqual(' .') + mockUpdate(store, del, ins) + expect(store.the(testGroup, ns.vcard('hasMember'), null, testGroup.doc())).toEqual(aliceWebId) + }) + }) // data format tests +}) // all tests diff --git a/test/unit/setup.ts b/test/unit/setup.ts new file mode 100644 index 0000000..d21e053 --- /dev/null +++ b/test/unit/setup.ts @@ -0,0 +1,71 @@ +import { DataBrowserContext, PaneRegistry } from 'pane-registry' +import { Statement, LiveStore, sym } from 'rdflib' +import { ns } from 'solid-ui' +import { SolidLogic, store } from 'solid-logic' + +export const subject = sym('https://janedoe.example/profile/card#me') +export const doc = subject.doc() + +export const context = { + dom: document, + getOutliner: () => null, + session: { + paneRegistry: { + byName: (name: string) => { + return { + render: () => { + return document.createElement('div') + .appendChild( + document.createTextNode(`mock ${name} pane`) + ) + } + } + } + } as PaneRegistry, + store, + logic: {} as SolidLogic, + }, +} as unknown as DataBrowserContext + +const prefs = Object.keys(ns).filter(x => x !== 'default') // default is bogus value +export const prefixes = prefs.map(prefix => `@prefix ${prefix}: ${ns[prefix]('')}.\n`).join('') // In turtle + +export const web = {} +export const requests: any[] = [] + +export async function mockFetchFunction (req) { + if (req.method !== 'GET') { + requests.push(req) + if (req.method === 'PUT') { + const contents = await req.text() + web[req.url] = contents // Update our dummy web + console.log(`Test: Updated ${req.url} on PUT to <<<${web[req.url]}>>>`) + } + return { status: 200 } + } + const contents = web[req.url] + if (contents !== undefined) { // + return { + body: prefixes + contents, // Add namespaces to anything + status: 200, + headers: { + 'Content-Type': 'text/turtle', + 'WAC-Allow': 'user="write", public="read"', + 'Accept-Patch': 'application/sparql-update' + } + } + } // if contents + return { + status: 404, + body: 'Not Found' + } +} + +export function mockUpdate (store: LiveStore, del: Statement[], ins: Statement[]) { + for (const st of del) { + store.remove(st) + } + for (const st of ins) { + store.addStatement(st) + } +} diff --git a/tsconfig.json b/tsconfig.json index 6235e44..5aded3d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,16 +1,81 @@ { "compilerOptions": { - "target": "ES2015", - "module": "commonjs", - "strict": false, - "outDir": "lib", - "sourceMap": true, - "allowSyntheticDefaultImports" : true // https://github.com/inrupt/solid-client-authn-js/issues/3219 - // "esModuleInterop": true // , - // "skipLibCheck": true // otherwise it takes *.d.ts from node_modules see: https://stackoverflow.com/questions/51634361/how-to-force-tsc-to-ignore-node-modules-folder + /* Basic Options */ + "target": "ES2022", /* Allow top-level await and modern JS features. */ + "module": "ESNext", /* Use ESNext modules for Webpack/Babel compatibility. */ + "moduleResolution": "node", /* Use Node.js-style module resolution for Webpack compatibility. */ + "skipLibCheck": true, // if true, Type errors in library .d.ts files will be ignored, so you might miss some issues. + "lib": [ + "dom", + "es2015", + "es2019" + ] /* Specify library files to be included in the compilation. */, + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + // "outFile": "./", /* Concatenate and emit output to single file. */ + + "outDir": "dist" /* Redirect output structure to the directory. */, + "rootDir": "src/", + + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "incremental": true, /* Enable incremental compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": false /* Enable all strict type-checking options. */, + "noImplicitAny": false /* Raise error on expressions and declarations with an implied 'any' type. */, + "strictNullChecks": true /* Enable strict null checks. */, + "strictFunctionTypes": true /* Enable strict checking of function types. */, + "strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */, + "strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */, + "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */, + "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, + + /* Additional Checks */ + "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + "typeRoots": [ + "declarations.d.ts", + "node_modules/@types" + ] /* List of folders to include type definitions from. */, + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ }, "include": [ - "./src/**/*" + "src/**/*", + "declarations.d.ts", + "**/*.ttl", + "**/*.sparql" ], - "exclude": ["**/*.spec.ts", "**/*.test.ts"] + "exclude": ["node_modules", "dist", "coverage"] } diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 0000000..b863b49 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "include": ["test/**/*"], + "compilerOptions": { + "rootDir": ".", + "noEmit": true + } +} \ No newline at end of file