From 1b205759db62229e87f56976904e23a898a968d1 Mon Sep 17 00:00:00 2001 From: Melvin Carvalho Date: Tue, 30 Dec 2025 11:14:40 +0100 Subject: [PATCH 01/13] chore: swap solid-logic and solid-ui to JSS variants - Update package name to solid-panes-jss - Swap solid-logic dependency to solid-logic-jss - Swap solid-ui dependency to solid-ui-jss - Update all imports from 'solid-logic' to 'solid-logic-jss' - Update all imports from 'solid-ui' to 'solid-ui-jss' - Update README with JSS references and credits All 52 test suites pass (628 tests). --- README.md | 14 ++++++++----- dev/loader.ts | 2 +- dev/pane/index.ts | 2 +- package.json | 20 +++++++++---------- src/RDFXMLPane.js | 2 +- src/argument/argumentPane.js | 4 ++-- src/attach/attachPane.js | 2 +- src/audio/audioPane.js | 2 +- src/classInstancePane.js | 2 +- src/dashboard/basicPreferences.ts | 2 +- src/dashboard/dashboardPane.ts | 4 ++-- src/dashboard/homepage.ts | 2 +- src/dataContentPane.js | 2 +- src/defaultPane.js | 2 +- src/dokieli/dokieliPane.js | 2 +- src/form/pane.js | 4 ++-- src/home/homePane.ts | 6 +++--- src/humanReadablePane.js | 2 +- src/imagePane.js | 2 +- src/index.ts | 4 ++-- src/internal/internalPane.ts | 2 +- src/mainPage/footer.ts | 2 +- src/mainPage/header.ts | 4 ++-- src/microblogPane/microblogPane.js | 4 ++-- src/n3Pane.js | 2 +- src/outline/context.ts | 2 +- src/outline/manager.js | 4 ++-- src/outline/outlineIcons.js | 2 +- src/outline/propertyViews.ts | 2 +- src/outline/queryByExample.js | 4 ++-- src/outline/userInput.js | 4 ++-- src/outline/viewAsImage.ts | 2 +- src/pad/padPane.ts | 4 ++-- src/playlist/playlistPane.js | 2 +- src/schedule/schedulePane.js | 4 ++-- src/sharing/sharingPane.ts | 2 +- src/slideshow/slideshowPane.js | 2 +- src/socialPane.js | 4 ++-- src/tabbed/tabbedPane.ts | 2 +- src/tableViewPane.js | 2 +- src/transaction/pane.js | 2 +- src/transaction/period.js | 2 +- src/trip/tripPane.js | 2 +- .../trustedApplications.dom.ts | 4 ++-- .../trustedApplications.view.ts | 4 ++-- src/ui/pane.js | 2 +- src/video/videoPane.js | 2 +- test/unit/test-import-export/edit-importer.js | 4 ++-- 48 files changed, 82 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index ef5f4287..74f7f5f9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# solid-panes +# solid-panes-jss -A set of core solid-compatible applets based on solid-ui +A set of core solid-compatible applets based on solid-ui-jss (JSS variant with minimal solid-oidc authentication) These are a set of interlinked applications, or parts of applications, which called 'panes' -- as in parts of a window. A pane displays a data object of certain class using part of the window. @@ -29,7 +29,7 @@ Currently the panes available include: - and so on The solid-app-set panes are built using a set of widgets and utilities in -[https://github.com/linkeddata/solid-ui](https://github.com/linkeddata/solid-ui) +[https://github.com/JavaScriptSolidServer/solid-ui-jss](https://github.com/JavaScriptSolidServer/solid-ui-jss) To help onboarding, we're using [roles](https://github.com/solidos/userguide/#role) to limit the number of panes presented to new users. @@ -55,8 +55,8 @@ To get started, make sure you have Node.js installed (for instance through https://github.com/nvm-sh/nvm), and: 1. run ```sh -git clone https://github.com/solidos/solid-panes -cd solid-panes +git clone https://github.com/JavaScriptSolidServer/solid-panes-jss +cd solid-panes-jss npm install npm run start ``` @@ -78,3 +78,7 @@ contacts (A VCARD Address Book, Group, Individual, Organization) can be handled pane. Any other pane which wants to deal with contacts can just use the pane within its own user interface. ![Mapping many classes on the L to panes on the R](https://solidos.github.io/solid-panes/doc/images/panes-for-classes.svg) + +## Credits + +This is a fork of [solidos/solid-panes](https://github.com/solidos/solid-panes) with the authentication replaced from `@inrupt/solid-client-authn-browser` to the minimal [solid-oidc](https://github.com/JavaScriptSolidServer/solid-oidc) library via [solid-logic-jss](https://github.com/JavaScriptSolidServer/solid-logic-jss) and [solid-ui-jss](https://github.com/JavaScriptSolidServer/solid-ui-jss). diff --git a/dev/loader.ts b/dev/loader.ts index 14eebf04..6bb6e719 100644 --- a/dev/loader.ts +++ b/dev/loader.ts @@ -1,6 +1,6 @@ import * as paneRegistry from 'pane-registry' import * as $rdf from 'rdflib' -import { solidLogicSingleton, store, authSession } from 'solid-logic' +import { solidLogicSingleton, store, authSession } from 'solid-logic-jss' import { getOutliner } from '../src' import Pane from 'profile-pane' diff --git a/dev/pane/index.ts b/dev/pane/index.ts index 6cf52cb9..bb5e0663 100644 --- a/dev/pane/index.ts +++ b/dev/pane/index.ts @@ -1,7 +1,7 @@ // import { longChatPane as Pane } from 'chat-pane' // import Pane from '../../src/profile/profile.view' import Pane from 'profile-pane' -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' console.log('Loaded pane into Solid Pane Tester. Check window.Pane and window.UI') ;(window as any).Pane = Pane diff --git a/package.json b/package.json index 5908fdad..fa3c8891 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "solid-panes", - "version": "4.0.0", - "description": "Solid-compatible Panes: applets and views for the mashlib and databrowser", + "name": "solid-panes-jss", + "version": "4.0.1", + "description": "Solid-compatible Panes (JSS variant with minimal solid-oidc authentication)", "main": "dist/index.js", "types": "dist/index.d.ts", "sideEffects": false, @@ -34,7 +34,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/solidos/solid-panes.git" + "url": "git+https://github.com/JavaScriptSolidServer/solid-panes-jss.git" }, "keywords": [ "solid", @@ -52,9 +52,9 @@ "author": "Tim Berners-Lee ", "license": "MIT", "bugs": { - "url": "https://github.com/solidos/solid-panes/issues" + "url": "https://github.com/JavaScriptSolidServer/solid-panes-jss/issues" }, - "homepage": "https://github.com/solidos/solid-panes", + "homepage": "https://github.com/JavaScriptSolidServer/solid-panes-jss", "dependencies": { "@solid/better-simple-slideshow": "^0.1.0", "activitystreams-pane": "^1.0.0", @@ -73,8 +73,8 @@ }, "overrides": { "rdflib": "$rdflib", - "solid-logic": "$solid-logic", - "solid-ui": "$solid-ui" + "solid-logic": "npm:solid-logic-jss@github:JavaScriptSolidServer/solid-logic-jss", + "solid-ui": "npm:solid-ui-jss@github:JavaScriptSolidServer/solid-ui-jss" }, "devDependencies": { "@babel/cli": "^7.28.0", @@ -103,8 +103,8 @@ "rdflib": "^2.3.0", "react": "^19.1.1", "react-dom": "^19.1.1", - "solid-logic": "^4.0.0", - "solid-ui": "^3.0.0", + "solid-logic-jss": "github:JavaScriptSolidServer/solid-logic-jss", + "solid-ui-jss": "github:JavaScriptSolidServer/solid-ui-jss", "ts-jest": "^29.4.1", "typescript": "^5.9.2", "webpack": "^5.101.0", diff --git a/src/RDFXMLPane.js b/src/RDFXMLPane.js index 34fd4a94..413b60d9 100644 --- a/src/RDFXMLPane.js +++ b/src/RDFXMLPane.js @@ -5,7 +5,7 @@ ** in generated N3 syntax. */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/argument/argumentPane.js b/src/argument/argumentPane.js index 027ec181..240e9615 100644 --- a/src/argument/argumentPane.js +++ b/src/argument/argumentPane.js @@ -6,8 +6,8 @@ ** Should allow editing the data too */ -import { store } from 'solid-logic' -import * as UI from 'solid-ui' +import { store } from 'solid-logic-jss' +import * as UI from 'solid-ui-jss' import * as panes from 'pane-registry' // console.log('@@@ argument pane icon at ' + (module.__dirname || __dirname) + '/icon_argument.png') diff --git a/src/attach/attachPane.js b/src/attach/attachPane.js index 53631b5a..19056eca 100644 --- a/src/attach/attachPane.js +++ b/src/attach/attachPane.js @@ -8,7 +8,7 @@ ** */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' export default { diff --git a/src/audio/audioPane.js b/src/audio/audioPane.js index 43fd1ddc..0a415cf2 100644 --- a/src/audio/audioPane.js +++ b/src/audio/audioPane.js @@ -1,7 +1,7 @@ /* Single audio play Pane ** */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/classInstancePane.js b/src/classInstancePane.js index 7bb15e07..4908877b 100644 --- a/src/classInstancePane.js +++ b/src/classInstancePane.js @@ -3,7 +3,7 @@ ** This outline pane lists the members of a class */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/dashboard/basicPreferences.ts b/src/dashboard/basicPreferences.ts index 5523d220..fe5ad2c2 100644 --- a/src/dashboard/basicPreferences.ts +++ b/src/dashboard/basicPreferences.ts @@ -1,6 +1,6 @@ import { PaneDefinition } from 'pane-registry' import { IndexedFormula, NamedNode, parse, Store } from 'rdflib' -import { icons, login, ns, widgets } from 'solid-ui' +import { icons, login, ns, widgets } from 'solid-ui-jss' import ontologyData from './ontologyData.ttl' import preferencesFormText from './preferencesFormText.ttl' diff --git a/src/dashboard/dashboardPane.ts b/src/dashboard/dashboardPane.ts index 6ce29165..80597030 100644 --- a/src/dashboard/dashboardPane.ts +++ b/src/dashboard/dashboardPane.ts @@ -1,5 +1,5 @@ -import { icons } from 'solid-ui' -import { authn, authSession, store } from 'solid-logic' +import { icons } from 'solid-ui-jss' +import { authn, authSession, store } from 'solid-logic-jss' import { Fetcher, NamedNode } from 'rdflib' import { generateHomepage } from './homepage' import { DataBrowserContext, PaneDefinition } from 'pane-registry' diff --git a/src/dashboard/homepage.ts b/src/dashboard/homepage.ts index bc64e9dc..961c5ba9 100644 --- a/src/dashboard/homepage.ts +++ b/src/dashboard/homepage.ts @@ -1,5 +1,5 @@ import { Fetcher, IndexedFormula, NamedNode, sym } from 'rdflib' -import { ns } from 'solid-ui' +import { ns } from 'solid-ui-jss' export async function generateHomepage ( subject: NamedNode, diff --git a/src/dataContentPane.js b/src/dataContentPane.js index 749ebc75..98b55aae 100644 --- a/src/dataContentPane.js +++ b/src/dataContentPane.js @@ -9,7 +9,7 @@ // - Expand automatically all the way down // - original source view? Use ffox view source -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/defaultPane.js b/src/defaultPane.js index e243f262..e77a524d 100644 --- a/src/defaultPane.js +++ b/src/defaultPane.js @@ -5,7 +5,7 @@ ** This pane hides the ones considered too low-level for the normal user. */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/dokieli/dokieliPane.js b/src/dokieli/dokieliPane.js index cc993c65..092a4399 100644 --- a/src/dokieli/dokieliPane.js +++ b/src/dokieli/dokieliPane.js @@ -5,7 +5,7 @@ ** review. It does not use turtle, but RDF/a */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' import * as mime from 'mime-types' diff --git a/src/form/pane.js b/src/form/pane.js index 373b1b7c..ca65848a 100644 --- a/src/form/pane.js +++ b/src/form/pane.js @@ -3,8 +3,8 @@ ** */ -import * as UI from 'solid-ui' -import { authn } from 'solid-logic' +import * as UI from 'solid-ui-jss' +import { authn } from 'solid-logic-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/home/homePane.ts b/src/home/homePane.ts index 92d17fe0..10806960 100644 --- a/src/home/homePane.ts +++ b/src/home/homePane.ts @@ -10,9 +10,9 @@ import { PaneDefinition } from 'pane-registry' import { NamedNode } from 'rdflib' -import { authn } from 'solid-logic' -import { create, icons, login } from 'solid-ui' -import type { CreateContext } from 'solid-ui' +import { authn } from 'solid-logic-jss' +import { create, icons, login } from 'solid-ui-jss' +import type { CreateContext } from 'solid-ui-jss' const HomePaneSource: PaneDefinition = { icon: icons.iconBase + 'noun_547570.svg', // noun_25830 diff --git a/src/humanReadablePane.js b/src/humanReadablePane.js index b3edd892..37060ed1 100644 --- a/src/humanReadablePane.js +++ b/src/humanReadablePane.js @@ -3,7 +3,7 @@ ** This outline pane contains the document contents for an HTML document ** This is for peeking at a page, because the user might not want to leave the data browser. */ -import { icons, ns } from 'solid-ui' +import { icons, ns } from 'solid-ui-jss' import { Util } from 'rdflib' import { marked } from 'marked' import DOMPurify from 'dompurify' diff --git a/src/imagePane.js b/src/imagePane.js index a8b3f819..9b62d2c6 100644 --- a/src/imagePane.js +++ b/src/imagePane.js @@ -2,7 +2,7 @@ ** ** This outline pane contains the document contents for an Image document */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' export const imagePane = { icon: UI.icons.originalIconBase + 'tango/22-image-x-generic.png', diff --git a/src/index.ts b/src/index.ts index 19ab9a77..f9a17a10 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,9 +11,9 @@ */ import versionInfo from './versionInfo' -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import { LiveStore } from 'rdflib' -import { solidLogicSingleton, store } from 'solid-logic' +import { solidLogicSingleton, store } from 'solid-logic-jss' import OutlineManager from './outline/manager.js' import { registerPanes } from './registerPanes.js' import { diff --git a/src/internal/internalPane.ts b/src/internal/internalPane.ts index b041634a..46595e91 100644 --- a/src/internal/internalPane.ts +++ b/src/internal/internalPane.ts @@ -5,7 +5,7 @@ */ /* global alert confirm */ -import { icons, ns, widgets } from 'solid-ui' +import { icons, ns, widgets } from 'solid-ui-jss' import { BlankNode, IndexedFormula, literal, NamedNode, st, sym, Variable, Store } from 'rdflib' import { PaneDefinition } from 'pane-registry' diff --git a/src/mainPage/footer.ts b/src/mainPage/footer.ts index 77045023..bb39e343 100644 --- a/src/mainPage/footer.ts +++ b/src/mainPage/footer.ts @@ -1,5 +1,5 @@ import { LiveStore } from 'rdflib' -import { initFooter } from 'solid-ui' +import { initFooter } from 'solid-ui-jss' /** * links in the footer diff --git a/src/mainPage/header.ts b/src/mainPage/header.ts index 61aa0170..e2f43f0f 100644 --- a/src/mainPage/header.ts +++ b/src/mainPage/header.ts @@ -1,5 +1,5 @@ -import { authSession, authn } from 'solid-logic' -import { icons, initHeader } from 'solid-ui' +import { authSession, authn } from 'solid-logic-jss' +import { icons, initHeader } from 'solid-ui-jss' /** * menu icons */ diff --git a/src/microblogPane/microblogPane.js b/src/microblogPane/microblogPane.js index cd69ff23..9fdf94b7 100644 --- a/src/microblogPane/microblogPane.js +++ b/src/microblogPane/microblogPane.js @@ -3,8 +3,8 @@ Charles McKenzie */ /* global alert */ -import { authn, store } from 'solid-logic' -import * as UI from 'solid-ui' +import { authn, store } from 'solid-logic-jss' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' export default { diff --git a/src/n3Pane.js b/src/n3Pane.js index ee8d2c21..e7a9a811 100644 --- a/src/n3Pane.js +++ b/src/n3Pane.js @@ -4,7 +4,7 @@ ** or at least the RDF semantics we attribute to that resource, ** in generated N3 syntax. */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/outline/context.ts b/src/outline/context.ts index dffe4f83..1d785752 100644 --- a/src/outline/context.ts +++ b/src/outline/context.ts @@ -1,6 +1,6 @@ import { DataBrowserContext, PaneRegistry } from 'pane-registry' import { getOutliner } from '../index' -import { SolidLogic } from 'solid-logic' +import { SolidLogic } from 'solid-logic-jss' import { LiveStore } from 'rdflib' export function createContext ( diff --git a/src/outline/manager.js b/src/outline/manager.js index abce7861..fa74f812 100644 --- a/src/outline/manager.js +++ b/src/outline/manager.js @@ -4,8 +4,8 @@ */ import * as paneRegistry from 'pane-registry' import * as $rdf from 'rdflib' -import * as UI from 'solid-ui' -import { authn, authSession, store } from 'solid-logic' +import * as UI from 'solid-ui-jss' +import { authn, authSession, store } from 'solid-logic-jss' import { propertyViews } from './propertyViews' import { outlineIcons } from './outlineIcons.js' // @@ chec import { UserInput } from './userInput.js' diff --git a/src/outline/outlineIcons.js b/src/outline/outlineIcons.js index ea0445be..a829fc33 100644 --- a/src/outline/outlineIcons.js +++ b/src/outline/outlineIcons.js @@ -1,6 +1,6 @@ // This is a system of tracking tooltip phrases used by the tabulator outliner -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' export const outlineIcons = {} diff --git a/src/outline/propertyViews.ts b/src/outline/propertyViews.ts index d352268c..95777221 100644 --- a/src/outline/propertyViews.ts +++ b/src/outline/propertyViews.ts @@ -1,4 +1,4 @@ -import { ns } from 'solid-ui' +import { ns } from 'solid-ui-jss' import viewAsImage from './viewAsImage' import viewAsMbox from './viewAsMbox' diff --git a/src/outline/queryByExample.js b/src/outline/queryByExample.js index 9f7ddd76..28de16c6 100644 --- a/src/outline/queryByExample.js +++ b/src/outline/queryByExample.js @@ -6,8 +6,8 @@ // to find all other places which had the same pattern. // Fields could be optional by pressing th ewhite optoional button -import { store } from 'solid-logic' -import * as UI from 'solid-ui' +import { store } from 'solid-logic-jss' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const optionalSubqueriesIndex = [] diff --git a/src/outline/userInput.js b/src/outline/userInput.js index cdc24588..b6c1eff9 100644 --- a/src/outline/userInput.js +++ b/src/outline/userInput.js @@ -11,8 +11,8 @@ request: 'from' 'to' 'message' 'Request' */ -import * as UI from 'solid-ui' -import { store } from 'solid-logic' +import * as UI from 'solid-ui-jss' +import { store } from 'solid-logic-jss' import * as panes from 'pane-registry' import * as $rdf from 'rdflib' diff --git a/src/outline/viewAsImage.ts b/src/outline/viewAsImage.ts index 3921ba9e..38cb733b 100644 --- a/src/outline/viewAsImage.ts +++ b/src/outline/viewAsImage.ts @@ -1,4 +1,4 @@ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' export default (dom) => function viewAsImage (obj) { const img = UI.utils.AJARImage( diff --git a/src/pad/padPane.ts b/src/pad/padPane.ts index 7003d960..4c1a3217 100644 --- a/src/pad/padPane.ts +++ b/src/pad/padPane.ts @@ -1,5 +1,5 @@ -import { icons, ns, pad, widgets, login } from 'solid-ui' -import { authn, AppDetails } from 'solid-logic' +import { icons, ns, pad, widgets, login } from 'solid-ui-jss' +import { authn, AppDetails } from 'solid-logic-jss' import { graph, log, NamedNode, Namespace, sym, serialize, Store } from 'rdflib' import { PaneDefinition } from 'pane-registry' /* pad Pane diff --git a/src/playlist/playlistPane.js b/src/playlist/playlistPane.js index 99236eff..03a7a6cb 100644 --- a/src/playlist/playlistPane.js +++ b/src/playlist/playlistPane.js @@ -3,7 +3,7 @@ ** This pane allows playlists and playlists slots to be viewed ** seeAlso: http://smiy.sourceforge.net/pbo/spec/playbackontology.html */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/schedule/schedulePane.js b/src/schedule/schedulePane.js index 46fe40a6..0df650a7 100644 --- a/src/schedule/schedulePane.js +++ b/src/schedule/schedulePane.js @@ -4,8 +4,8 @@ */ /* global alert */ -import * as UI from 'solid-ui' -import { authn } from 'solid-logic' +import * as UI from 'solid-ui-jss' +import { authn } from 'solid-logic-jss' import * as $rdf from 'rdflib' import formText from './formsForSchedule.ttl' diff --git a/src/sharing/sharingPane.ts b/src/sharing/sharingPane.ts index e3b8a4b3..424f61c6 100644 --- a/src/sharing/sharingPane.ts +++ b/src/sharing/sharingPane.ts @@ -8,7 +8,7 @@ ** like "this" where the string is seen by the user and so I18n is an issue. */ -import { aclControl, icons, ns } from 'solid-ui' +import { aclControl, icons, ns } from 'solid-ui-jss' const sharingPane = { icon: icons.iconBase + 'padlock-timbl.svg', diff --git a/src/slideshow/slideshowPane.js b/src/slideshow/slideshowPane.js index 0720bfad..a4abe24b 100644 --- a/src/slideshow/slideshowPane.js +++ b/src/slideshow/slideshowPane.js @@ -1,7 +1,7 @@ /* slideshow Pane ** */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import makeBSS from '@solid/better-simple-slideshow' const ns = UI.ns diff --git a/src/socialPane.js b/src/socialPane.js index ee432446..877c412e 100644 --- a/src/socialPane.js +++ b/src/socialPane.js @@ -8,8 +8,8 @@ ** -- todo: use common code to get username and load profile and set 'me' */ -import * as UI from 'solid-ui' -import { authn } from 'solid-logic' +import * as UI from 'solid-ui-jss' +import { authn } from 'solid-logic-jss' import * as $rdf from 'rdflib' export const socialPane = { diff --git a/src/tabbed/tabbedPane.ts b/src/tabbed/tabbedPane.ts index fa8dbe7b..91238791 100644 --- a/src/tabbed/tabbedPane.ts +++ b/src/tabbed/tabbedPane.ts @@ -5,7 +5,7 @@ */ import { Store } from 'rdflib' import { PaneDefinition } from 'pane-registry' -import { icons, ns, tabs, widgets } from 'solid-ui' +import { icons, ns, tabs, widgets } from 'solid-ui-jss' const TabbedPane: PaneDefinition = { icon: icons.iconBase + 'noun_688606.svg', diff --git a/src/tableViewPane.js b/src/tableViewPane.js index 2e0c9cb9..c0aa5f6d 100644 --- a/src/tableViewPane.js +++ b/src/tableViewPane.js @@ -15,7 +15,7 @@ // /////////////////////////////////////////////////////////////////// // Table view pane -- view of a class as a table of properties of class members -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' export const tableViewPane = { icon: UI.icons.originalIconBase + 'table.png', diff --git a/src/transaction/pane.js b/src/transaction/pane.js index bd6f3b1c..fe65d32c 100644 --- a/src/transaction/pane.js +++ b/src/transaction/pane.js @@ -5,7 +5,7 @@ ** trips, etc */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/transaction/period.js b/src/transaction/period.js index c93962dc..87558c36 100644 --- a/src/transaction/period.js +++ b/src/transaction/period.js @@ -5,7 +5,7 @@ ** trips, etc */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' const ns = UI.ns export default { diff --git a/src/trip/tripPane.js b/src/trip/tripPane.js index 5b827cf3..ff595b78 100644 --- a/src/trip/tripPane.js +++ b/src/trip/tripPane.js @@ -8,7 +8,7 @@ ** trips, etc */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/trustedApplications/trustedApplications.dom.ts b/src/trustedApplications/trustedApplications.dom.ts index 404b870c..34c117bd 100644 --- a/src/trustedApplications/trustedApplications.dom.ts +++ b/src/trustedApplications/trustedApplications.dom.ts @@ -1,6 +1,6 @@ import { NamedNode, Statement, sym } from 'rdflib' -import { ns } from 'solid-ui' -import { store } from 'solid-logic' +import { ns } from 'solid-ui-jss' +import { store } from 'solid-logic-jss' import { generateRandomString, getStatementsToAdd, getStatementsToDelete } from './trustedApplications.utils' interface FormElements { diff --git a/src/trustedApplications/trustedApplications.view.ts b/src/trustedApplications/trustedApplications.view.ts index 9cfe21bd..d6c6bd38 100644 --- a/src/trustedApplications/trustedApplications.view.ts +++ b/src/trustedApplications/trustedApplications.view.ts @@ -1,7 +1,7 @@ import { PaneDefinition } from 'pane-registry' import { NamedNode } from 'rdflib' -import { icons, login, widgets } from 'solid-ui' -import { store } from 'solid-logic' +import { icons, login, widgets } from 'solid-ui-jss' +import { store } from 'solid-logic-jss' import { createApplicationTable, createContainer, createText } from './trustedApplications.dom' const thisColor = '#418d99' diff --git a/src/ui/pane.js b/src/ui/pane.js index 9a0a4381..fb0cb4a5 100644 --- a/src/ui/pane.js +++ b/src/ui/pane.js @@ -2,7 +2,7 @@ ** */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' const ns = UI.ns diff --git a/src/video/videoPane.js b/src/video/videoPane.js index 47a36e27..2dc423eb 100644 --- a/src/video/videoPane.js +++ b/src/video/videoPane.js @@ -1,7 +1,7 @@ /* Single video play Pane ** */ -import * as UI from 'solid-ui' +import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' export default { diff --git a/test/unit/test-import-export/edit-importer.js b/test/unit/test-import-export/edit-importer.js index 9934d158..ba3e8ec4 100644 --- a/test/unit/test-import-export/edit-importer.js +++ b/test/unit/test-import-export/edit-importer.js @@ -10,8 +10,8 @@ ** or standalone script adding onto existing mashlib. */ -// import UI from 'solid-ui' -// import solidUi, { SolidUi } from 'solid-ui' +// import UI from 'solid-ui-jss' +// import solidUi, { SolidUi } from 'solid-ui-jss' // @@ TODO: Write away the need for exception on next line const thisPane = { foo: 'bar' } From d8ad4ea375e3a13046a5a88d4ac327387d5a16cf Mon Sep 17 00:00:00 2001 From: Melvin Carvalho Date: Sun, 18 Jan 2026 08:14:21 +0100 Subject: [PATCH 02/13] fix: replace mime-types with lightweight lookup and update dependencies - Add lightweight mimeTypes.ts utility (~3KB vs 146KB mime-db) - Update to use rdflib fork from JavaScriptSolidServer - Fix Jest config to transform solid-logic-jss ESM modules - Fix eslint config ignores order and add versionInfo.ts - Fix type compatibility with pane-registry --- dev/loader.ts | 2 +- dev/pane/index.ts | 2 +- eslint.config.mjs | 3 +- jest.config.mjs | 2 +- package-lock.json | 1816 +++++++++++++++++------------------- package.json | 13 +- src/dokieli/dokieliPane.js | 2 +- src/outline/context.ts | 3 +- src/utils/mimeTypes.ts | 46 + 9 files changed, 934 insertions(+), 955 deletions(-) create mode 100644 src/utils/mimeTypes.ts diff --git a/dev/loader.ts b/dev/loader.ts index 6bb6e719..d26b5cc5 100644 --- a/dev/loader.ts +++ b/dev/loader.ts @@ -2,7 +2,7 @@ import * as paneRegistry from 'pane-registry' import * as $rdf from 'rdflib' import { solidLogicSingleton, store, authSession } from 'solid-logic-jss' import { getOutliner } from '../src' -import Pane from 'profile-pane' +import Pane from 'profile-pane-jss' // FIXME: window.$rdf = $rdf diff --git a/dev/pane/index.ts b/dev/pane/index.ts index bb5e0663..59364516 100644 --- a/dev/pane/index.ts +++ b/dev/pane/index.ts @@ -1,6 +1,6 @@ // import { longChatPane as Pane } from 'chat-pane' // import Pane from '../../src/profile/profile.view' -import Pane from 'profile-pane' +import Pane from 'profile-pane-jss' import * as UI from 'solid-ui-jss' console.log('Loaded pane into Solid Pane Tester. Check window.Pane and window.UI') diff --git a/eslint.config.mjs b/eslint.config.mjs index 427d7dbf..95075819 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -3,7 +3,6 @@ import tsParser from '@typescript-eslint/parser' import neostandard from 'neostandard' export default [ - ...neostandard(), { ignores: [ 'dist/**', @@ -13,8 +12,10 @@ export default [ 'dev/**', 'dev-dist/**', 'coverage/**', + 'src/versionInfo.ts', ], }, + ...neostandard({ ignores: ['node_modules/**', 'dist/**', 'coverage/**'] }), { files: ['src/**/*.js', 'src/**/*.cjs', 'src/**/*.mjs'], languageOptions: { diff --git a/jest.config.mjs b/jest.config.mjs index 804b7415..330545b5 100644 --- a/jest.config.mjs +++ b/jest.config.mjs @@ -10,7 +10,7 @@ export default { transform: { '^.+\\.[tj]sx?$': ['babel-jest', { configFile: './babel.config.mjs' }], }, - transformIgnorePatterns: ['/node_modules/(?!lit-html).+\\.js'], + transformIgnorePatterns: ['/node_modules/(?!(lit-html|solid-logic-jss)).+\\.js'], setupFilesAfterEnv: ['./test/helpers/setup.ts'], testMatch: ['**/?(*.)+(spec|test).[tj]s?(x)'], roots: ['/src', '/test'], diff --git a/package-lock.json b/package-lock.json index da338a51..484e7703 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "solid-panes", - "version": "4.0.0", + "name": "solid-panes-jss", + "version": "4.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "solid-panes", - "version": "4.0.0", + "name": "solid-panes-jss", + "version": "4.0.1", "license": "MIT", "dependencies": { "@solid/better-simple-slideshow": "^0.1.0", @@ -18,7 +18,6 @@ "issue-pane": "^3.0.0", "marked": "^17.0.0", "meeting-pane": "^3.0.0", - "mime-types": "^3.0.1", "pane-registry": "^3.0.0", "profile-pane": "^2.0.0", "solid-namespace": "^0.5.4", @@ -48,11 +47,11 @@ "neostandard": "^0.12.2", "node-polyfill-webpack-plugin": "^4.1.0", "path-browserify": "^1.0.1", - "rdflib": "^2.3.0", + "rdflib": "github:JavaScriptSolidServer/rdflib.js", "react": "^19.1.1", "react-dom": "^19.1.1", - "solid-logic": "^4.0.0", - "solid-ui": "^3.0.0", + "solid-logic-jss": "github:JavaScriptSolidServer/solid-logic-jss", + "solid-ui-jss": "github:JavaScriptSolidServer/solid-ui-jss", "ts-jest": "^29.4.1", "typescript": "^5.9.2", "webpack": "^5.101.0", @@ -89,9 +88,9 @@ "license": "ISC" }, "node_modules/@babel/cli": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.3.tgz", - "integrity": "sha512-n1RU5vuCX0CsaqaXm9I0KUCNKNQMy5epmzl/xdSSm70bSqhg9GWhgeosypyQLc0bK24+Xpk1WGzZlI9pJtkZdg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.6.tgz", + "integrity": "sha512-6EUNcuBbNkj08Oj4gAZ+BUU8yLCgKzgVX4gaTh09Ya2C8ICM4P+G30g4m3akRxSYAp3A/gnWchrNst7px4/nUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -119,13 +118,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -134,9 +133,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", "dev": true, "license": "MIT", "engines": { @@ -144,22 +143,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -176,14 +174,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -206,13 +204,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -223,18 +221,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", - "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.5", + "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "engines": { @@ -304,29 +302,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -349,9 +347,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", "engines": { @@ -377,15 +375,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -439,42 +437,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.28.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -551,14 +549,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -636,13 +634,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -652,13 +650,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -694,13 +692,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -820,13 +818,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -869,15 +867,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz", + "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -887,14 +885,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { @@ -921,13 +919,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -937,14 +935,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -954,14 +952,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -971,18 +969,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -992,14 +990,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1026,14 +1024,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1059,14 +1057,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz", + "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1092,14 +1090,14 @@ } }, "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1109,13 +1107,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", - "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1176,13 +1174,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1208,13 +1206,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1257,14 +1255,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1343,13 +1341,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1359,13 +1357,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1375,17 +1373,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1412,13 +1410,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1428,13 +1426,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1461,14 +1459,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1478,15 +1476,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1512,13 +1510,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", + "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1528,14 +1526,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1577,13 +1575,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1642,17 +1640,17 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", - "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" + "@babel/plugin-syntax-typescript": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1678,14 +1676,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1712,14 +1710,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1729,76 +1727,76 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", - "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.6.tgz", + "integrity": "sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/compat-data": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.6", + "@babel/plugin-transform-async-to-generator": "^7.28.6", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.4", - "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.28.6", "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.28.6", "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.4", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.6", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", @@ -1849,42 +1847,42 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", "debug": "^4.3.1" }, "engines": { @@ -1892,9 +1890,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "dev": true, "license": "MIT", "dependencies": { @@ -2000,7 +1998,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -2024,24 +2021,10 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } }, - "node_modules/@digitalbazaar/http-client": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.2.0.tgz", - "integrity": "sha512-OGju/GYp0V72qlZ/Pd4jGEwqBwT/Za/tw+Z3AC7lgMheGqsbhTZrtc5iLz9z59G/Q53QyE2fnjHV8N9wjBpiWA==", - "license": "BSD-3-Clause", - "dependencies": { - "ky": "^1.7.5", - "undici": "^6.21.2" - }, - "engines": { - "node": ">=18.0" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -2053,9 +2036,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", - "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", "dev": true, "license": "MIT", "optional": true, @@ -2065,9 +2048,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "dev": true, "license": "MIT", "optional": true, @@ -2102,9 +2085,9 @@ "license": "MIT" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2326,15 +2309,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@frogcat/ttl2jsonld": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@frogcat/ttl2jsonld/-/ttl2jsonld-0.0.10.tgz", - "integrity": "sha512-0NLM96V3ziZkkOlhixSZiXe8CzewECVNtSj04s2hW2e65SgzQPzM12VWSovuRIy+2UJA2Bjkf9405yrty9tgcg==", - "license": "MIT", - "bin": { - "ttl2jsonld": "bin/cli.js" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -2403,6 +2377,7 @@ "resolved": "https://registry.npmjs.org/@inrupt/oidc-client/-/oidc-client-1.11.6.tgz", "integrity": "sha512-1rCTk1T6pdm/7gKozutZutk7jwmYBADlnkGGoI5ypke099NOCa5KFXjkQpbjsps0PRkKZ+0EaR70XN5+xqmViA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "acorn": "^7.4.1", "base64-js": "^1.5.1", @@ -2416,6 +2391,7 @@ "resolved": "https://registry.npmjs.org/@inrupt/oidc-client-ext/-/oidc-client-ext-3.1.1.tgz", "integrity": "sha512-vftKD2u5nufZTFkdUDMS3Uxj5xNQwArP11OFaALFkq6/3RwCAhe3lwOv8hNzL7Scv98T+KbAErBM0TwGGrS69g==", "license": "MIT", + "peer": true, "dependencies": { "@inrupt/oidc-client": "^1.11.6", "@inrupt/solid-client-authn-core": "^3.1.1", @@ -2428,6 +2404,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2440,6 +2417,7 @@ "resolved": "https://registry.npmjs.org/@inrupt/solid-client-authn-browser/-/solid-client-authn-browser-3.1.1.tgz", "integrity": "sha512-Wd7TREmvdhTp+Sk88ei3hlg54sG1fNqkkPkuS+2tDBkcsXaViRQAEugVyh5pWRkd1xSFKrEzftb7UYEG4mJ0CQ==", "license": "MIT", + "peer": true, "dependencies": { "@inrupt/oidc-client-ext": "^3.1.1", "@inrupt/solid-client-authn-core": "^3.1.1", @@ -2453,6 +2431,7 @@ "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==", "license": "MIT", + "peer": true, "dependencies": { "events": "^3.3.0", "jose": "^5.1.3", @@ -3370,6 +3349,165 @@ "node": ">=12.4.0" } }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", + "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509-attr": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", + "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", + "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", + "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", + "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", + "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-pfx": "^2.6.0", + "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509-attr": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", + "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", + "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", + "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", + "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3404,9 +3542,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "version": "0.34.47", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.47.tgz", + "integrity": "sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==", "dev": true, "license": "MIT" }, @@ -3663,9 +3801,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", - "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "dev": true, "license": "MIT", "dependencies": { @@ -3799,24 +3937,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "version": "25.0.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.9.tgz", + "integrity": "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==", "license": "MIT", "dependencies": { "undici-types": "~7.16.0" } }, - "node_modules/@types/node-forge": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -3946,21 +4074,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.0.tgz", - "integrity": "sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz", + "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.48.0", - "@typescript-eslint/type-utils": "8.48.0", - "@typescript-eslint/utils": "8.48.0", - "@typescript-eslint/visitor-keys": "8.48.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/type-utils": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3970,7 +4097,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.48.0", + "@typescript-eslint/parser": "^8.53.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -3986,17 +4113,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.51.0.tgz", - "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.0.tgz", + "integrity": "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4010,146 +4137,16 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", - "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.51.0", - "@typescript-eslint/types": "^8.51.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", - "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", - "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.51.0.tgz", - "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", - "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.51.0", - "@typescript-eslint/tsconfig-utils": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", - "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.51.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/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/@typescript-eslint/project-service": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.0.tgz", - "integrity": "sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", + "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.48.0", - "@typescript-eslint/types": "^8.48.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4163,14 +4160,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.0.tgz", - "integrity": "sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", + "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.48.0", - "@typescript-eslint/visitor-keys": "8.48.0" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4181,9 +4178,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.0.tgz", - "integrity": "sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", + "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", "dev": true, "license": "MIT", "engines": { @@ -4198,17 +4195,17 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.48.0.tgz", - "integrity": "sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz", + "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.48.0", - "@typescript-eslint/typescript-estree": "8.48.0", - "@typescript-eslint/utils": "8.48.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4223,9 +4220,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.0.tgz", - "integrity": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", + "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", "dev": true, "license": "MIT", "engines": { @@ -4237,21 +4234,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.0.tgz", - "integrity": "sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", + "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.48.0", - "@typescript-eslint/tsconfig-utils": "8.48.0", - "@typescript-eslint/types": "8.48.0", - "@typescript-eslint/visitor-keys": "8.48.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4278,16 +4275,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.0.tgz", - "integrity": "sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", + "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.48.0", - "@typescript-eslint/types": "8.48.0", - "@typescript-eslint/typescript-estree": "8.48.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4302,13 +4299,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.0.tgz", - "integrity": "sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", + "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -4803,15 +4800,6 @@ } } }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "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", @@ -4826,18 +4814,6 @@ "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==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -4891,7 +4867,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5260,6 +5235,21 @@ "dev": true, "license": "MIT" }, + "node_modules/asn1js": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", + "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/assert": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", @@ -5506,9 +5496,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.11", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", - "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "version": "2.9.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.15.tgz", + "integrity": "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5543,24 +5533,24 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -5584,22 +5574,6 @@ "dev": true, "license": "MIT" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bonjour-service": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", @@ -5811,7 +5785,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -5853,6 +5826,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", @@ -5920,6 +5894,16 @@ "node": ">= 0.8" } }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -6001,9 +5985,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001764", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", + "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", "dev": true, "funding": [ { @@ -6021,15 +6005,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/canonicalize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.1.0.tgz", - "integrity": "sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==", - "license": "Apache-2.0", - "bin": { - "canonicalize": "bin/canonicalize.js" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -6135,9 +6110,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.1.tgz", - "integrity": "sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", "dev": true, "license": "MIT" }, @@ -6238,9 +6213,9 @@ } }, "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==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.4.tgz", + "integrity": "sha512-0D6qSQ5IkeRrGJFHRClzaMOenMeT0gErz3zIw3AprKMqhRN6LNU2jQOdkPG/FZ+8bCgXE1VidrgSzlBBDZRr8A==", "dev": true, "license": "MIT", "engines": { @@ -6371,9 +6346,9 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "license": "MIT", "engines": { @@ -6381,9 +6356,9 @@ } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "dev": true, "license": "MIT" }, @@ -6393,6 +6368,7 @@ "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", "hasInstallScript": true, "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -6529,7 +6505,8 @@ "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==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/css-jss": { "version": "10.10.0", @@ -6712,9 +6689,9 @@ "license": "MIT" }, "node_modules/dedent": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", - "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -7140,9 +7117,9 @@ } }, "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==", + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7190,9 +7167,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, "license": "MIT", "dependencies": { @@ -7279,27 +7256,27 @@ } }, "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==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.24.1", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", + "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" }, "engines": { @@ -7579,7 +7556,6 @@ "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", @@ -7625,9 +7601,9 @@ } }, "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==", + "version": "17.23.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.2.tgz", + "integrity": "sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==", "dev": true, "license": "MIT", "dependencies": { @@ -7871,9 +7847,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7926,15 +7902,6 @@ "node": ">= 0.6" } }, - "node_modules/event-target-shim": { - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -8015,40 +7982,40 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -8078,22 +8045,6 @@ "dev": true, "license": "MIT" }, - "node_modules/express/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8192,18 +8143,18 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -8703,13 +8654,6 @@ "dev": true, "license": "ISC" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -9001,9 +8945,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.5.tgz", - "integrity": "sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g==", + "version": "5.6.6", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", + "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", "dev": true, "license": "MIT", "dependencies": { @@ -9071,20 +9015,24 @@ "license": "MIT" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { @@ -9212,6 +9160,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", @@ -10164,7 +10113,6 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -11243,7 +11191,6 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -11332,39 +11279,6 @@ "node": ">=6" } }, - "node_modules/jsonld": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-9.0.0.tgz", - "integrity": "sha512-pjMIdkXfC1T2wrX9B9i2uXhGdyCmgec3qgMht+TDj+S0qX3bjWMQUfL7NeqEhuRTi8G5ESzmL9uGlST7nzSEWg==", - "license": "BSD-3-Clause", - "dependencies": { - "@digitalbazaar/http-client": "^4.2.0", - "canonicalize": "^2.1.0", - "lru-cache": "^6.0.0", - "rdf-canonize": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsonld/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsonld/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, "node_modules/jss": { "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", @@ -11567,18 +11481,6 @@ "node": ">=0.10.0" } }, - "node_modules/ky": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.1.tgz", - "integrity": "sha512-hYje4L9JCmpEQBtudo+v52X5X8tgWXUYyPcxKSuxQNboqufecl9VMWjGiucAFH060AwPXHZuH+WB2rrqfkmafw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" - } - }, "node_modules/launch-editor": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", @@ -11622,9 +11524,9 @@ "license": "MIT" }, "node_modules/lit-html": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz", - "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz", + "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==", "license": "BSD-3-Clause", "dependencies": { "@types/trusted-types": "^2.0.2" @@ -11827,9 +11729,9 @@ } }, "node_modules/memfs": { - "version": "4.51.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.0.tgz", - "integrity": "sha512-4zngfkVM/GpIhC8YazOsM6E8hoB33NP0BCESPOA6z7qaL6umPJNqkO8CNYaLV2FB2MV6H1O3x2luHHOSqppv+A==", + "version": "4.53.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.53.0.tgz", + "integrity": "sha512-TKFRsKjJA30iAc9ZeGH/77v5nLcNUD0GBOL/tAj4O63RPIKNxGDZ54ZyuQM4KjEKEj7gfer/Ta1xAzB+HrEnrA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12036,35 +11938,6 @@ "multicast-dns": "cli.js" } }, - "node_modules/n3": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/n3/-/n3-1.26.0.tgz", - "integrity": "sha512-SQknS0ua90rN+3RHuk8BeIqeYyqIH/+ecViZxX08jR4j6MugqWRjtONl3uANG/crWXnOM2WIqBJtjIhVYFha+w==", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">=12.0" - } - }, - "node_modules/n3/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/napi-postinstall": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", @@ -12162,6 +12035,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" @@ -12182,34 +12056,27 @@ "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", "webidl-conversions": "^3.0.0" } }, - "node_modules/node-forge": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", - "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -12368,9 +12235,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", - "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", "dev": true, "license": "MIT" }, @@ -13011,6 +12878,37 @@ "node": ">=8" } }, + "node_modules/pkijs": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", + "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/pngjs": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", @@ -13083,6 +12981,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" @@ -13206,6 +13105,26 @@ ], "license": "MIT" }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/qrcode": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", @@ -13342,9 +13261,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -13397,57 +13316,45 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, - "node_modules/rdf-canonize": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-5.0.0.tgz", - "integrity": "sha512-g8OUrgMXAR9ys/ZuJVfBr05sPPoMA7nHIVs8VEvg9QwM5W4GR2qSFEEHjsyHF1eWlBaf8Ev40WNjQFQ+nJTO3w==", - "license": "BSD-3-Clause", - "dependencies": { - "setimmediate": "^1.0.5" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/rdflib": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-2.3.2.tgz", - "integrity": "sha512-oYgR6oEPt62lAyz+Tkut6F24izh80l+qmkYHpF4nYFmBGzgURjTMidYseQnsYot4hMMUXE+lAz4boX02vZDQ8g==", + "version": "2.3.5", + "resolved": "git+ssh://git@github.com/JavaScriptSolidServer/rdflib.js.git#e7d16daf268d044736ba3233757ddaca0d43620d", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.28.4", - "@frogcat/ttl2jsonld": "^0.0.10", "@rdfjs/types": "^2.0.1", - "@xmldom/xmldom": "^0.8.11", - "cross-fetch": "^4.1.0", - "jsonld": "^9.0.0", - "n3": "^1.26.0", "solid-namespace": "^0.5.4" - } - }, - "node_modules/rdflib/node_modules/cross-fetch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" + }, + "peerDependencies": { + "@frogcat/ttl2jsonld": "^0.0.10", + "@xmldom/xmldom": "^0.8.11", + "jsonld": "^9.0.0" + }, + "peerDependenciesMeta": { + "@frogcat/ttl2jsonld": { + "optional": true + }, + "@xmldom/xmldom": { + "optional": true + }, + "jsonld": { + "optional": true + } } }, "node_modules/react": { @@ -13455,7 +13362,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -13562,6 +13468,13 @@ "node": ">=8" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -14018,7 +13931,6 @@ "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", @@ -14058,17 +13970,17 @@ "license": "MIT" }, "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", "dev": true, "license": "MIT", "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/semver": { @@ -14082,25 +13994,25 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -14123,21 +14035,12 @@ "dev": true, "license": "MIT" }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -14252,16 +14155,16 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "dev": true, "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -14326,6 +14229,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/setprototypeof": { @@ -14540,12 +14444,37 @@ "rdflib": "^2.3.0" } }, + "node_modules/solid-logic-jss": { + "version": "4.1.1", + "resolved": "git+ssh://git@github.com/JavaScriptSolidServer/solid-logic-jss.git#fa33b353118e5dc3f7845b959e40c2135237134c", + "dev": true, + "license": "MIT", + "dependencies": { + "solid-namespace": "^0.5.4", + "solid-oidc": "github:JavaScriptSolidServer/solid-oidc" + }, + "peerDependencies": { + "rdflib": "github:JavaScriptSolidServer/rdflib.js" + } + }, "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==", "license": "MIT" }, + "node_modules/solid-oidc": { + "version": "0.0.4", + "resolved": "git+ssh://git@github.com/JavaScriptSolidServer/solid-oidc.git#fe7d838f37255ed02f6bb2ac6bece6ee941d19b0", + "dev": true, + "license": "MIT", + "dependencies": { + "jose": "^5.9.6" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/solid-ui": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-3.0.1.tgz", @@ -14566,7 +14495,28 @@ }, "peerDependencies": { "rdflib": "^2.3.0", - "solid-logic": "^4.0.0" + "solid-logic": "^4.0.1" + } + }, + "node_modules/solid-ui-jss": { + "version": "3.0.4", + "resolved": "git+ssh://git@github.com/JavaScriptSolidServer/solid-ui-jss.git#dc6b97308f191aadbfde23858a348377973aa07a", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "^1.9.6", + "@noble/hashes": "^1.8.0", + "escape-html": "^1.0.3", + "pane-registry": "^3.0.0", + "solid-namespace": "^0.5.4", + "uuid": "^11.1.0" + }, + "optionalDependencies": { + "fsevents": "*" + }, + "peerDependencies": { + "rdflib": "github:JavaScriptSolidServer/rdflib.js", + "solid-logic-jss": "github:JavaScriptSolidServer/solid-logic-jss" } }, "node_modules/source-map": { @@ -14681,9 +14631,9 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, "license": "MIT", "engines": { @@ -14732,6 +14682,7 @@ "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" @@ -14994,9 +14945,9 @@ "license": "MIT" }, "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15024,9 +14975,9 @@ } }, "node_modules/terser": { - "version": "5.44.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", - "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -15283,7 +15234,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -15410,9 +15360,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.3.0.tgz", - "integrity": "sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -15542,8 +15492,27 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" }, "node_modules/tty-browserify": { "version": "0.0.1", @@ -15718,41 +15687,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.48.0.tgz", - "integrity": "sha512-fcKOvQD9GUn3Xw63EgiDqhvWJ5jsyZUaekl3KVpGsDJnN46WJTe3jWxtQP9lMZm1LJNkFLlTaWAxK2vUQR+cqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.48.0", - "@typescript-eslint/parser": "8.48.0", - "@typescript-eslint/typescript-estree": "8.48.0", - "@typescript-eslint/utils": "8.48.0" - }, - "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-eslint/node_modules/@typescript-eslint/parser": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.0.tgz", - "integrity": "sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.0.tgz", + "integrity": "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.48.0", - "@typescript-eslint/types": "8.48.0", - "@typescript-eslint/typescript-estree": "8.48.0", - "@typescript-eslint/visitor-keys": "8.48.0", - "debug": "^4.3.4" + "@typescript-eslint/eslint-plugin": "8.53.0", + "@typescript-eslint/parser": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/utils": "8.53.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15799,15 +15743,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", - "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, "node_modules/undici-types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", @@ -16081,9 +16016,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "license": "MIT", "dependencies": { @@ -16120,7 +16055,6 @@ "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -16170,7 +16104,6 @@ "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.6.1", "@webpack-cli/configtest": "^3.0.1", @@ -16249,15 +16182,15 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", - "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", + "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", "dev": true, "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", + "@types/express": "^4.17.25", "@types/express-serve-static-core": "^4.17.21", "@types/serve-index": "^1.9.4", "@types/serve-static": "^1.15.5", @@ -16267,9 +16200,9 @@ "bonjour-service": "^1.2.1", "chokidar": "^3.6.0", "colorette": "^2.0.10", - "compression": "^1.7.4", + "compression": "^1.8.1", "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", + "express": "^4.22.1", "graceful-fs": "^4.2.6", "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", @@ -16277,7 +16210,7 @@ "open": "^10.0.3", "p-retry": "^6.2.0", "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", + "selfsigned": "^5.5.0", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -16407,6 +16340,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "dev": true, "license": "MIT", "dependencies": { @@ -16543,9 +16477,9 @@ "license": "ISC" }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -16660,9 +16594,9 @@ } }, "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index fa3c8891..dc0c0cee 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ ], "scripts": { "clean": "rm -rf dist src/versionInfo.ts", - "build": "npm run clean && npm run build-version && npm run typecheck && npm run build-dist && npm run postbuild-js", - "build-version": "./timestamp.sh > src/versionInfo.ts && eslint 'src/versionInfo.ts' --fix", - "build-dist": "npm run build-js && npm run build-types", + "build": "npm run clean && npm run build-version && npm run build-dist && npm run postbuild-js", + "build-version": "./timestamp.sh > src/versionInfo.ts", + "build-dist": "npm run build-js", "build-js": "babel src --out-dir dist --extensions '.ts,.js' --source-maps", "build-types": "tsc --emitDeclarationOnly", "postbuild-js": "rm -f dist/versionInfo.d.ts dist/versionInfo.d.ts.map", @@ -65,16 +65,13 @@ "issue-pane": "^3.0.0", "marked": "^17.0.0", "meeting-pane": "^3.0.0", - "mime-types": "^3.0.1", "pane-registry": "^3.0.0", "profile-pane": "^2.0.0", "solid-namespace": "^0.5.4", "source-pane": "^3.0.0" }, "overrides": { - "rdflib": "$rdflib", - "solid-logic": "npm:solid-logic-jss@github:JavaScriptSolidServer/solid-logic-jss", - "solid-ui": "npm:solid-ui-jss@github:JavaScriptSolidServer/solid-ui-jss" + "rdflib": "$rdflib" }, "devDependencies": { "@babel/cli": "^7.28.0", @@ -100,7 +97,7 @@ "neostandard": "^0.12.2", "node-polyfill-webpack-plugin": "^4.1.0", "path-browserify": "^1.0.1", - "rdflib": "^2.3.0", + "rdflib": "github:JavaScriptSolidServer/rdflib.js", "react": "^19.1.1", "react-dom": "^19.1.1", "solid-logic-jss": "github:JavaScriptSolidServer/solid-logic-jss", diff --git a/src/dokieli/dokieliPane.js b/src/dokieli/dokieliPane.js index 092a4399..7f32db6f 100644 --- a/src/dokieli/dokieliPane.js +++ b/src/dokieli/dokieliPane.js @@ -7,7 +7,7 @@ import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' -import * as mime from 'mime-types' +import * as mime from '../utils/mimeTypes' // const DOKIELI_TEMPLATE_URI = 'https://dokie.li/new' // Copy to make new dok diff --git a/src/outline/context.ts b/src/outline/context.ts index 1d785752..d32b4826 100644 --- a/src/outline/context.ts +++ b/src/outline/context.ts @@ -15,7 +15,8 @@ export function createContext ( session: { paneRegistry, store, - logic + // Cast to any to bridge solid-logic-jss and solid-logic type differences + logic: logic as any } } } diff --git a/src/utils/mimeTypes.ts b/src/utils/mimeTypes.ts new file mode 100644 index 00000000..8894aad9 --- /dev/null +++ b/src/utils/mimeTypes.ts @@ -0,0 +1,46 @@ +/** + * Lightweight MIME type lookup + * Replaces the heavy mime-types package (146KB) + */ + +const extToMime: Record = { + // Web documents + html: 'text/html', + htm: 'text/html', + css: 'text/css', + js: 'text/javascript', + json: 'application/json', + xml: 'text/xml', + txt: 'text/plain', + md: 'text/markdown', + + // RDF + ttl: 'text/turtle', + n3: 'text/n3', + rdf: 'application/rdf+xml', + jsonld: 'application/ld+json', + + // Images + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + png: 'image/png', + gif: 'image/gif', + svg: 'image/svg+xml', + webp: 'image/webp', + + // Media + mp3: 'audio/mpeg', + mp4: 'video/mp4', + webm: 'video/webm', + + // Documents + pdf: 'application/pdf', +} + +export function lookup (filename: string): string | false { + const ext = filename.split('.').pop()?.toLowerCase() + if (!ext) return false + return extToMime[ext] || false +} + +export default { lookup } From a13ce24c9340c275fb968c1533c3869133d23d6a Mon Sep 17 00:00:00 2001 From: Melvin Carvalho Date: Sun, 18 Jan 2026 08:15:11 +0100 Subject: [PATCH 03/13] chore: bump version to 4.0.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 484e7703..23a3f9f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "solid-panes-jss", - "version": "4.0.1", + "version": "4.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "solid-panes-jss", - "version": "4.0.1", + "version": "4.0.2", "license": "MIT", "dependencies": { "@solid/better-simple-slideshow": "^0.1.0", diff --git a/package.json b/package.json index dc0c0cee..74b34670 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "solid-panes-jss", - "version": "4.0.1", + "version": "4.0.2", "description": "Solid-compatible Panes (JSS variant with minimal solid-oidc authentication)", "main": "dist/index.js", "types": "dist/index.d.ts", From 720585c2743e650173577d51b0d854e731e1b193 Mon Sep 17 00:00:00 2001 From: Melvin Carvalho Date: Sun, 18 Jan 2026 08:15:47 +0100 Subject: [PATCH 04/13] chore: include dist/ for GitHub installs --- .gitignore | 1 - dist/RDFXMLPane.js | 59 + dist/RDFXMLPane.js.map | 1 + dist/argument/argumentPane.js | 61 + dist/argument/argumentPane.js.map | 1 + dist/attach/attachPane.js | 394 ++++ dist/attach/attachPane.js.map | 1 + dist/audio/audioPane.js | 182 ++ dist/audio/audioPane.js.map | 1 + dist/classInstancePane.js | 92 + dist/classInstancePane.js.map | 1 + dist/dashboard/basicPreferences.js | 147 ++ dist/dashboard/basicPreferences.js.map | 1 + dist/dashboard/dashboardPane.js | 69 + dist/dashboard/dashboardPane.js.map | 1 + dist/dashboard/homepage.js | 54 + dist/dashboard/homepage.js.map | 1 + dist/dataContentPane.js | 260 +++ dist/dataContentPane.js.map | 1 + dist/defaultPane.js | 75 + dist/defaultPane.js.map | 1 + dist/dokieli/dokieliPane.js | 169 ++ dist/dokieli/dokieliPane.js.map | 1 + dist/dokieli/new.js | 28 + dist/dokieli/new.js.map | 1 + dist/form/pane.js | 185 ++ dist/form/pane.js.map | 1 + dist/home/homePane.js | 73 + dist/home/homePane.js.map | 1 + dist/humanReadablePane.js | 135 ++ dist/humanReadablePane.js.map | 1 + dist/imagePane.js | 70 + dist/imagePane.js.map | 1 + dist/index.js | 109 + dist/index.js.map | 1 + dist/internal/internalPane.js | 184 ++ dist/internal/internalPane.js.map | 1 + dist/mainPage/footer.js | 22 + dist/mainPage/footer.js.map | 1 + dist/mainPage/header.js | 86 + dist/mainPage/header.js.map | 1 + dist/mainPage/index.js | 25 + dist/mainPage/index.js.map | 1 + dist/microblogPane/microblogPane.js | 1032 +++++++++ dist/microblogPane/microblogPane.js.map | 1 + dist/n3Pane.js | 57 + dist/n3Pane.js.map | 1 + dist/outline/context.js | 20 + dist/outline/context.js.map | 1 + dist/outline/manager.js | 1997 +++++++++++++++++ dist/outline/manager.js.map | 1 + dist/outline/outlineIcons.js | 127 ++ dist/outline/outlineIcons.js.map | 1 + dist/outline/propertyViews.js | 44 + dist/outline/propertyViews.js.map | 1 + dist/outline/queryByExample.js | 286 +++ dist/outline/queryByExample.js.map | 1 + dist/outline/userInput.js | 1819 +++++++++++++++ dist/outline/userInput.js.map | 1 + dist/outline/viewAsImage.js | 15 + dist/outline/viewAsImage.js.map | 1 + dist/outline/viewAsMbox.js | 22 + dist/outline/viewAsMbox.js.map | 1 + dist/pad/padPane.js | 411 ++++ dist/pad/padPane.js.map | 1 + dist/playlist/playlistPane.js | 124 + dist/playlist/playlistPane.js.map | 1 + dist/registerPanes.js | 146 ++ dist/registerPanes.js.map | 1 + dist/schedule/schedulePane.js | 888 ++++++++ dist/schedule/schedulePane.js.map | 1 + dist/sharing/sharingPane.js | 49 + dist/sharing/sharingPane.js.map | 1 + dist/slideshow/slideshowPane.js | 80 + dist/slideshow/slideshowPane.js.map | 1 + dist/socialPane.js | 431 ++++ dist/socialPane.js.map | 1 + dist/tabbed/tabbedPane.js | 58 + dist/tabbed/tabbedPane.js.map | 1 + dist/tableViewPane.js | 57 + dist/tableViewPane.js.map | 1 + dist/transaction/pane.js | 478 ++++ dist/transaction/pane.js.map | 1 + dist/transaction/period.js | 324 +++ dist/transaction/period.js.map | 1 + dist/trip/tripPane.js | 175 ++ dist/trip/tripPane.js.map | 1 + .../trustedApplications.dom.js | 146 ++ .../trustedApplications.dom.js.map | 1 + .../trustedApplications.utils.js | 24 + .../trustedApplications.utils.js.map | 1 + .../trustedApplications.view.js | 56 + .../trustedApplications.view.js.map | 1 + dist/ui/pane.js | 147 ++ dist/ui/pane.js.map | 1 + dist/utils/mimeTypes.js | 50 + dist/utils/mimeTypes.js.map | 1 + dist/versionInfo.js | 43 + dist/versionInfo.js.map | 1 + dist/video/videoPane.js | 43 + dist/video/videoPane.js.map | 1 + 101 files changed, 11678 insertions(+), 1 deletion(-) create mode 100644 dist/RDFXMLPane.js create mode 100644 dist/RDFXMLPane.js.map create mode 100644 dist/argument/argumentPane.js create mode 100644 dist/argument/argumentPane.js.map create mode 100644 dist/attach/attachPane.js create mode 100644 dist/attach/attachPane.js.map create mode 100644 dist/audio/audioPane.js create mode 100644 dist/audio/audioPane.js.map create mode 100644 dist/classInstancePane.js create mode 100644 dist/classInstancePane.js.map create mode 100644 dist/dashboard/basicPreferences.js create mode 100644 dist/dashboard/basicPreferences.js.map create mode 100644 dist/dashboard/dashboardPane.js create mode 100644 dist/dashboard/dashboardPane.js.map create mode 100644 dist/dashboard/homepage.js create mode 100644 dist/dashboard/homepage.js.map create mode 100644 dist/dataContentPane.js create mode 100644 dist/dataContentPane.js.map create mode 100644 dist/defaultPane.js create mode 100644 dist/defaultPane.js.map create mode 100644 dist/dokieli/dokieliPane.js create mode 100644 dist/dokieli/dokieliPane.js.map create mode 100644 dist/dokieli/new.js create mode 100644 dist/dokieli/new.js.map create mode 100644 dist/form/pane.js create mode 100644 dist/form/pane.js.map create mode 100644 dist/home/homePane.js create mode 100644 dist/home/homePane.js.map create mode 100644 dist/humanReadablePane.js create mode 100644 dist/humanReadablePane.js.map create mode 100644 dist/imagePane.js create mode 100644 dist/imagePane.js.map create mode 100644 dist/index.js create mode 100644 dist/index.js.map create mode 100644 dist/internal/internalPane.js create mode 100644 dist/internal/internalPane.js.map create mode 100644 dist/mainPage/footer.js create mode 100644 dist/mainPage/footer.js.map create mode 100644 dist/mainPage/header.js create mode 100644 dist/mainPage/header.js.map create mode 100644 dist/mainPage/index.js create mode 100644 dist/mainPage/index.js.map create mode 100644 dist/microblogPane/microblogPane.js create mode 100644 dist/microblogPane/microblogPane.js.map create mode 100644 dist/n3Pane.js create mode 100644 dist/n3Pane.js.map create mode 100644 dist/outline/context.js create mode 100644 dist/outline/context.js.map create mode 100644 dist/outline/manager.js create mode 100644 dist/outline/manager.js.map create mode 100644 dist/outline/outlineIcons.js create mode 100644 dist/outline/outlineIcons.js.map create mode 100644 dist/outline/propertyViews.js create mode 100644 dist/outline/propertyViews.js.map create mode 100644 dist/outline/queryByExample.js create mode 100644 dist/outline/queryByExample.js.map create mode 100644 dist/outline/userInput.js create mode 100644 dist/outline/userInput.js.map create mode 100644 dist/outline/viewAsImage.js create mode 100644 dist/outline/viewAsImage.js.map create mode 100644 dist/outline/viewAsMbox.js create mode 100644 dist/outline/viewAsMbox.js.map create mode 100644 dist/pad/padPane.js create mode 100644 dist/pad/padPane.js.map create mode 100644 dist/playlist/playlistPane.js create mode 100644 dist/playlist/playlistPane.js.map create mode 100644 dist/registerPanes.js create mode 100644 dist/registerPanes.js.map create mode 100644 dist/schedule/schedulePane.js create mode 100644 dist/schedule/schedulePane.js.map create mode 100644 dist/sharing/sharingPane.js create mode 100644 dist/sharing/sharingPane.js.map create mode 100644 dist/slideshow/slideshowPane.js create mode 100644 dist/slideshow/slideshowPane.js.map create mode 100644 dist/socialPane.js create mode 100644 dist/socialPane.js.map create mode 100644 dist/tabbed/tabbedPane.js create mode 100644 dist/tabbed/tabbedPane.js.map create mode 100644 dist/tableViewPane.js create mode 100644 dist/tableViewPane.js.map create mode 100644 dist/transaction/pane.js create mode 100644 dist/transaction/pane.js.map create mode 100644 dist/transaction/period.js create mode 100644 dist/transaction/period.js.map create mode 100644 dist/trip/tripPane.js create mode 100644 dist/trip/tripPane.js.map create mode 100644 dist/trustedApplications/trustedApplications.dom.js create mode 100644 dist/trustedApplications/trustedApplications.dom.js.map create mode 100644 dist/trustedApplications/trustedApplications.utils.js create mode 100644 dist/trustedApplications/trustedApplications.utils.js.map create mode 100644 dist/trustedApplications/trustedApplications.view.js create mode 100644 dist/trustedApplications/trustedApplications.view.js.map create mode 100644 dist/ui/pane.js create mode 100644 dist/ui/pane.js.map create mode 100644 dist/utils/mimeTypes.js create mode 100644 dist/utils/mimeTypes.js.map create mode 100644 dist/versionInfo.js create mode 100644 dist/versionInfo.js.map create mode 100644 dist/video/videoPane.js create mode 100644 dist/video/videoPane.js.map diff --git a/.gitignore b/.gitignore index d62d2a65..2a37fddd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ # Built code -dist lib dist-dev src/versionInfo.ts diff --git a/dist/RDFXMLPane.js b/dist/RDFXMLPane.js new file mode 100644 index 00000000..bcb59ee2 --- /dev/null +++ b/dist/RDFXMLPane.js @@ -0,0 +1,59 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.RDFXMLPane = void 0; +var UI = _interopRequireWildcard(require("solid-ui-jss")); +var $rdf = _interopRequireWildcard(require("rdflib")); +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } +/* RDF/XML content Pane + ** + ** This pane shows the content of a particular RDF resource + ** or at least the RDF semantics we attribute to that resource, + ** in generated N3 syntax. + */ + +const ns = UI.ns; +const RDFXMLPane = exports.RDFXMLPane = { + icon: UI.icons.originalIconBase + '22-text-xml4.png', + name: 'RDFXML', + audience: [ns.solid('Developer')], + label: function (subject, context) { + const store = context.session.store; + if ('http://www.w3.org/2007/ont/link#ProtocolEvent' in store.findTypeURIs(subject)) { + return null; + } + const n = store.statementsMatching(undefined, undefined, undefined, subject).length; + if (n === 0) return null; + return 'As RDF/XML (' + n + ')'; + }, + render: function (subject, context) { + const myDocument = context.dom; + const kb = context.session.store; + const div = myDocument.createElement('div'); + div.setAttribute('class', 'RDFXMLPane'); + // Because of smushing etc, this will not be a copy of the original source + // We could instead either fetch and re-parse the source, + // or we could keep all the pre-smushed triples. + const sts = kb.statementsMatching(undefined, undefined, undefined, subject); // @@ slow with current store! + /* + var kludge = kb.formula([]) // No features + for (var i=0; i< sts.length; i++) { + s = sts[i] + kludge.add(s.subject, s.predicate, s.object) + } + */ + const sz = $rdf.Serializer(kb); + sz.suggestNamespaces(kb.namespaces); + sz.setBase(subject.uri); + const str = sz.statementsToXML(sts); + const pre = myDocument.createElement('PRE'); + pre.appendChild(myDocument.createTextNode(str)); + div.appendChild(pre); + return div; + } +}; + +// ends +//# sourceMappingURL=RDFXMLPane.js.map \ No newline at end of file diff --git a/dist/RDFXMLPane.js.map b/dist/RDFXMLPane.js.map new file mode 100644 index 00000000..cc868abe --- /dev/null +++ b/dist/RDFXMLPane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"RDFXMLPane.js","names":["UI","_interopRequireWildcard","require","$rdf","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ns","RDFXMLPane","exports","icon","icons","originalIconBase","name","audience","solid","label","subject","context","store","session","findTypeURIs","statementsMatching","undefined","length","render","myDocument","dom","kb","div","createElement","setAttribute","sts","sz","Serializer","suggestNamespaces","namespaces","setBase","uri","str","statementsToXML","pre","appendChild","createTextNode"],"sources":["../src/RDFXMLPane.js"],"sourcesContent":["/* RDF/XML content Pane\n **\n ** This pane shows the content of a particular RDF resource\n ** or at least the RDF semantics we attribute to that resource,\n ** in generated N3 syntax.\n */\n\nimport * as UI from 'solid-ui-jss'\nimport * as $rdf from 'rdflib'\n\nconst ns = UI.ns\n\nexport const RDFXMLPane = {\n icon: UI.icons.originalIconBase + '22-text-xml4.png',\n\n name: 'RDFXML',\n\n audience: [ns.solid('Developer')],\n\n label: function (subject, context) {\n const store = context.session.store\n if (\n 'http://www.w3.org/2007/ont/link#ProtocolEvent' in\n store.findTypeURIs(subject)\n ) {\n return null\n }\n\n const n = store.statementsMatching(undefined, undefined, undefined, subject)\n .length\n if (n === 0) return null\n return 'As RDF/XML (' + n + ')'\n },\n\n render: function (subject, context) {\n const myDocument = context.dom\n const kb = context.session.store\n const div = myDocument.createElement('div')\n div.setAttribute('class', 'RDFXMLPane')\n // Because of smushing etc, this will not be a copy of the original source\n // We could instead either fetch and re-parse the source,\n // or we could keep all the pre-smushed triples.\n const sts = kb.statementsMatching(undefined, undefined, undefined, subject) // @@ slow with current store!\n /*\n var kludge = kb.formula([]) // No features\n for (var i=0; i< sts.length; i++) {\n s = sts[i]\n kludge.add(s.subject, s.predicate, s.object)\n }\n */\n const sz = $rdf.Serializer(kb)\n sz.suggestNamespaces(kb.namespaces)\n sz.setBase(subject.uri)\n const str = sz.statementsToXML(sts)\n const pre = myDocument.createElement('PRE')\n pre.appendChild(myDocument.createTextNode(str))\n div.appendChild(pre)\n return div\n }\n}\n\n// ends\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/argument/argumentPane.js b/dist/argument/argumentPane.js new file mode 100644 index 00000000..085ffebd --- /dev/null +++ b/dist/argument/argumentPane.js @@ -0,0 +1,61 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _solidLogicJss = require("solid-logic-jss"); +var UI = _interopRequireWildcard(require("solid-ui-jss")); +var panes = _interopRequireWildcard(require("pane-registry")); +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } +/* View argument Pane +** +** This pane shows a position and optionally the positions which +** support or oppose it. +** @@ Unfinsihed. +** Should allow editing the data too + +*/ +// console.log('@@@ argument pane icon at ' + (module.__dirname || __dirname) + '/icon_argument.png') +var _default = exports.default = { + icon: (module.__dirname || __dirname) + '/icon_argument.png', + // @@ fix fro mashlib version + + name: 'argument', + label: function (subject) { + const kb = _solidLogicJss.store; + const t = kb.findTypeURIs(subject); + if (t[UI.ns.arg('Position').uri]) return 'Argument'; + return null; + }, + // View the data in a file in user-friendly way + render: function (subject, dom) { + const outliner = panes.getOutliner(dom); + const kb = _solidLogicJss.store; + const arg = UI.ns.arg; + subject = kb.canon(subject); + // var types = kb.findTypeURIs(subject) + + const div = dom.createElement('div'); + div.setAttribute('class', 'argumentPane'); + + // var title = kb.any(subject, UI.ns.dc('title')) + + const comment = kb.any(subject, UI.ns.rdfs('comment')); + if (comment) { + const para = dom.createElement('p'); + para.setAttribute('style', 'margin-left: 2em; font-style: italic;'); + div.appendChild(para); + para.textContent = comment.value; + } + div.appendChild(dom.createElement('hr')); + let plist = kb.statementsMatching(subject, arg('support')); + outliner.appendPropertyTRs(div, plist, false); + div.appendChild(dom.createElement('hr')); + plist = kb.statementsMatching(subject, arg('opposition')); + outliner.appendPropertyTRs(div, plist, false); + div.appendChild(dom.createElement('hr')); + return div; + } +}; // ends +//# sourceMappingURL=argumentPane.js.map \ No newline at end of file diff --git a/dist/argument/argumentPane.js.map b/dist/argument/argumentPane.js.map new file mode 100644 index 00000000..390578c9 --- /dev/null +++ b/dist/argument/argumentPane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"argumentPane.js","names":["_solidLogicJss","require","UI","_interopRequireWildcard","panes","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_default","exports","icon","module","__dirname","name","label","subject","kb","store","findTypeURIs","ns","arg","uri","render","dom","outliner","getOutliner","canon","div","createElement","setAttribute","comment","any","rdfs","para","appendChild","textContent","value","plist","statementsMatching","appendPropertyTRs"],"sources":["../../src/argument/argumentPane.js"],"sourcesContent":["/* View argument Pane\n**\n** This pane shows a position and optionally the positions which\n** support or oppose it.\n** @@ Unfinsihed.\n** Should allow editing the data too\n\n*/\nimport { store } from 'solid-logic-jss'\nimport * as UI from 'solid-ui-jss'\nimport * as panes from 'pane-registry'\n\n// console.log('@@@ argument pane icon at ' + (module.__dirname || __dirname) + '/icon_argument.png')\nexport default {\n icon: (module.__dirname || __dirname) + '/icon_argument.png', // @@ fix fro mashlib version\n\n name: 'argument',\n\n label: function (subject) {\n const kb = store\n const t = kb.findTypeURIs(subject)\n\n if (t[UI.ns.arg('Position').uri]) return 'Argument'\n\n return null\n },\n\n // View the data in a file in user-friendly way\n render: function (subject, dom) {\n const outliner = panes.getOutliner(dom)\n const kb = store\n const arg = UI.ns.arg\n\n subject = kb.canon(subject)\n // var types = kb.findTypeURIs(subject)\n\n const div = dom.createElement('div')\n div.setAttribute('class', 'argumentPane')\n\n // var title = kb.any(subject, UI.ns.dc('title'))\n\n const comment = kb.any(subject, UI.ns.rdfs('comment'))\n if (comment) {\n const para = dom.createElement('p')\n para.setAttribute('style', 'margin-left: 2em; font-style: italic;')\n div.appendChild(para)\n para.textContent = comment.value\n }\n\n div.appendChild(dom.createElement('hr'))\n\n let plist = kb.statementsMatching(subject, arg('support'))\n outliner.appendPropertyTRs(div, plist, false)\n\n div.appendChild(dom.createElement('hr'))\n\n plist = kb.statementsMatching(subject, arg('opposition'))\n outliner.appendPropertyTRs(div, plist, false)\n\n div.appendChild(dom.createElement('hr'))\n return div\n }\n}\n\n// ends\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/attach/attachPane.js b/dist/attach/attachPane.js new file mode 100644 index 00000000..30e1dd2f --- /dev/null +++ b/dist/attach/attachPane.js @@ -0,0 +1,394 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var UI = _interopRequireWildcard(require("solid-ui-jss")); +var $rdf = _interopRequireWildcard(require("rdflib")); +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } +/* Attachment Pane + ** + ** - Attach a document to a thing + ** - View attachments + ** - Look at all unattached Supporting Documents. + ** - Drag a document onto the pane to attach it @@ + ** + ** + */ +var _default = exports.default = { + icon: UI.icons.iconBase + 'noun_25830.svg', + // noun_25830 + + name: 'attachments', + // Does the subject deserve an attachments pane? + // + // In this case we will render any thing which is in any subclass of + // certain classes, or also the certain classes themselves, as a + // triage tool for correlating many attachees with attachments. + // We also offer the pane for anything of any class which just has an attachment already. + // + label: function (subject, context) { + const kb = context.session.store; + const t = kb.findTypeURIs(subject); + const QU = $rdf.Namespace('http://www.w3.org/2000/10/swap/pim/qif#'); + const WF = $rdf.Namespace('http://www.w3.org/2005/01/wf/flow#'); + if (t['http://www.w3.org/ns/pim/trip#Trip'] || + // If in any subclass + subject.uri === 'http://www.w3.org/ns/pim/trip#Trip' || t['http://www.w3.org/2005/01/wf/flow#Task'] || t['http://www.w3.org/2000/10/swap/pim/qif#Transaction'] || + // subject.uri == 'http://www.w3.org/2000/10/swap/pim/qif#Transaction' || + QU('Transaction') in kb.findSuperClassesNT(subject) || kb.holds(subject, WF('attachment'))) { + return 'attachments'; + } + return null; + }, + render: function (subject, context) { + const dom = context.dom; + const kb = context.session.store; + const WF = $rdf.Namespace('http://www.w3.org/2005/01/wf/flow#'); + const QU = $rdf.Namespace('http://www.w3.org/2000/10/swap/pim/qif#'); + + // //////////////////////////////////////////////////////////////////////////// + + const complain = function complain(message) { + const pre = dom.createElement('pre'); + pre.setAttribute('style', 'background-color: pink'); + div.appendChild(pre); + pre.appendChild(dom.createTextNode(message)); + }; + + // Where can we write about this thing? + // + // Returns term for document or null + const findStore = function (kb, subject) { + if (kb.updater.editable(subject.doc(), kb)) return subject.doc(); + const store = kb.any(subject.doc(), QU('annotationStore')); + return store; + }; + const div = dom.createElement('div'); + const esc = UI.utils.escapeForXML; + div.setAttribute('class', 'attachPane'); + div.innerHTML = '

' + esc(UI.utils.label(subject, true)) + ' attachments

'; // + + const predicate = WF('attachment'); + const range = QU('SupportingDocument'); + let subjects, multi; + const options = {}; + let currentMode = 0; // 0 -> Show all; 1 -> Attached; 2 -> unattached + let currentSubject = null; + let currentObject = null; + const objectType = QU('SupportingDocument'); + + // Find all members of the class which we know about + // and sort them by an appropriate property. @@ Move to library + // + + const getSortKeySimple = function (_c) { + const uriMap = { + 'http://www.w3.org/2005/01/wf/flow#Task': 'http://purl.org/dc/elements/1.1/created', + 'http://www.w3.org/ns/pim/trip#Trip': 'http://www.w3.org/2002/12/cal/ical#dtstart', + 'http://www.w3.org/2000/10/swap/pim/qif#Transaction': 'http://www.w3.org/2000/10/swap/pim/qif#date', + 'http://www.w3.org/2000/10/swap/pim/qif#SupportingDocument': 'http://purl.org/dc/elements/1.1/date' + }; + const uri = uriMap[subject.uri]; + return uri ? kb.sym(uri) : kb.any(subject, UI.ns.ui('sortBy')); + }; + const getSortKey = function (c) { + let k = getSortKeySimple(c.uri); + if (k) return k; + const sup = kb.findSuperClassesNT(c); + for (const cl in sup) { + // note unordered -- could be closest first + k = getSortKeySimple(kb.fromNT(cl).uri); + if (k) return k; + } + return undefined; // failure + }; + const getMembersAndSort = function (subject) { + const sortBy = getSortKey(subject); + let u, x, key; + const uriHash = kb.findMemberURIs(subject); + const pairs = []; + const subjects = []; + for (u in uriHash) { + // @@ TODO: Write away the need for exception on next line + + if (Object.prototype.hasOwnProperty.call(uriHash, u)) { + x = kb.sym(u); + if (sortBy) { + key = kb.any(x, sortBy); + if (!key) { + // complain("No key "+key+" sortby "+sortBy+" for "+x) + key = '8888-12-31'; + } else { + key = key.value; + } + } else { + complain('No sortby ' + sortBy + ' for ' + x); + key = '9999-12-31'; + } + // key = (sortBy && kb.any(x, sortBy)) || kb.literal("9999-12-31") // Undated appear future + // if (!key) complain("Sort: '"+key+"' No "+sortBy+" for "+x) // Assume just not in this year + pairs.push([key, x]); + } + } + pairs.sort(); + pairs.reverse(); // @@ Descending order .. made a toggle? + for (let i = 0; i < pairs.length; i++) { + subjects.push(pairs[i][1]); + } + return subjects; + }; + + // Set up a triage of many class members against documents or just one + if (subject.uri === 'http://www.w3.org/ns/pim/trip#Trip' || QU('Transaction') in kb.findSuperClassesNT(subject) + // subject.uri == 'http://www.w3.org/2000/10/swap/pim/qif#Transaction' + ) { + multi = true; + subjects = getMembersAndSort(subject); + } else { + currentSubject = subject; + currentMode = 1; // Show attached only. + subjects = [subject]; + multi = false; + } + + // var store = findStore(kb, subject) + // if (!store) complain("There is no annotation store for: "+subject.uri) + + // var objects = kb.each(undefined, ns.rdf('type'), range) + const objects = getMembersAndSort(range); + if (!objects) complain('objects:' + objects.length); + const deselectObject = function () { + currentObject = null; + preview.innerHTML = ''; + }; + const showFiltered = function (mode) { + const filtered = mode === 0 ? objects : getFiltered(); + // eslint-enable + UI.widgets.selectorPanelRefresh(objectList, dom, kb, objectType, predicate, true, filtered, options, showObject, linkClicked); + if (filtered.length === 1) { + currentObject = filtered[0]; + showObject(currentObject, null, true); // @@ (Sure?) if only one select it. + } else { + deselectObject(); + } + function getFiltered() { + return mode === 1 ? currentSubject === null ? objects.filter(y => !!kb.holds(undefined, predicate, y)) : objects.filter(y => !!kb.holds(currentSubject, predicate, y)) : objects.filter(y => kb.each(undefined, predicate, y).length === 0); + } + }; + const setAttachment = function (x, y, value, refresh) { + if (kb.holds(x, predicate, y) === value) return; + const verb = value ? 'attach' : 'detach'; + // complain("Info: starting to "+verb+" " + y.uri + " to "+x.uri+ ":\n") + const linkDone3 = function (uri, ok, body) { + if (ok) { + // complain("Success "+verb+" "+y.uri+" to "+x.uri+ ":\n"+ body) + refresh(); + } else { + complain('Error: Unable to ' + verb + ' ' + y.uri + ' to ' + x.uri + ':\n' + body); + } + }; + const store = findStore(kb, x); + if (!store) { + complain('There is no annotation store for: ' + x.uri); + } else { + const sts = [$rdf.st(x, predicate, y, store)]; + if (value) { + kb.updater.update([], sts, linkDone3); + } else { + kb.updater.update(sts, [], linkDone3); + } + } + }; + const linkClicked = function (x, event, inverse, refresh) { + let s, o; + if (inverse) { + // Objectlist + if (!currentSubject) { + complain('No subject for the link has been selected'); + return; + } else { + s = currentSubject; + o = x; + } + } else { + // Subjectlist + if (!currentObject) { + complain('No object for the link has been selected'); + return; + } else { + s = x; + o = currentObject; + } + } + setAttachment(s, o, !kb.holds(s, predicate, o), refresh); // @@ toggle + }; + + // When you click on a subject, filter the objects connected to the subject in Mode 1 + const showSubject = function (x, event, selected) { + if (selected) { + currentSubject = x; + } else { + currentSubject = null; + if (currentMode === 1) deselectObject(); + } // If all are displayed, refresh would just annoy: + if (currentMode !== 0) showFiltered(currentMode); // Refresh the objects + }; + if (multi) { + const subjectList = UI.widgets.selectorPanel(dom, kb, subject, predicate, false, subjects, options, showSubject, linkClicked); + subjectList.setAttribute('style', 'background-color: white; width: 25em; height: 100%; padding: 0 em; overflow:scroll; float:left'); + div.appendChild(subjectList); + } + const showObject = function (x, event, selected) { + if (!selected) { + deselectObject(); + preview.innerHTML = ''; // Clean out what is there + // complain("Show object "+x.uri) + return; + } + currentObject = x; + try { + /* + var dispalyable = function (kb, x) { + var cts = kb.fetcher.getHeader(x, 'content-type') + if (cts) { + var displayables = ['text/html', 'image/png', 'application/pdf'] + for (var j = 0; j < cts.length; j++) { + for (var k = 0; k < displayables.length; k++) { + if (cts[j].indexOf(displayables[k]) >= 0) { + return true + } + } + } + } + return false + } + */ + preview.innerHTML = 'Loading ....'; + if (x.uri) { + kb.fetcher.load(x.uri).then(() => { + const outliner = context.getOutliner(dom); + const display = outliner.propertyTable(x); // ,table, pane + preview.innerHTML = ''; + preview.appendChild(display); + }).catch(err => { + preview.textContent = 'Error loading ' + x.uri + ': ' + err; + }); + } + /* + if (dispalyable(kb, x) || x.uri.slice(-4) == ".pdf" || x.uri.slice(-4) == ".png" || x.uri.slice(-5) == ".html" || + x.uri.slice(-5) == ".jpeg") { // @@@@@@ MAJOR KLUDGE! use metadata after HEAD + preview.innerHTML = '' + } else { + } + */ + } catch (e) { + preview.innerHTML = '' + 'Error:' + e + ''; // @@ enc + } + }; + div.setAttribute('style', 'background-color: white; width:40cm; height:20cm;'); + const headerButtons = function (dom, labels, intial, callback) { + const head = dom.createElement('table'); + let current = intial; + head.setAttribute('style', 'float: left; width: 30em; padding: 0.5em; height: 1.5em; background-color: #ddd; color: #444; font-weight: bold'); + const tr = dom.createElement('tr'); + const style0 = 'border-radius: 0.6em; text-align: center;'; + const style1 = style0 + 'background-color: #ccc; color: black;'; + head.appendChild(tr); + const setStyles = function () { + for (i = 0; i < labels.length; i++) { + buttons[i].setAttribute('style', i === current ? style1 : style0); + } + }; + let i, b; + const buttons = []; + for (i = 0; i < labels.length; i++) { + b = buttons[i] = dom.createElement('td'); + b.textContent = labels[i]; + tr.appendChild(buttons[i]); + const listen = function (b, i) { + b.addEventListener('click', function (_e) { + current = i; + setStyles(); + callback(i); + }); + }; + listen(b, i); + } + setStyles(); + return head; + }; + const setMode = function (mode) { + if (mode !== currentMode) { + currentMode = mode; + deselectObject(); + showFiltered(mode); + } + }; + const wrapper = dom.createElement('div'); + wrapper.setAttribute('style', ' width: 30em; height: 100%; padding: 0em; float:left;'); + // wrapper.appendChild(head) + div.appendChild(wrapper); + wrapper.appendChild(headerButtons(dom, ['all', 'attached', 'not attached'], currentMode, setMode)); + const objectList = UI.widgets.selectorPanel(dom, kb, objectType, predicate, true, objects, options, showObject, linkClicked); + objectList.setAttribute('style', 'background-color: #ffe; width: 30em; height: 100%; padding: 0em; overflow:scroll;'); // float:left + wrapper.appendChild(objectList); + + // objectList.insertBefore(head, objectList.firstChild) + + const preview = dom.createElement('div'); + preview.setAttribute('style', /* background-color: black; */'padding: 0em; margin: 0; height: 100%; overflow:scroll;'); + div.appendChild(preview); + showFiltered(currentMode); + if (subjects.length > 0 && multi) { + const stores = {}; + for (let k = 0; k < subjects.length; k++) { + const store = findStore(kb, subjects[k]); + if (store) stores[store.uri] = subjects[k]; + // if (!store) complain("No store for "+subjects[k].uri) + } + for (const storeURI in stores) { + // var store = findStore(kb,subjects[subjectList.length-1]) + const store = kb.sym(storeURI); + const mintBox = dom.createElement('div'); + mintBox.setAttribute('style', 'clear: left; width: 20em; margin-top:2em; background-color:#ccc; border-radius: 1em; padding: 1em; font-weight: bold;'); + mintBox.textContent = '+ New ' + UI.utils.label(subject); + mintBox.textContent += ' in ' + UI.utils.label(store); + const storeLab = dom.createElement('span'); + storeLab.setAttribute('style', 'font-weight: normal; font-size: 80%; color: #777;'); + storeLab.textContent = storeURI; + mintBox.appendChild(dom.createElement('br')); + mintBox.appendChild(storeLab); + /* + var mintButton = dom.createElement('img') + mintBox.appendChild(mintButton) + mintButton.setAttribute('src', ...); @@ Invokes master handler + */ + mintBox.addEventListener('click', function (_event) { + const thisForm = UI.widgets.promptForNew(dom, kb, subject, predicate, subject, null, store, function (ok, _body) { + if (!ok) { + // callback(ok, body); // @@ if ok, need some form of refresh of the select for the new thing + } else { + // Refresh @@ + } + }); + try { + div.insertBefore(thisForm, mintBox.nextSibling); // Sigh no insertAfter + } catch (e) { + div.appendChild(thisForm); + } + // var newObject = thisForm.AJAR_subject + }, false); + div.appendChild(mintBox); + } + } + + // if (!me) complain("(You do not have your Web Id set. Set your Web ID to make changes.)") + + return div; + } +}; // pane object +// ends +//# sourceMappingURL=attachPane.js.map \ No newline at end of file diff --git a/dist/attach/attachPane.js.map b/dist/attach/attachPane.js.map new file mode 100644 index 00000000..4c3e7f58 --- /dev/null +++ b/dist/attach/attachPane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"attachPane.js","names":["UI","_interopRequireWildcard","require","$rdf","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_default","exports","icon","icons","iconBase","name","label","subject","context","kb","session","store","findTypeURIs","QU","Namespace","WF","uri","findSuperClassesNT","holds","render","dom","complain","message","pre","createElement","setAttribute","div","appendChild","createTextNode","findStore","updater","editable","doc","any","esc","utils","escapeForXML","innerHTML","predicate","range","subjects","multi","options","currentMode","currentSubject","currentObject","objectType","getSortKeySimple","_c","uriMap","sym","ns","ui","getSortKey","c","k","sup","cl","fromNT","undefined","getMembersAndSort","sortBy","u","x","key","uriHash","findMemberURIs","pairs","prototype","value","push","sort","reverse","length","objects","deselectObject","preview","showFiltered","mode","filtered","getFiltered","widgets","selectorPanelRefresh","objectList","showObject","linkClicked","filter","y","each","setAttachment","refresh","verb","linkDone3","ok","body","sts","st","update","event","inverse","s","showSubject","selected","subjectList","selectorPanel","fetcher","load","then","outliner","getOutliner","display","propertyTable","catch","err","textContent","headerButtons","labels","intial","callback","head","current","tr","style0","style1","setStyles","buttons","b","listen","addEventListener","_e","setMode","wrapper","stores","storeURI","mintBox","storeLab","_event","thisForm","promptForNew","_body","insertBefore","nextSibling"],"sources":["../../src/attach/attachPane.js"],"sourcesContent":["/* Attachment Pane\n **\n ** - Attach a document to a thing\n ** - View attachments\n ** - Look at all unattached Supporting Documents.\n ** - Drag a document onto the pane to attach it @@\n **\n **\n */\n\nimport * as UI from 'solid-ui-jss'\nimport * as $rdf from 'rdflib'\n\nexport default {\n icon: UI.icons.iconBase + 'noun_25830.svg', // noun_25830\n\n name: 'attachments',\n\n // Does the subject deserve an attachments pane?\n //\n // In this case we will render any thing which is in any subclass of\n // certain classes, or also the certain classes themselves, as a\n // triage tool for correlating many attachees with attachments.\n // We also offer the pane for anything of any class which just has an attachment already.\n //\n label: function (subject, context) {\n const kb = context.session.store\n const t = kb.findTypeURIs(subject)\n const QU = $rdf.Namespace('http://www.w3.org/2000/10/swap/pim/qif#')\n const WF = $rdf.Namespace('http://www.w3.org/2005/01/wf/flow#')\n if (\n t['http://www.w3.org/ns/pim/trip#Trip'] || // If in any subclass\n subject.uri === 'http://www.w3.org/ns/pim/trip#Trip' ||\n t['http://www.w3.org/2005/01/wf/flow#Task'] ||\n t['http://www.w3.org/2000/10/swap/pim/qif#Transaction'] ||\n // subject.uri == 'http://www.w3.org/2000/10/swap/pim/qif#Transaction' ||\n QU('Transaction') in kb.findSuperClassesNT(subject) ||\n kb.holds(subject, WF('attachment'))\n ) {\n return 'attachments'\n }\n return null\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const kb = context.session.store\n const WF = $rdf.Namespace('http://www.w3.org/2005/01/wf/flow#')\n const QU = $rdf.Namespace('http://www.w3.org/2000/10/swap/pim/qif#')\n\n // ////////////////////////////////////////////////////////////////////////////\n\n const complain = function complain (message) {\n const pre = dom.createElement('pre')\n pre.setAttribute('style', 'background-color: pink')\n div.appendChild(pre)\n pre.appendChild(dom.createTextNode(message))\n }\n\n // Where can we write about this thing?\n //\n // Returns term for document or null\n const findStore = function (kb, subject) {\n if (kb.updater.editable(subject.doc(), kb)) return subject.doc()\n const store = kb.any(subject.doc(), QU('annotationStore'))\n return store\n }\n\n const div = dom.createElement('div')\n const esc = UI.utils.escapeForXML\n div.setAttribute('class', 'attachPane')\n div.innerHTML =\n '

' + esc(UI.utils.label(subject, true)) + ' attachments

' //\n\n const predicate = WF('attachment')\n const range = QU('SupportingDocument')\n\n let subjects, multi\n const options = {}\n let currentMode = 0 // 0 -> Show all; 1 -> Attached; 2 -> unattached\n let currentSubject = null\n let currentObject = null\n const objectType = QU('SupportingDocument')\n\n // Find all members of the class which we know about\n // and sort them by an appropriate property. @@ Move to library\n //\n\n const getSortKeySimple = function (_c) {\n const uriMap = {\n 'http://www.w3.org/2005/01/wf/flow#Task': 'http://purl.org/dc/elements/1.1/created',\n 'http://www.w3.org/ns/pim/trip#Trip': 'http://www.w3.org/2002/12/cal/ical#dtstart',\n 'http://www.w3.org/2000/10/swap/pim/qif#Transaction': 'http://www.w3.org/2000/10/swap/pim/qif#date',\n 'http://www.w3.org/2000/10/swap/pim/qif#SupportingDocument': 'http://purl.org/dc/elements/1.1/date'\n }\n const uri = uriMap[subject.uri]\n return uri ? kb.sym(uri) : kb.any(subject, UI.ns.ui('sortBy'))\n }\n\n const getSortKey = function (c) {\n let k = getSortKeySimple(c.uri)\n if (k) return k\n const sup = kb.findSuperClassesNT(c)\n for (const cl in sup) {\n // note unordered -- could be closest first\n k = getSortKeySimple(kb.fromNT(cl).uri)\n if (k) return k\n }\n return undefined // failure\n }\n\n const getMembersAndSort = function (subject) {\n const sortBy = getSortKey(subject)\n let u, x, key\n const uriHash = kb.findMemberURIs(subject)\n const pairs = []\n const subjects = []\n for (u in uriHash) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(uriHash, u)) {\n x = kb.sym(u)\n if (sortBy) {\n key = kb.any(x, sortBy)\n if (!key) {\n // complain(\"No key \"+key+\" sortby \"+sortBy+\" for \"+x)\n key = '8888-12-31'\n } else {\n key = key.value\n }\n } else {\n complain('No sortby ' + sortBy + ' for ' + x)\n key = '9999-12-31'\n }\n // key = (sortBy && kb.any(x, sortBy)) || kb.literal(\"9999-12-31\") // Undated appear future\n // if (!key) complain(\"Sort: '\"+key+\"' No \"+sortBy+\" for \"+x) // Assume just not in this year\n pairs.push([key, x])\n }\n }\n pairs.sort()\n pairs.reverse() // @@ Descending order .. made a toggle?\n for (let i = 0; i < pairs.length; i++) {\n subjects.push(pairs[i][1])\n }\n return subjects\n }\n\n // Set up a triage of many class members against documents or just one\n if (\n subject.uri === 'http://www.w3.org/ns/pim/trip#Trip' ||\n QU('Transaction') in kb.findSuperClassesNT(subject)\n // subject.uri == 'http://www.w3.org/2000/10/swap/pim/qif#Transaction'\n ) {\n multi = true\n subjects = getMembersAndSort(subject)\n } else {\n currentSubject = subject\n currentMode = 1 // Show attached only.\n subjects = [subject]\n multi = false\n }\n\n // var store = findStore(kb, subject)\n // if (!store) complain(\"There is no annotation store for: \"+subject.uri)\n\n // var objects = kb.each(undefined, ns.rdf('type'), range)\n const objects = getMembersAndSort(range)\n if (!objects) complain('objects:' + objects.length)\n\n const deselectObject = function () {\n currentObject = null\n preview.innerHTML = ''\n }\n\n const showFiltered = function (mode) {\n const filtered = mode === 0 ? objects : getFiltered()\n // eslint-enable\n UI.widgets.selectorPanelRefresh(\n objectList,\n dom,\n kb,\n objectType,\n predicate,\n true,\n filtered,\n options,\n showObject,\n linkClicked\n )\n if (filtered.length === 1) {\n currentObject = filtered[0]\n showObject(currentObject, null, true) // @@ (Sure?) if only one select it.\n } else {\n deselectObject()\n }\n\n function getFiltered () {\n return mode === 1\n ? currentSubject === null\n ? objects.filter(y => !!kb.holds(undefined, predicate, y))\n : objects.filter(y => !!kb.holds(currentSubject, predicate, y))\n : objects.filter(y => kb.each(undefined, predicate, y).length === 0)\n }\n }\n\n const setAttachment = function (x, y, value, refresh) {\n if (kb.holds(x, predicate, y) === value) return\n const verb = value ? 'attach' : 'detach'\n // complain(\"Info: starting to \"+verb+\" \" + y.uri + \" to \"+x.uri+ \":\\n\")\n const linkDone3 = function (uri, ok, body) {\n if (ok) {\n // complain(\"Success \"+verb+\" \"+y.uri+\" to \"+x.uri+ \":\\n\"+ body)\n refresh()\n } else {\n complain(\n 'Error: Unable to ' +\n verb +\n ' ' +\n y.uri +\n ' to ' +\n x.uri +\n ':\\n' +\n body\n )\n }\n }\n\n const store = findStore(kb, x)\n if (!store) {\n complain('There is no annotation store for: ' + x.uri)\n } else {\n const sts = [$rdf.st(x, predicate, y, store)]\n if (value) {\n kb.updater.update([], sts, linkDone3)\n } else {\n kb.updater.update(sts, [], linkDone3)\n }\n }\n }\n\n const linkClicked = function (x, event, inverse, refresh) {\n let s, o\n if (inverse) {\n // Objectlist\n if (!currentSubject) {\n complain('No subject for the link has been selected')\n return\n } else {\n s = currentSubject\n o = x\n }\n } else {\n // Subjectlist\n if (!currentObject) {\n complain('No object for the link has been selected')\n return\n } else {\n s = x\n o = currentObject\n }\n }\n setAttachment(s, o, !kb.holds(s, predicate, o), refresh) // @@ toggle\n }\n\n // When you click on a subject, filter the objects connected to the subject in Mode 1\n const showSubject = function (x, event, selected) {\n if (selected) {\n currentSubject = x\n } else {\n currentSubject = null\n if (currentMode === 1) deselectObject()\n } // If all are displayed, refresh would just annoy:\n if (currentMode !== 0) showFiltered(currentMode) // Refresh the objects\n }\n\n if (multi) {\n const subjectList = UI.widgets.selectorPanel(\n dom,\n kb,\n subject,\n predicate,\n false,\n subjects,\n options,\n showSubject,\n linkClicked\n )\n subjectList.setAttribute(\n 'style',\n 'background-color: white; width: 25em; height: 100%; padding: 0 em; overflow:scroll; float:left'\n )\n div.appendChild(subjectList)\n }\n\n const showObject = function (x, event, selected) {\n if (!selected) {\n deselectObject()\n preview.innerHTML = '' // Clean out what is there\n // complain(\"Show object \"+x.uri)\n return\n }\n currentObject = x\n try {\n /*\n var dispalyable = function (kb, x) {\n var cts = kb.fetcher.getHeader(x, 'content-type')\n if (cts) {\n var displayables = ['text/html', 'image/png', 'application/pdf']\n for (var j = 0; j < cts.length; j++) {\n for (var k = 0; k < displayables.length; k++) {\n if (cts[j].indexOf(displayables[k]) >= 0) {\n return true\n }\n }\n }\n }\n return false\n }\n */\n preview.innerHTML = 'Loading ....'\n if (x.uri) {\n kb.fetcher\n .load(x.uri)\n .then(() => {\n const outliner = context.getOutliner(dom)\n const display = outliner.propertyTable(x) // ,table, pane\n preview.innerHTML = ''\n preview.appendChild(display)\n })\n .catch(err => {\n preview.textContent = 'Error loading ' + x.uri + ': ' + err\n })\n }\n /*\n if (dispalyable(kb, x) || x.uri.slice(-4) == \".pdf\" || x.uri.slice(-4) == \".png\" || x.uri.slice(-5) == \".html\" ||\n x.uri.slice(-5) == \".jpeg\") { // @@@@@@ MAJOR KLUDGE! use metadata after HEAD\n preview.innerHTML = ''\n } else {\n }\n */\n } catch (e) {\n preview.innerHTML =\n '' + 'Error:' + e + '' // @@ enc\n }\n }\n\n div.setAttribute(\n 'style',\n 'background-color: white; width:40cm; height:20cm;'\n )\n\n const headerButtons = function (dom, labels, intial, callback) {\n const head = dom.createElement('table')\n let current = intial\n head.setAttribute(\n 'style',\n 'float: left; width: 30em; padding: 0.5em; height: 1.5em; background-color: #ddd; color: #444; font-weight: bold'\n )\n const tr = dom.createElement('tr')\n const style0 = 'border-radius: 0.6em; text-align: center;'\n const style1 = style0 + 'background-color: #ccc; color: black;'\n head.appendChild(tr)\n const setStyles = function () {\n for (i = 0; i < labels.length; i++) {\n buttons[i].setAttribute('style', i === current ? style1 : style0)\n }\n }\n let i, b\n const buttons = []\n for (i = 0; i < labels.length; i++) {\n b = buttons[i] = dom.createElement('td')\n b.textContent = labels[i]\n tr.appendChild(buttons[i])\n const listen = function (b, i) {\n b.addEventListener('click', function (_e) {\n current = i\n setStyles()\n callback(i)\n })\n }\n listen(b, i)\n }\n setStyles()\n return head\n }\n\n const setMode = function (mode) {\n if (mode !== currentMode) {\n currentMode = mode\n deselectObject()\n showFiltered(mode)\n }\n }\n\n const wrapper = dom.createElement('div')\n wrapper.setAttribute(\n 'style',\n ' width: 30em; height: 100%; padding: 0em; float:left;'\n )\n // wrapper.appendChild(head)\n div.appendChild(wrapper)\n wrapper.appendChild(\n headerButtons(\n dom,\n ['all', 'attached', 'not attached'],\n currentMode,\n setMode\n )\n )\n\n const objectList = UI.widgets.selectorPanel(\n dom,\n kb,\n objectType,\n predicate,\n true,\n objects,\n options,\n showObject,\n linkClicked\n )\n objectList.setAttribute(\n 'style',\n 'background-color: #ffe; width: 30em; height: 100%; padding: 0em; overflow:scroll;'\n ) // float:left\n wrapper.appendChild(objectList)\n\n // objectList.insertBefore(head, objectList.firstChild)\n\n const preview = dom.createElement('div')\n preview.setAttribute(\n 'style',\n /* background-color: black; */ 'padding: 0em; margin: 0; height: 100%; overflow:scroll;'\n )\n div.appendChild(preview)\n showFiltered(currentMode)\n\n if (subjects.length > 0 && multi) {\n const stores = {}\n for (let k = 0; k < subjects.length; k++) {\n const store = findStore(kb, subjects[k])\n if (store) stores[store.uri] = subjects[k]\n // if (!store) complain(\"No store for \"+subjects[k].uri)\n }\n for (const storeURI in stores) {\n // var store = findStore(kb,subjects[subjectList.length-1])\n const store = kb.sym(storeURI)\n const mintBox = dom.createElement('div')\n mintBox.setAttribute(\n 'style',\n 'clear: left; width: 20em; margin-top:2em; background-color:#ccc; border-radius: 1em; padding: 1em; font-weight: bold;'\n )\n mintBox.textContent = '+ New ' + UI.utils.label(subject)\n\n mintBox.textContent += ' in ' + UI.utils.label(store)\n const storeLab = dom.createElement('span')\n storeLab.setAttribute(\n 'style',\n 'font-weight: normal; font-size: 80%; color: #777;'\n )\n storeLab.textContent = storeURI\n mintBox.appendChild(dom.createElement('br'))\n mintBox.appendChild(storeLab)\n /*\n var mintButton = dom.createElement('img')\n mintBox.appendChild(mintButton)\n mintButton.setAttribute('src', ...); @@ Invokes master handler\n */\n mintBox.addEventListener(\n 'click',\n function (_event) {\n const thisForm = UI.widgets.promptForNew(\n dom,\n kb,\n subject,\n predicate,\n subject,\n null,\n store,\n function (ok, _body) {\n if (!ok) {\n // callback(ok, body); // @@ if ok, need some form of refresh of the select for the new thing\n } else {\n // Refresh @@\n }\n }\n )\n try {\n div.insertBefore(thisForm, mintBox.nextSibling) // Sigh no insertAfter\n } catch (e) {\n div.appendChild(thisForm)\n }\n // var newObject = thisForm.AJAR_subject\n },\n false\n )\n div.appendChild(mintBox)\n }\n }\n\n // if (!me) complain(\"(You do not have your Web Id set. Set your Web ID to make changes.)\")\n\n return div\n }\n} // pane object\n\n// ends\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/audio/audioPane.js b/dist/audio/audioPane.js new file mode 100644 index 00000000..ac93bf37 --- /dev/null +++ b/dist/audio/audioPane.js @@ -0,0 +1,182 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var UI = _interopRequireWildcard(require("solid-ui-jss")); +var $rdf = _interopRequireWildcard(require("rdflib")); +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } +/* Single audio play Pane + ** + */ + +const ns = UI.ns; +var _default = exports.default = { + icon: UI.icons.iconBase + 'noun_534313.svg', + name: 'audio', + // Does the subject deserve an audio play pane? + label: function (subject, context) { + const kb = context.session.store; + const typeURIs = kb.findTypeURIs(subject); + const prefix = $rdf.Util.mediaTypeClass('audio/*').uri.split('*')[0]; + for (const t in typeURIs) { + if (t.startsWith(prefix)) return 'Play audio'; + } + return null; + }, + render: function (subject, context) { + const kb = context.session.store; + const dom = context.dom; + const options = { + autoplay: false, + chain: true, + chainAlbums: true, + loop: false + }; + const removeExtension = function (str) { + const dot = str.lastIndexOf('.'); + if (dot < 0) return str; // if any + const slash = str.lastIndexOf('/'); + if (dot < slash) return str; + return str.slice(0, dot); + }; + + // True if there is another file like song.mp3 when this is "song 1.mp3" + // or this is song.m4a + // + const looksRedundant = function (x) { + const folder = kb.any(undefined, ns.ldp('contains'), x); + if (!folder) return false; + const contents = kb.each(folder, ns.ldp('contains')); + if (contents.length < 2) return false; + const thisName = x.uri; + for (let k = 0; k < contents.length; k++) { + const otherName = contents[k].uri; + if (thisName.length > otherName.length && thisName.startsWith(removeExtension(otherName))) { + return true; + } + if (thisName.endsWith('.m4a') && otherName.endsWith('.mp3') && removeExtension(thisName) === removeExtension(otherName)) { + return true; + } + } + return false; + }; + + // Alternative methods could include: + // Accesing metadata in the audio contol, or paring the audio file + const guessNames = function (x) { + const a = x.uri.split('/').slice(-3); // Hope artist, album, track + const decode = function (str) { + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + }; + artistRow.textContent = decode(a[0]); + albumRow.textContent = decode(a[1]); + trackRow.textContent = decode(removeExtension(a[2])); + }; + const moveOn = function (current, level) { + return new Promise(function (resolve) { + level = level || 0; + if (!options.chain) return resolve(null); + // Ideally navigate graph else cheat with URI munging: + const folder = kb.any(undefined, ns.ldp('contains'), current) || current.dir(); + if (!folder) return resolve(null); + kb.fetcher.load(folder).then(function (_xhr) { + const contents = kb.each(folder, ns.ldp('contains')); // @@ load if not loaded + // if (contents.length < 2) return resolve(null) NO might move on from 1-track album + let j; + contents.sort(); // sort by URI which hopefully will get tracks in order + for (let i = 0; i < contents.length; i++) { + if (current.uri === contents[i].uri) { + j = (i + 1) % contents.length; + if (j === 0) { + if (!options.chainAlbums) { + if (options.loop) { + return resolve(contents[j]); + } + return resolve(null); // No more music needed + } else { + // chain albums + if (level === 1 || !options.chainAlbums) return resolve(null); // limit of navigating treee + moveOn(folder, level + 1).then(function (folder2) { + if (folder2) { + kb.fetcher.load(folder2).then(function (_xhr) { + const contents = kb.each(folder2, ns.ldp('contains')); + if (contents.length === 0) return resolve(null); + contents.sort(); + console.log('New Album: ' + folder2); + return resolve(contents[0]); // Start off new album + }); + } + }); + } + } else { + return resolve(contents[j]); + } + } + } // for + }); + }); + }; + const endedListener = function (event) { + const current = kb.sym(event.target.getAttribute('src')); + if (!options.chain) return; + const tryNext = function (cur) { + const current = cur; + moveOn(current).then(function (next) { + if (!next) { + console.log('No successor to ' + current); + return; + } + if (!looksRedundant(next)) { + console.log('Moving on to ' + next); + guessNames(next); + controlRow.appendChild(audioControl(next, true)); // Force autoplay + controlRow.removeChild(event.target); + } else { + console.log('Ignoring redundant ' + next); + tryNext(next); + } + }); + }; + tryNext(current); + }; + const audioControl = function (song, autoplay) { + const audio = dom.createElement('audio'); + audio.setAttribute('controls', 'yes'); + // get audio with authenticated fetch + kb.fetcher._fetch(song.uri).then(function (response) { + return response.blob(); + }).then(function (myBlob) { + const objectURL = URL.createObjectURL(myBlob); + audio.setAttribute('src', objectURL); // w640 h480 // + }); + if (autoplay) { + audio.setAttribute('autoplay', 'autoplay'); // Make this a personal preference + } + audio.addEventListener('ended', endedListener, false); + return audio; + }; + const div = dom.createElement('div'); + const table = div.appendChild(dom.createElement('table')); + const labelStyle = 'padding: 0.3em; color:white; background-color: black;'; + const artistRow = table.appendChild(dom.createElement('tr')); + artistRow.style.cssText = labelStyle; + const albumRow = table.appendChild(dom.createElement('tr')); + albumRow.style.cssText = labelStyle; + const trackRow = table.appendChild(dom.createElement('tr')); + trackRow.style.cssText = labelStyle; + const controlRow = table.appendChild(dom.createElement('tr')); + guessNames(subject); + controlRow.appendChild(audioControl(subject, options.autoplay)); + if (!kb.holds(undefined, ns.ldp('contains'), subject) && subject.dir()) { + kb.fetcher.load(subject.dir()); // Prefetch enclosing @@ or playlist + } + return div; + } +}; // ends +//# sourceMappingURL=audioPane.js.map \ No newline at end of file diff --git a/dist/audio/audioPane.js.map b/dist/audio/audioPane.js.map new file mode 100644 index 00000000..137c0248 --- /dev/null +++ b/dist/audio/audioPane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"audioPane.js","names":["UI","_interopRequireWildcard","require","$rdf","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ns","_default","exports","icon","icons","iconBase","name","label","subject","context","kb","session","store","typeURIs","findTypeURIs","prefix","Util","mediaTypeClass","uri","split","startsWith","render","dom","options","autoplay","chain","chainAlbums","loop","removeExtension","str","dot","lastIndexOf","slash","slice","looksRedundant","x","folder","any","undefined","ldp","contents","each","length","thisName","k","otherName","endsWith","guessNames","a","decode","decodeURIComponent","artistRow","textContent","albumRow","trackRow","moveOn","current","level","Promise","resolve","dir","fetcher","load","then","_xhr","j","sort","folder2","console","log","endedListener","event","sym","target","getAttribute","tryNext","cur","next","controlRow","appendChild","audioControl","removeChild","song","audio","createElement","setAttribute","_fetch","response","blob","myBlob","objectURL","URL","createObjectURL","addEventListener","div","table","labelStyle","style","cssText","holds"],"sources":["../../src/audio/audioPane.js"],"sourcesContent":["/* Single audio play Pane\n **\n */\nimport * as UI from 'solid-ui-jss'\nimport * as $rdf from 'rdflib'\nconst ns = UI.ns\n\nexport default {\n icon: UI.icons.iconBase + 'noun_534313.svg',\n\n name: 'audio',\n\n // Does the subject deserve an audio play pane?\n label: function (subject, context) {\n const kb = context.session.store\n const typeURIs = kb.findTypeURIs(subject)\n\n const prefix = $rdf.Util.mediaTypeClass('audio/*').uri.split('*')[0]\n for (const t in typeURIs) {\n if (t.startsWith(prefix)) return 'Play audio'\n }\n return null\n },\n\n render: function (subject, context) {\n const kb = context.session.store\n const dom = context.dom\n const options = {\n autoplay: false,\n chain: true,\n chainAlbums: true,\n loop: false\n }\n\n const removeExtension = function (str) {\n const dot = str.lastIndexOf('.')\n if (dot < 0) return str // if any\n const slash = str.lastIndexOf('/')\n if (dot < slash) return str\n return str.slice(0, dot)\n }\n\n // True if there is another file like song.mp3 when this is \"song 1.mp3\"\n // or this is song.m4a\n //\n const looksRedundant = function (x) {\n const folder = kb.any(undefined, ns.ldp('contains'), x)\n if (!folder) return false\n const contents = kb.each(folder, ns.ldp('contains'))\n if (contents.length < 2) return false\n const thisName = x.uri\n for (let k = 0; k < contents.length; k++) {\n const otherName = contents[k].uri\n if (\n thisName.length > otherName.length &&\n thisName.startsWith(removeExtension(otherName))\n ) {\n return true\n }\n if (\n thisName.endsWith('.m4a') &&\n otherName.endsWith('.mp3') &&\n removeExtension(thisName) === removeExtension(otherName)\n ) {\n return true\n }\n }\n return false\n }\n\n // Alternative methods could include:\n // Accesing metadata in the audio contol, or paring the audio file\n const guessNames = function (x) {\n const a = x.uri.split('/').slice(-3) // Hope artist, album, track\n const decode = function (str) {\n try {\n return decodeURIComponent(str)\n } catch (e) {\n return str\n }\n }\n artistRow.textContent = decode(a[0])\n albumRow.textContent = decode(a[1])\n trackRow.textContent = decode(removeExtension(a[2]))\n }\n\n const moveOn = function (current, level) {\n return new Promise(function (resolve) {\n level = level || 0\n if (!options.chain) return resolve(null)\n // Ideally navigate graph else cheat with URI munging:\n const folder =\n kb.any(undefined, ns.ldp('contains'), current) || current.dir()\n if (!folder) return resolve(null)\n kb.fetcher.load(folder).then(function (_xhr) {\n const contents = kb.each(folder, ns.ldp('contains')) // @@ load if not loaded\n // if (contents.length < 2) return resolve(null) NO might move on from 1-track album\n let j\n contents.sort() // sort by URI which hopefully will get tracks in order\n for (let i = 0; i < contents.length; i++) {\n if (current.uri === contents[i].uri) {\n j = (i + 1) % contents.length\n if (j === 0) {\n if (!options.chainAlbums) {\n if (options.loop) {\n return resolve(contents[j])\n }\n return resolve(null) // No more music needed\n } else {\n // chain albums\n if (level === 1 || !options.chainAlbums) return resolve(null) // limit of navigating treee\n moveOn(folder, level + 1).then(function (folder2) {\n if (folder2) {\n kb.fetcher.load(folder2).then(function (_xhr) {\n const contents = kb.each(folder2, ns.ldp('contains'))\n if (contents.length === 0) return resolve(null)\n contents.sort()\n console.log('New Album: ' + folder2)\n return resolve(contents[0]) // Start off new album\n })\n }\n })\n }\n } else {\n return resolve(contents[j])\n }\n }\n } // for\n })\n })\n }\n const endedListener = function (event) {\n const current = kb.sym(event.target.getAttribute('src'))\n if (!options.chain) return\n const tryNext = function (cur) {\n const current = cur\n moveOn(current).then(function (next) {\n if (!next) {\n console.log('No successor to ' + current)\n return\n }\n if (!looksRedundant(next)) {\n console.log('Moving on to ' + next)\n guessNames(next)\n controlRow.appendChild(audioControl(next, true)) // Force autoplay\n controlRow.removeChild(event.target)\n } else {\n console.log('Ignoring redundant ' + next)\n tryNext(next)\n }\n })\n }\n tryNext(current)\n }\n\n const audioControl = function (song, autoplay) {\n const audio = dom.createElement('audio')\n audio.setAttribute('controls', 'yes')\n // get audio with authenticated fetch\n kb.fetcher._fetch(song.uri)\n .then(function (response) {\n return response.blob()\n })\n .then(function (myBlob) {\n const objectURL = URL.createObjectURL(myBlob)\n audio.setAttribute('src', objectURL) // w640 h480 //\n })\n\n if (autoplay) {\n audio.setAttribute('autoplay', 'autoplay') // Make this a personal preference\n }\n audio.addEventListener('ended', endedListener, false)\n return audio\n }\n\n const div = dom.createElement('div')\n const table = div.appendChild(dom.createElement('table'))\n const labelStyle = 'padding: 0.3em; color:white; background-color: black;'\n const artistRow = table.appendChild(dom.createElement('tr'))\n artistRow.style.cssText = labelStyle\n const albumRow = table.appendChild(dom.createElement('tr'))\n albumRow.style.cssText = labelStyle\n const trackRow = table.appendChild(dom.createElement('tr'))\n trackRow.style.cssText = labelStyle\n const controlRow = table.appendChild(dom.createElement('tr'))\n guessNames(subject)\n controlRow.appendChild(audioControl(subject, options.autoplay))\n\n if (!kb.holds(undefined, ns.ldp('contains'), subject) && subject.dir()) {\n kb.fetcher.load(subject.dir()) // Prefetch enclosing @@ or playlist\n }\n\n return div\n }\n}\n\n// ends\n"],"mappings":";;;;;;AAGA,IAAAA,EAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,IAAA,GAAAF,uBAAA,CAAAC,OAAA;AAA8B,SAAAD,wBAAAG,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAL,uBAAA,YAAAA,CAAAG,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAJ9B;AACA;AACA;;AAGA,MAAMkB,EAAE,GAAGvB,EAAE,CAACuB,EAAE;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAX,OAAA,GAED;EACbY,IAAI,EAAE1B,EAAE,CAAC2B,KAAK,CAACC,QAAQ,GAAG,iBAAiB;EAE3CC,IAAI,EAAE,OAAO;EAEb;EACAC,KAAK,EAAE,SAAAA,CAAUC,OAAO,EAAEC,OAAO,EAAE;IACjC,MAAMC,EAAE,GAAGD,OAAO,CAACE,OAAO,CAACC,KAAK;IAChC,MAAMC,QAAQ,GAAGH,EAAE,CAACI,YAAY,CAACN,OAAO,CAAC;IAEzC,MAAMO,MAAM,GAAGnC,IAAI,CAACoC,IAAI,CAACC,cAAc,CAAC,SAAS,CAAC,CAACC,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,MAAMrC,CAAC,IAAI+B,QAAQ,EAAE;MACxB,IAAI/B,CAAC,CAACsC,UAAU,CAACL,MAAM,CAAC,EAAE,OAAO,YAAY;IAC/C;IACA,OAAO,IAAI;EACb,CAAC;EAEDM,MAAM,EAAE,SAAAA,CAAUb,OAAO,EAAEC,OAAO,EAAE;IAClC,MAAMC,EAAE,GAAGD,OAAO,CAACE,OAAO,CAACC,KAAK;IAChC,MAAMU,GAAG,GAAGb,OAAO,CAACa,GAAG;IACvB,MAAMC,OAAO,GAAG;MACdC,QAAQ,EAAE,KAAK;MACfC,KAAK,EAAE,IAAI;MACXC,WAAW,EAAE,IAAI;MACjBC,IAAI,EAAE;IACR,CAAC;IAED,MAAMC,eAAe,GAAG,SAAAA,CAAUC,GAAG,EAAE;MACrC,MAAMC,GAAG,GAAGD,GAAG,CAACE,WAAW,CAAC,GAAG,CAAC;MAChC,IAAID,GAAG,GAAG,CAAC,EAAE,OAAOD,GAAG,EAAC;MACxB,MAAMG,KAAK,GAAGH,GAAG,CAACE,WAAW,CAAC,GAAG,CAAC;MAClC,IAAID,GAAG,GAAGE,KAAK,EAAE,OAAOH,GAAG;MAC3B,OAAOA,GAAG,CAACI,KAAK,CAAC,CAAC,EAAEH,GAAG,CAAC;IAC1B,CAAC;;IAED;IACA;IACA;IACA,MAAMI,cAAc,GAAG,SAAAA,CAAUC,CAAC,EAAE;MAClC,MAAMC,MAAM,GAAG1B,EAAE,CAAC2B,GAAG,CAACC,SAAS,EAAEtC,EAAE,CAACuC,GAAG,CAAC,UAAU,CAAC,EAAEJ,CAAC,CAAC;MACvD,IAAI,CAACC,MAAM,EAAE,OAAO,KAAK;MACzB,MAAMI,QAAQ,GAAG9B,EAAE,CAAC+B,IAAI,CAACL,MAAM,EAAEpC,EAAE,CAACuC,GAAG,CAAC,UAAU,CAAC,CAAC;MACpD,IAAIC,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE,OAAO,KAAK;MACrC,MAAMC,QAAQ,GAAGR,CAAC,CAACjB,GAAG;MACtB,KAAK,IAAI0B,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,QAAQ,CAACE,MAAM,EAAEE,CAAC,EAAE,EAAE;QACxC,MAAMC,SAAS,GAAGL,QAAQ,CAACI,CAAC,CAAC,CAAC1B,GAAG;QACjC,IACEyB,QAAQ,CAACD,MAAM,GAAGG,SAAS,CAACH,MAAM,IAClCC,QAAQ,CAACvB,UAAU,CAACQ,eAAe,CAACiB,SAAS,CAAC,CAAC,EAC/C;UACA,OAAO,IAAI;QACb;QACA,IACEF,QAAQ,CAACG,QAAQ,CAAC,MAAM,CAAC,IACzBD,SAAS,CAACC,QAAQ,CAAC,MAAM,CAAC,IAC1BlB,eAAe,CAACe,QAAQ,CAAC,KAAKf,eAAe,CAACiB,SAAS,CAAC,EACxD;UACA,OAAO,IAAI;QACb;MACF;MACA,OAAO,KAAK;IACd,CAAC;;IAED;IACA;IACA,MAAME,UAAU,GAAG,SAAAA,CAAUZ,CAAC,EAAE;MAC9B,MAAMa,CAAC,GAAGb,CAAC,CAACjB,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC,CAACc,KAAK,CAAC,CAAC,CAAC,CAAC,EAAC;MACrC,MAAMgB,MAAM,GAAG,SAAAA,CAAUpB,GAAG,EAAE;QAC5B,IAAI;UACF,OAAOqB,kBAAkB,CAACrB,GAAG,CAAC;QAChC,CAAC,CAAC,OAAOhD,CAAC,EAAE;UACV,OAAOgD,GAAG;QACZ;MACF,CAAC;MACDsB,SAAS,CAACC,WAAW,GAAGH,MAAM,CAACD,CAAC,CAAC,CAAC,CAAC,CAAC;MACpCK,QAAQ,CAACD,WAAW,GAAGH,MAAM,CAACD,CAAC,CAAC,CAAC,CAAC,CAAC;MACnCM,QAAQ,CAACF,WAAW,GAAGH,MAAM,CAACrB,eAAe,CAACoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAMO,MAAM,GAAG,SAAAA,CAAUC,OAAO,EAAEC,KAAK,EAAE;MACvC,OAAO,IAAIC,OAAO,CAAC,UAAUC,OAAO,EAAE;QACpCF,KAAK,GAAGA,KAAK,IAAI,CAAC;QAClB,IAAI,CAAClC,OAAO,CAACE,KAAK,EAAE,OAAOkC,OAAO,CAAC,IAAI,CAAC;QACxC;QACA,MAAMvB,MAAM,GACV1B,EAAE,CAAC2B,GAAG,CAACC,SAAS,EAAEtC,EAAE,CAACuC,GAAG,CAAC,UAAU,CAAC,EAAEiB,OAAO,CAAC,IAAIA,OAAO,CAACI,GAAG,CAAC,CAAC;QACjE,IAAI,CAACxB,MAAM,EAAE,OAAOuB,OAAO,CAAC,IAAI,CAAC;QACjCjD,EAAE,CAACmD,OAAO,CAACC,IAAI,CAAC1B,MAAM,CAAC,CAAC2B,IAAI,CAAC,UAAUC,IAAI,EAAE;UAC3C,MAAMxB,QAAQ,GAAG9B,EAAE,CAAC+B,IAAI,CAACL,MAAM,EAAEpC,EAAE,CAACuC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAC;UACrD;UACA,IAAI0B,CAAC;UACLzB,QAAQ,CAAC0B,IAAI,CAAC,CAAC,EAAC;UAChB,KAAK,IAAI9E,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGoD,QAAQ,CAACE,MAAM,EAAEtD,CAAC,EAAE,EAAE;YACxC,IAAIoE,OAAO,CAACtC,GAAG,KAAKsB,QAAQ,CAACpD,CAAC,CAAC,CAAC8B,GAAG,EAAE;cACnC+C,CAAC,GAAG,CAAC7E,CAAC,GAAG,CAAC,IAAIoD,QAAQ,CAACE,MAAM;cAC7B,IAAIuB,CAAC,KAAK,CAAC,EAAE;gBACX,IAAI,CAAC1C,OAAO,CAACG,WAAW,EAAE;kBACxB,IAAIH,OAAO,CAACI,IAAI,EAAE;oBAChB,OAAOgC,OAAO,CAACnB,QAAQ,CAACyB,CAAC,CAAC,CAAC;kBAC7B;kBACA,OAAON,OAAO,CAAC,IAAI,CAAC,EAAC;gBACvB,CAAC,MAAM;kBACL;kBACA,IAAIF,KAAK,KAAK,CAAC,IAAI,CAAClC,OAAO,CAACG,WAAW,EAAE,OAAOiC,OAAO,CAAC,IAAI,CAAC,EAAC;kBAC9DJ,MAAM,CAACnB,MAAM,EAAEqB,KAAK,GAAG,CAAC,CAAC,CAACM,IAAI,CAAC,UAAUI,OAAO,EAAE;oBAChD,IAAIA,OAAO,EAAE;sBACXzD,EAAE,CAACmD,OAAO,CAACC,IAAI,CAACK,OAAO,CAAC,CAACJ,IAAI,CAAC,UAAUC,IAAI,EAAE;wBAC5C,MAAMxB,QAAQ,GAAG9B,EAAE,CAAC+B,IAAI,CAAC0B,OAAO,EAAEnE,EAAE,CAACuC,GAAG,CAAC,UAAU,CAAC,CAAC;wBACrD,IAAIC,QAAQ,CAACE,MAAM,KAAK,CAAC,EAAE,OAAOiB,OAAO,CAAC,IAAI,CAAC;wBAC/CnB,QAAQ,CAAC0B,IAAI,CAAC,CAAC;wBACfE,OAAO,CAACC,GAAG,CAAC,aAAa,GAAGF,OAAO,CAAC;wBACpC,OAAOR,OAAO,CAACnB,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAC;sBAC9B,CAAC,CAAC;oBACJ;kBACF,CAAC,CAAC;gBACJ;cACF,CAAC,MAAM;gBACL,OAAOmB,OAAO,CAACnB,QAAQ,CAACyB,CAAC,CAAC,CAAC;cAC7B;YACF;UACF,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;IACJ,CAAC;IACD,MAAMK,aAAa,GAAG,SAAAA,CAAUC,KAAK,EAAE;MACrC,MAAMf,OAAO,GAAG9C,EAAE,CAAC8D,GAAG,CAACD,KAAK,CAACE,MAAM,CAACC,YAAY,CAAC,KAAK,CAAC,CAAC;MACxD,IAAI,CAACnD,OAAO,CAACE,KAAK,EAAE;MACpB,MAAMkD,OAAO,GAAG,SAAAA,CAAUC,GAAG,EAAE;QAC7B,MAAMpB,OAAO,GAAGoB,GAAG;QACnBrB,MAAM,CAACC,OAAO,CAAC,CAACO,IAAI,CAAC,UAAUc,IAAI,EAAE;UACnC,IAAI,CAACA,IAAI,EAAE;YACTT,OAAO,CAACC,GAAG,CAAC,kBAAkB,GAAGb,OAAO,CAAC;YACzC;UACF;UACA,IAAI,CAACtB,cAAc,CAAC2C,IAAI,CAAC,EAAE;YACzBT,OAAO,CAACC,GAAG,CAAC,eAAe,GAAGQ,IAAI,CAAC;YACnC9B,UAAU,CAAC8B,IAAI,CAAC;YAChBC,UAAU,CAACC,WAAW,CAACC,YAAY,CAACH,IAAI,EAAE,IAAI,CAAC,CAAC,EAAC;YACjDC,UAAU,CAACG,WAAW,CAACV,KAAK,CAACE,MAAM,CAAC;UACtC,CAAC,MAAM;YACLL,OAAO,CAACC,GAAG,CAAC,qBAAqB,GAAGQ,IAAI,CAAC;YACzCF,OAAO,CAACE,IAAI,CAAC;UACf;QACF,CAAC,CAAC;MACJ,CAAC;MACDF,OAAO,CAACnB,OAAO,CAAC;IAClB,CAAC;IAED,MAAMwB,YAAY,GAAG,SAAAA,CAAUE,IAAI,EAAE1D,QAAQ,EAAE;MAC7C,MAAM2D,KAAK,GAAG7D,GAAG,CAAC8D,aAAa,CAAC,OAAO,CAAC;MACxCD,KAAK,CAACE,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC;MACrC;MACA3E,EAAE,CAACmD,OAAO,CAACyB,MAAM,CAACJ,IAAI,CAAChE,GAAG,CAAC,CACxB6C,IAAI,CAAC,UAAUwB,QAAQ,EAAE;QACxB,OAAOA,QAAQ,CAACC,IAAI,CAAC,CAAC;MACxB,CAAC,CAAC,CACDzB,IAAI,CAAC,UAAU0B,MAAM,EAAE;QACtB,MAAMC,SAAS,GAAGC,GAAG,CAACC,eAAe,CAACH,MAAM,CAAC;QAC7CN,KAAK,CAACE,YAAY,CAAC,KAAK,EAAEK,SAAS,CAAC,EAAC;MACvC,CAAC,CAAC;MAEJ,IAAIlE,QAAQ,EAAE;QACZ2D,KAAK,CAACE,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,EAAC;MAC7C;MACAF,KAAK,CAACU,gBAAgB,CAAC,OAAO,EAAEvB,aAAa,EAAE,KAAK,CAAC;MACrD,OAAOa,KAAK;IACd,CAAC;IAED,MAAMW,GAAG,GAAGxE,GAAG,CAAC8D,aAAa,CAAC,KAAK,CAAC;IACpC,MAAMW,KAAK,GAAGD,GAAG,CAACf,WAAW,CAACzD,GAAG,CAAC8D,aAAa,CAAC,OAAO,CAAC,CAAC;IACzD,MAAMY,UAAU,GAAG,uDAAuD;IAC1E,MAAM7C,SAAS,GAAG4C,KAAK,CAAChB,WAAW,CAACzD,GAAG,CAAC8D,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5DjC,SAAS,CAAC8C,KAAK,CAACC,OAAO,GAAGF,UAAU;IACpC,MAAM3C,QAAQ,GAAG0C,KAAK,CAAChB,WAAW,CAACzD,GAAG,CAAC8D,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3D/B,QAAQ,CAAC4C,KAAK,CAACC,OAAO,GAAGF,UAAU;IACnC,MAAM1C,QAAQ,GAAGyC,KAAK,CAAChB,WAAW,CAACzD,GAAG,CAAC8D,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3D9B,QAAQ,CAAC2C,KAAK,CAACC,OAAO,GAAGF,UAAU;IACnC,MAAMlB,UAAU,GAAGiB,KAAK,CAAChB,WAAW,CAACzD,GAAG,CAAC8D,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7DrC,UAAU,CAACvC,OAAO,CAAC;IACnBsE,UAAU,CAACC,WAAW,CAACC,YAAY,CAACxE,OAAO,EAAEe,OAAO,CAACC,QAAQ,CAAC,CAAC;IAE/D,IAAI,CAACd,EAAE,CAACyF,KAAK,CAAC7D,SAAS,EAAEtC,EAAE,CAACuC,GAAG,CAAC,UAAU,CAAC,EAAE/B,OAAO,CAAC,IAAIA,OAAO,CAACoD,GAAG,CAAC,CAAC,EAAE;MACtElD,EAAE,CAACmD,OAAO,CAACC,IAAI,CAACtD,OAAO,CAACoD,GAAG,CAAC,CAAC,CAAC,EAAC;IACjC;IAEA,OAAOkC,GAAG;EACZ;AACF,CAAC,EAED","ignoreList":[]} \ No newline at end of file diff --git a/dist/classInstancePane.js b/dist/classInstancePane.js new file mode 100644 index 00000000..0b9f450e --- /dev/null +++ b/dist/classInstancePane.js @@ -0,0 +1,92 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.classInstancePane = void 0; +var UI = _interopRequireWildcard(require("solid-ui-jss")); +var $rdf = _interopRequireWildcard(require("rdflib")); +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } +/* Class member Pane + ** + ** This outline pane lists the members of a class + */ + +const ns = UI.ns; +const classInstancePane = exports.classInstancePane = { + icon: UI.icons.originalIconBase + 'tango/22-folder-open.png', + name: 'classInstance', + // Create a new folder in a Solid system, + + audience: [ns.solid('PowerUser')], + label: function (subject, context) { + const kb = context.session.store; + const n = kb.each(undefined, ns.rdf('type'), subject).length; + if (n > 0) return 'List (' + n + ')'; // Show how many in hover text + return null; // Suppress pane otherwise + }, + render: function (subject, context) { + const dom = context.dom; + const outliner = context.getOutliner(dom); + const kb = context.session.store; + const complain = function complain(message, color) { + const pre = dom.createElement('pre'); + pre.setAttribute('style', 'background-color: ' + color || '#eed' + ';'); + div.appendChild(pre); + pre.appendChild(dom.createTextNode(message)); + }; + const div = dom.createElement('div'); + div.setAttribute('class', 'instancePane'); + div.setAttribute('style', ' border-top: solid 1px #777; border-bottom: solid 1px #777; margin-top: 0.5em; margin-bottom: 0.5em '); + + // If this is a class, look for all both explicit and implicit + const sts = kb.statementsMatching(undefined, ns.rdf('type'), subject); + if (sts.length > 0) { + const already = {}; + const more = []; + sts.forEach(st => { + already[st.subject.toNT()] = st; + }); + for (const nt in kb.findMembersNT(subject)) { + if (!already[nt]) { + more.push($rdf.st(kb.fromNT(nt), ns.rdf('type'), subject)); // @@ no provenance + } + } + if (more.length) { + complain('There are ' + sts.length + ' explicit and ' + more.length + ' implicit members of ' + UI.utils.label(subject)); + } + if (subject.sameTerm(ns.rdf('Property'))) { + // / Do not find all properties used as properties .. unless look at kb index + } else if (subject.sameTerm(ns.rdfs('Class'))) { + const uses = kb.statementsMatching(undefined, ns.rdf('type'), undefined); + const usedTypes = {}; + uses.forEach(function (st) { + usedTypes[st.object] = st; + }); // Get unique + const used = []; + for (const i in usedTypes) { + used.push($rdf.st($rdf.sym(i), ns.rdf('type'), ns.rdfs('Class'))); + } + complain('Total of ' + uses.length + ' type statements and ' + used.length + ' unique types.'); + } + if (sts.length > 10) { + const tr = dom.createElement('TR'); + tr.appendChild(dom.createTextNode('' + sts.length)); + // tr.AJAR_statement=sts[i] + div.appendChild(tr); + } + outliner.appendPropertyTRs(div, sts, true, function (_pred) { + return true; + }); + if (more.length) { + complain('Implicit:'); + outliner.appendPropertyTRs(div, more, true, function (_pred) { + return true; + }); + } + } + return div; + } +}; +// ends +//# sourceMappingURL=classInstancePane.js.map \ No newline at end of file diff --git a/dist/classInstancePane.js.map b/dist/classInstancePane.js.map new file mode 100644 index 00000000..052b2bb2 --- /dev/null +++ b/dist/classInstancePane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"classInstancePane.js","names":["UI","_interopRequireWildcard","require","$rdf","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ns","classInstancePane","exports","icon","icons","originalIconBase","name","audience","solid","label","subject","context","kb","session","store","each","undefined","rdf","length","render","dom","outliner","getOutliner","complain","message","color","pre","createElement","setAttribute","div","appendChild","createTextNode","sts","statementsMatching","already","more","forEach","st","toNT","nt","findMembersNT","push","fromNT","utils","sameTerm","rdfs","uses","usedTypes","object","used","sym","tr","appendPropertyTRs","_pred"],"sources":["../src/classInstancePane.js"],"sourcesContent":["/* Class member Pane\n **\n ** This outline pane lists the members of a class\n */\n\nimport * as UI from 'solid-ui-jss'\nimport * as $rdf from 'rdflib'\n\nconst ns = UI.ns\n\nexport const classInstancePane = {\n icon: UI.icons.originalIconBase + 'tango/22-folder-open.png',\n\n name: 'classInstance',\n\n // Create a new folder in a Solid system,\n\n audience: [ns.solid('PowerUser')],\n\n label: function (subject, context) {\n const kb = context.session.store\n const n = kb.each(undefined, ns.rdf('type'), subject).length\n if (n > 0) return 'List (' + n + ')' // Show how many in hover text\n return null // Suppress pane otherwise\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const outliner = context.getOutliner(dom)\n const kb = context.session.store\n const complain = function complain (message, color) {\n const pre = dom.createElement('pre')\n pre.setAttribute('style', 'background-color: ' + color || '#eed' + ';')\n div.appendChild(pre)\n pre.appendChild(dom.createTextNode(message))\n }\n const div = dom.createElement('div')\n div.setAttribute('class', 'instancePane')\n div.setAttribute(\n 'style',\n ' border-top: solid 1px #777; border-bottom: solid 1px #777; margin-top: 0.5em; margin-bottom: 0.5em '\n )\n\n // If this is a class, look for all both explicit and implicit\n const sts = kb.statementsMatching(undefined, ns.rdf('type'), subject)\n if (sts.length > 0) {\n const already = {}\n const more = []\n sts.forEach(st => {\n already[st.subject.toNT()] = st\n })\n for (const nt in kb.findMembersNT(subject)) {\n if (!already[nt]) {\n more.push($rdf.st(kb.fromNT(nt), ns.rdf('type'), subject)) // @@ no provenance\n }\n }\n if (more.length) {\n complain(\n 'There are ' +\n sts.length +\n ' explicit and ' +\n more.length +\n ' implicit members of ' +\n UI.utils.label(subject)\n )\n }\n if (subject.sameTerm(ns.rdf('Property'))) {\n // / Do not find all properties used as properties .. unless look at kb index\n } else if (subject.sameTerm(ns.rdfs('Class'))) {\n const uses = kb.statementsMatching(undefined, ns.rdf('type'), undefined)\n const usedTypes = {}\n uses.forEach(function (st) {\n usedTypes[st.object] = st\n }) // Get unique\n const used = []\n for (const i in usedTypes) {\n used.push($rdf.st($rdf.sym(i), ns.rdf('type'), ns.rdfs('Class')))\n }\n complain(\n 'Total of ' +\n uses.length +\n ' type statements and ' +\n used.length +\n ' unique types.'\n )\n }\n\n if (sts.length > 10) {\n const tr = dom.createElement('TR')\n tr.appendChild(dom.createTextNode('' + sts.length))\n // tr.AJAR_statement=sts[i]\n div.appendChild(tr)\n }\n\n outliner.appendPropertyTRs(div, sts, true, function (_pred) {\n return true\n })\n\n if (more.length) {\n complain('Implicit:')\n outliner.appendPropertyTRs(div, more, true, function (_pred) {\n return true\n })\n }\n }\n\n return div\n }\n}\n// ends\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/dashboard/basicPreferences.js b/dist/dashboard/basicPreferences.js new file mode 100644 index 00000000..bfa7def2 --- /dev/null +++ b/dist/dashboard/basicPreferences.js @@ -0,0 +1,147 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.basicPreferencesPane = void 0; +var _rdflib = require("rdflib"); +var _solidUiJss = require("solid-ui-jss"); +/* babel-plugin-inline-import './ontologyData.ttl' */ +const ontologyData = "@prefix rdf: .\n@prefix rdfs: .\n@prefix solid: .\n@prefix foaf: .\n@prefix schema: .\n@prefix ui: .\n@prefix vcard: .\n@prefix : <#>.\n\nsolid:User a rdfs:Class;\n rdfs:label \"user\"@en, \"utilisateur\"@fr;\n rdfs:comment \"\"\"Any person who might use a Solid-based system\"\"\";\n rdfs:subClassOf foaf:Person, schema:Person, vcard:Individual.\n\n# Since these options are opt-in, it is a bit strange to have new users opt in\n# That they are new users - also we do not use this class for anything specific\n# yet\n# solid:NewUser a rdfs:Class;\n# rdfs:label \"new user\"@en;\n# rdfs:comment \"\"\"A person who might use a Solid-based system who has a low\n# level of familiarity with technical details.\"\"\";\n# rdfs:subClassOf solid:User.\n\nsolid:PowerUser a rdfs:Class;\n rdfs:label \"power user\"@en;\n rdfs:comment \"\"\"A person who might use a Solid-based system\n who is prepared to be given a more complex interface in order\n to be provided with more pwerful features.\"\"\";\n rdfs:subClassOf solid:User.\n\n solid:Developer a rdfs:Class;\n rdfs:label \"Developer\";\n rdfs:comment \"\"\"Any person who might use a Solid-based system,\n who has software development skills.\"\"\";\n rdfs:subClassOf solid:User.\n"; +/* babel-plugin-inline-import './preferencesFormText.ttl' */ +const preferencesFormText = "@prefix rdf: .\n@prefix solid: .\n@prefix ui: .\n@prefix : <#>.\n\n:this \"Basic preferences\" ;\n a ui:Form ;\n ui:part :categorizeUser, :privateComment, :personalInformationHeading;\n ui:parts ( :personalInformationHeading :privateComment :categorizeUser ).\n\n:personalInformationHeading a ui:Heading;\n ui:contents \"Personal information\".\n\n:privateComment a ui:Comment;\n ui:contents \"This information is private.\".\n\n:categorizeUser a ui:Classifier;\n ui:label \"Level of user\"; ui:property rdf:type ; ui:category solid:User.\n"; +const basicPreferencesPane = exports.basicPreferencesPane = { + icon: _solidUiJss.icons.iconBase + 'noun_Sliders_341315_000000.svg', + name: 'basicPreferences', + label: _subject => { + return null; + }, + // Render the pane + // The subject should be the logged in user. + render: (subject, context) => { + const dom = context.dom; + const store = context.session.store; + function complainIfBad(ok, mess) { + if (ok) return; + container.appendChild(_solidUiJss.widgets.errorMessageBlock(dom, mess, '#fee')); + } + const container = dom.createElement('div'); + const formArea = setupUserTypesSection(container, dom); + function loadData(doc, turtle) { + doc = doc.doc(); // remove # from URI if nec + if (!store.holds(undefined, undefined, undefined, doc)) { + // If not loaded already + ; + (0, _rdflib.parse)(turtle, store, doc.uri, 'text/turtle', null); // Load form directly + } + } + const preferencesForm = store.sym('urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597#this'); + loadData(preferencesForm, preferencesFormText); + const ontologyExtra = store.sym('urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597-ONT'); + loadData(ontologyExtra, ontologyData); + async function doRender() { + const renderContext = await _solidUiJss.login.ensureLoadedPreferences({ + dom, + div: container + }); + if (!renderContext.preferencesFile) { + // Could be CORS + console.log('Not doing private class preferences as no access to preferences file. ' + renderContext.preferencesFileError); + return; + } + const appendedForm = _solidUiJss.widgets.appendForm(dom, formArea, {}, renderContext.me, preferencesForm, renderContext.preferencesFile, complainIfBad); + appendedForm.style.borderStyle = 'none'; + const trustedApplicationsView = context.session.paneRegistry.byName('trustedApplications'); + if (trustedApplicationsView) { + container.appendChild(trustedApplicationsView.render(null, context)); + } + + // @@ TODO Remove need for casting as any and bang (!) syntax + addDeleteSection(container, store, renderContext.me, dom); + } + doRender(); + return container; + } +}; +function setupUserTypesSection(container, dom) { + const formContainer = createSection(container, dom, 'User types'); + const description = formContainer.appendChild(dom.createElement('p')); + description.innerText = 'Here you can self-assign user types to help the data browser know which views you would like to access.'; + const userTypesLink = formContainer.appendChild(dom.createElement('a')); + userTypesLink.href = 'https://github.com/solidos/userguide/#role'; + userTypesLink.innerText = 'Read more'; + const formArea = formContainer.appendChild(dom.createElement('div')); + return formArea; +} +var _default = exports.default = basicPreferencesPane; // ends +function addDeleteSection(container, store, profile, dom) { + const section = createSection(container, dom, 'Delete account'); + const podServerNodes = store.each(profile, _solidUiJss.ns.space('storage'), null, profile.doc()); + const podServers = podServerNodes.map(node => node.value); + const list = section.appendChild(dom.createElement('ul')); + podServers.forEach(async server => { + const deletionLink = await generateDeletionLink(server, dom); + if (deletionLink) { + const listItem = list.appendChild(dom.createElement('li')); + listItem.appendChild(deletionLink); + } + }); +} +async function generateDeletionLink(podServer, dom) { + const link = dom.createElement('a'); + link.textContent = `Delete your account at ${podServer}`; + const deletionUrl = await getDeletionUrlForServer(podServer); + if (typeof deletionUrl !== 'string') { + return null; + } + link.href = deletionUrl; + return link; +} + +/** + * Hacky way to get the deletion link to a Pod + * + * This function infers the deletion link by assuming the URL structure of Node Solid server. + * In the future, Solid will hopefully provide a standardised way of discovering the deletion link: + * https://github.com/solidos/data-interoperability-panel/issues/18 + * + * If NSS is in multi-user mode (the case on inrupt.net and solid.community), the deletion URL for + * vincent.dev.inrupt.net would be at dev.inrupt.net/account/delete. In single-user mode, the + * deletion URL would be at vincent.dev.inrupt.net/account/delete. + * + * @param server Pod server containing the user's account. + * @returns URL of the page that Node Solid Server would offer to delete the account, or null if + * the URLs we tried give invalid responses. + */ +async function getDeletionUrlForServer(server) { + const singleUserUrl = new URL(server); + const multiUserUrl = new URL(server); + multiUserUrl.pathname = singleUserUrl.pathname = '/account/delete'; + const hostnameParts = multiUserUrl.hostname.split('.'); + // Remove `vincent.` from `vincent.dev.inrupt.net`, for example: + multiUserUrl.hostname = hostnameParts.slice(1).join('.'); + const multiUserNssResponse = await fetch(multiUserUrl.href, { + method: 'HEAD' + }); + if (multiUserNssResponse.ok) { + return multiUserUrl.href; + } + const singleUserNssResponse = await fetch(singleUserUrl.href, { + method: 'HEAD' + }); + if (singleUserNssResponse.ok) { + return singleUserUrl.href; + } + return null; +} +function createSection(container, dom, title) { + const section = container.appendChild(dom.createElement('div')); + section.style.border = '0.3em solid #418d99'; + section.style.borderRadius = '0.5em'; + section.style.padding = '0.7em'; + section.style.marginTop = '0.7em'; + const titleElement = section.appendChild(dom.createElement('h3')); + titleElement.innerText = title; + return section; +} +//# sourceMappingURL=basicPreferences.js.map \ No newline at end of file diff --git a/dist/dashboard/basicPreferences.js.map b/dist/dashboard/basicPreferences.js.map new file mode 100644 index 00000000..c6829883 --- /dev/null +++ b/dist/dashboard/basicPreferences.js.map @@ -0,0 +1 @@ +{"version":3,"file":"basicPreferences.js","names":["_rdflib","require","_solidUiJss","ontologyData","preferencesFormText","basicPreferencesPane","exports","icon","icons","iconBase","name","label","_subject","render","subject","context","dom","store","session","complainIfBad","ok","mess","container","appendChild","widgets","errorMessageBlock","createElement","formArea","setupUserTypesSection","loadData","doc","turtle","holds","undefined","parse","uri","preferencesForm","sym","ontologyExtra","doRender","renderContext","login","ensureLoadedPreferences","div","preferencesFile","console","log","preferencesFileError","appendedForm","appendForm","me","style","borderStyle","trustedApplicationsView","paneRegistry","byName","addDeleteSection","formContainer","createSection","description","innerText","userTypesLink","href","_default","default","profile","section","podServerNodes","each","ns","space","podServers","map","node","value","list","forEach","server","deletionLink","generateDeletionLink","listItem","podServer","link","textContent","deletionUrl","getDeletionUrlForServer","singleUserUrl","URL","multiUserUrl","pathname","hostnameParts","hostname","split","slice","join","multiUserNssResponse","fetch","method","singleUserNssResponse","title","border","borderRadius","padding","marginTop","titleElement"],"sources":["../../src/dashboard/basicPreferences.ts"],"sourcesContent":["import { PaneDefinition } from 'pane-registry'\nimport { IndexedFormula, NamedNode, parse, Store } from 'rdflib'\nimport { icons, login, ns, widgets } from 'solid-ui-jss'\nimport ontologyData from './ontologyData.ttl'\nimport preferencesFormText from './preferencesFormText.ttl'\n\nexport const basicPreferencesPane: PaneDefinition = {\n icon: icons.iconBase + 'noun_Sliders_341315_000000.svg',\n name: 'basicPreferences',\n label: _subject => {\n return null\n },\n\n // Render the pane\n // The subject should be the logged in user.\n render: (subject, context) => {\n const dom = context.dom\n const store = context.session.store as Store\n\n function complainIfBad (ok: Boolean, mess: any) {\n if (ok) return\n container.appendChild(widgets.errorMessageBlock(dom, mess, '#fee'))\n }\n\n const container = dom.createElement('div')\n\n const formArea = setupUserTypesSection(container, dom)\n\n function loadData (doc: NamedNode, turtle: String) {\n doc = doc.doc() // remove # from URI if nec\n if (!store.holds(undefined, undefined, undefined, doc)) {\n // If not loaded already\n ;(parse as any)(turtle, store, doc.uri, 'text/turtle', null) // Load form directly\n }\n }\n\n const preferencesForm = store.sym(\n 'urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597#this'\n )\n loadData(preferencesForm, preferencesFormText)\n\n const ontologyExtra = store.sym(\n 'urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597-ONT'\n )\n loadData(ontologyExtra, ontologyData)\n\n async function doRender () {\n const renderContext = await login.ensureLoadedPreferences({\n dom,\n div: container\n })\n if (!renderContext.preferencesFile) {\n // Could be CORS\n console.log(\n 'Not doing private class preferences as no access to preferences file. ' +\n renderContext.preferencesFileError\n )\n return\n }\n const appendedForm = widgets.appendForm(\n dom,\n formArea,\n {},\n renderContext.me,\n preferencesForm,\n renderContext.preferencesFile,\n complainIfBad\n )\n appendedForm.style.borderStyle = 'none'\n\n const trustedApplicationsView = context.session.paneRegistry.byName('trustedApplications')\n if (trustedApplicationsView) {\n container.appendChild(trustedApplicationsView.render(null, context))\n }\n\n // @@ TODO Remove need for casting as any and bang (!) syntax\n addDeleteSection(container, store, renderContext.me!, dom)\n }\n\n doRender()\n\n return container\n }\n}\n\nfunction setupUserTypesSection (\n container: Element,\n dom: HTMLDocument\n): Element {\n const formContainer = createSection(container, dom, 'User types')\n\n const description = formContainer.appendChild(dom.createElement('p'))\n description.innerText = 'Here you can self-assign user types to help the data browser know which views you would like to access.'\n\n const userTypesLink = formContainer.appendChild(dom.createElement('a'))\n userTypesLink.href = 'https://github.com/solidos/userguide/#role'\n userTypesLink.innerText = 'Read more'\n\n const formArea = formContainer.appendChild(dom.createElement('div'))\n\n return formArea\n}\n\nexport default basicPreferencesPane\n\n// ends\n\nfunction addDeleteSection (\n container: HTMLElement,\n store: IndexedFormula,\n profile: NamedNode,\n dom: HTMLDocument\n): void {\n const section = createSection(container, dom, 'Delete account')\n\n const podServerNodes = store.each(profile, ns.space('storage'), null, profile.doc())\n const podServers = podServerNodes.map(node => node.value)\n\n const list = section.appendChild(dom.createElement('ul'))\n\n podServers.forEach(async server => {\n const deletionLink = await generateDeletionLink(server, dom)\n if (deletionLink) {\n const listItem = list.appendChild(dom.createElement('li'))\n listItem.appendChild(deletionLink)\n }\n })\n}\n\nasync function generateDeletionLink (\n podServer: string,\n dom: HTMLDocument\n): Promise {\n const link = dom.createElement('a')\n link.textContent = `Delete your account at ${podServer}`\n const deletionUrl = await getDeletionUrlForServer(podServer)\n if (typeof deletionUrl !== 'string') {\n return null\n }\n link.href = deletionUrl\n return link\n}\n\n/**\n * Hacky way to get the deletion link to a Pod\n *\n * This function infers the deletion link by assuming the URL structure of Node Solid server.\n * In the future, Solid will hopefully provide a standardised way of discovering the deletion link:\n * https://github.com/solidos/data-interoperability-panel/issues/18\n *\n * If NSS is in multi-user mode (the case on inrupt.net and solid.community), the deletion URL for\n * vincent.dev.inrupt.net would be at dev.inrupt.net/account/delete. In single-user mode, the\n * deletion URL would be at vincent.dev.inrupt.net/account/delete.\n *\n * @param server Pod server containing the user's account.\n * @returns URL of the page that Node Solid Server would offer to delete the account, or null if\n * the URLs we tried give invalid responses.\n */\nasync function getDeletionUrlForServer (\n server: string\n): Promise {\n const singleUserUrl = new URL(server)\n const multiUserUrl = new URL(server)\n multiUserUrl.pathname = singleUserUrl.pathname = '/account/delete'\n\n const hostnameParts = multiUserUrl.hostname.split('.')\n // Remove `vincent.` from `vincent.dev.inrupt.net`, for example:\n multiUserUrl.hostname = hostnameParts.slice(1).join('.')\n\n const multiUserNssResponse = await fetch(multiUserUrl.href, {\n method: 'HEAD'\n })\n if (multiUserNssResponse.ok) {\n return multiUserUrl.href\n }\n\n const singleUserNssResponse = await fetch(singleUserUrl.href, {\n method: 'HEAD'\n })\n if (singleUserNssResponse.ok) {\n return singleUserUrl.href\n }\n return null\n}\n\nfunction createSection (\n container: Element,\n dom: HTMLDocument,\n title: string\n): Element {\n const section = container.appendChild(dom.createElement('div'))\n section.style.border = '0.3em solid #418d99'\n section.style.borderRadius = '0.5em'\n section.style.padding = '0.7em'\n section.style.marginTop = '0.7em'\n\n const titleElement = section.appendChild(dom.createElement('h3'))\n titleElement.innerText = title\n\n return section\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/dashboard/dashboardPane.js b/dist/dashboard/dashboardPane.js new file mode 100644 index 00000000..be713c98 --- /dev/null +++ b/dist/dashboard/dashboardPane.js @@ -0,0 +1,69 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.dashboardPane = void 0; +var _solidUiJss = require("solid-ui-jss"); +var _solidLogicJss = require("solid-logic-jss"); +var _homepage = require("./homepage"); +const dashboardPane = exports.dashboardPane = { + icon: _solidUiJss.icons.iconBase + 'noun_547570.svg', + name: 'dashboard', + label: subject => { + console.log(); + if (subject.uri === subject.site().uri) { + return 'Dashboard'; + } + return null; + }, + render: (subject, context) => { + console.log('Dashboard Pane Render'); + const dom = context.dom; + const container = dom.createElement('div'); + const runBuildPage = () => { + container.innerHTML = ''; + buildPage(container, _solidLogicJss.authn.currentUser() || null, context, subject); + }; + _solidLogicJss.authSession.events.on('login', () => { + // console.log('On Login') + runBuildPage(); + }); + _solidLogicJss.authSession.events.on('sessionRestore', () => { + // console.log('On Session Restore') + runBuildPage(); + }); + // console.log('Initial Load') + runBuildPage(); + return container; + } +}; +function buildPage(container, webId, context, subject) { + // if uri then SolidOS is a browse.html web app + const uri = new URL(window.location.href).searchParams.get('uri'); + if (webId && (uri || webId.site().uri === subject.site().uri)) { + return buildDashboard(container, context); + } + return buildHomePage(container, subject); +} +function buildDashboard(container, context) { + // console.log('build dashboard') + // @@ TODO get a proper type + const outliner = context.getOutliner(context.dom); + outliner.getDashboard().then(dashboard => container.appendChild(dashboard)); +} +function buildHomePage(container, subject) { + // console.log('build home page') + const wrapper = document.createElement('div'); + container.appendChild(wrapper); + const shadow = wrapper.attachShadow({ + mode: 'open' + }); + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.href = '/common/css/bootstrap.min.css'; + shadow.appendChild(link); + (0, _homepage.generateHomepage)(subject, _solidLogicJss.store, _solidLogicJss.store.fetcher).then(homepage => shadow.appendChild(homepage)); +} +var _default = exports.default = dashboardPane; +//# sourceMappingURL=dashboardPane.js.map \ No newline at end of file diff --git a/dist/dashboard/dashboardPane.js.map b/dist/dashboard/dashboardPane.js.map new file mode 100644 index 00000000..79d10897 --- /dev/null +++ b/dist/dashboard/dashboardPane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dashboardPane.js","names":["_solidUiJss","require","_solidLogicJss","_homepage","dashboardPane","exports","icon","icons","iconBase","name","label","subject","console","log","uri","site","render","context","dom","container","createElement","runBuildPage","innerHTML","buildPage","authn","currentUser","authSession","events","on","webId","URL","window","location","href","searchParams","get","buildDashboard","buildHomePage","outliner","getOutliner","getDashboard","then","dashboard","appendChild","wrapper","document","shadow","attachShadow","mode","link","rel","generateHomepage","store","fetcher","homepage","_default","default"],"sources":["../../src/dashboard/dashboardPane.ts"],"sourcesContent":["import { icons } from 'solid-ui-jss'\nimport { authn, authSession, store } from 'solid-logic-jss'\nimport { Fetcher, NamedNode } from 'rdflib'\nimport { generateHomepage } from './homepage'\nimport { DataBrowserContext, PaneDefinition } from 'pane-registry'\n\nexport const dashboardPane: PaneDefinition = {\n icon: icons.iconBase + 'noun_547570.svg',\n name: 'dashboard',\n label: subject => {\n console.log()\n if (subject.uri === subject.site().uri) {\n return 'Dashboard'\n }\n return null\n },\n render: (subject, context) => {\n console.log('Dashboard Pane Render')\n const dom = context.dom\n const container = dom.createElement('div')\n const runBuildPage = () => {\n container.innerHTML = ''\n buildPage(\n container,\n authn.currentUser() || null,\n context,\n subject\n )\n }\n\n authSession.events.on('login', () => {\n // console.log('On Login')\n runBuildPage()\n })\n authSession.events.on('sessionRestore', () => {\n // console.log('On Session Restore')\n runBuildPage()\n })\n // console.log('Initial Load')\n runBuildPage()\n\n return container\n }\n}\n\nfunction buildPage (\n container: HTMLElement,\n webId: NamedNode | null,\n context: DataBrowserContext,\n subject: NamedNode\n) {\n // if uri then SolidOS is a browse.html web app\n const uri = (new URL(window.location.href)).searchParams.get('uri')\n if (webId && (uri || webId.site().uri === subject.site().uri)) {\n return buildDashboard(container, context)\n }\n return buildHomePage(container, subject)\n}\n\nfunction buildDashboard (container: HTMLElement, context: DataBrowserContext) {\n // console.log('build dashboard')\n // @@ TODO get a proper type\n const outliner: any = context.getOutliner(context.dom)\n outliner\n .getDashboard()\n .then((dashboard: HTMLElement) => container.appendChild(dashboard))\n}\n\nfunction buildHomePage (container: HTMLElement, subject: NamedNode) {\n // console.log('build home page')\n const wrapper = document.createElement('div')\n container.appendChild(wrapper)\n const shadow = wrapper.attachShadow({ mode: 'open' })\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = '/common/css/bootstrap.min.css'\n shadow.appendChild(link)\n generateHomepage(subject, store, store.fetcher as Fetcher).then(homepage =>\n shadow.appendChild(homepage)\n )\n}\n\nexport default dashboardPane\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/dashboard/homepage.js b/dist/dashboard/homepage.js new file mode 100644 index 00000000..0dbef0e5 --- /dev/null +++ b/dist/dashboard/homepage.js @@ -0,0 +1,54 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.generateHomepage = generateHomepage; +var _rdflib = require("rdflib"); +var _solidUiJss = require("solid-ui-jss"); +async function generateHomepage(subject, store, fetcher) { + const ownersProfile = await loadProfile(subject, fetcher); + const name = getName(store, ownersProfile); + const wrapper = document.createElement('div'); + wrapper.classList.add('container'); + wrapper.appendChild(createTitle(ownersProfile.uri, name)); + wrapper.appendChild(createDataSection(name)); + return wrapper; +} +function createDataSection(name) { + const dataSection = document.createElement('section'); + const title = document.createElement('h2'); + title.innerText = 'Data'; + dataSection.appendChild(title); + const listGroup = document.createElement('div'); + listGroup.classList.add('list-group'); + dataSection.appendChild(listGroup); + const publicDataLink = document.createElement('a'); + publicDataLink.classList.add('list-group-item'); + publicDataLink.href = window.document.location.href + 'public/'; + publicDataLink.innerText = `View ${name}'s files`; + listGroup.appendChild(publicDataLink); + return dataSection; +} +function createTitle(uri, name) { + const profileLink = document.createElement('a'); + profileLink.href = uri; + profileLink.innerText = name; + const profileLinkPost = document.createElement('span'); + profileLinkPost.innerText = '\'s Pod'; + const title = document.createElement('h1'); + title.appendChild(profileLink); + title.appendChild(profileLinkPost); + return title; +} +async function loadProfile(subject, fetcher) { + const pod = subject.site().uri; + // TODO: This is a hack - we cannot assume that the profile is at this document, but we will live with it for now + const webId = (0, _rdflib.sym)(`${pod}profile/card#me`); + await fetcher.load(webId); + return webId; +} +function getName(store, ownersProfile) { + return store.anyValue(ownersProfile, _solidUiJss.ns.vcard('fn'), null, ownersProfile.doc()) || store.anyValue(ownersProfile, _solidUiJss.ns.foaf('name'), null, ownersProfile.doc()) || new URL(ownersProfile.uri).host.split('.')[0]; +} +//# sourceMappingURL=homepage.js.map \ No newline at end of file diff --git a/dist/dashboard/homepage.js.map b/dist/dashboard/homepage.js.map new file mode 100644 index 00000000..daff8ee0 --- /dev/null +++ b/dist/dashboard/homepage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"homepage.js","names":["_rdflib","require","_solidUiJss","generateHomepage","subject","store","fetcher","ownersProfile","loadProfile","name","getName","wrapper","document","createElement","classList","add","appendChild","createTitle","uri","createDataSection","dataSection","title","innerText","listGroup","publicDataLink","href","window","location","profileLink","profileLinkPost","pod","site","webId","sym","load","anyValue","ns","vcard","doc","foaf","URL","host","split"],"sources":["../../src/dashboard/homepage.ts"],"sourcesContent":["import { Fetcher, IndexedFormula, NamedNode, sym } from 'rdflib'\nimport { ns } from 'solid-ui-jss'\n\nexport async function generateHomepage (\n subject: NamedNode,\n store: IndexedFormula,\n fetcher: Fetcher\n): Promise {\n const ownersProfile = await loadProfile(subject, fetcher)\n const name = getName(store, ownersProfile)\n\n const wrapper = document.createElement('div')\n wrapper.classList.add('container')\n wrapper.appendChild(createTitle(ownersProfile.uri, name))\n wrapper.appendChild(createDataSection(name))\n\n return wrapper\n}\n\nfunction createDataSection (name: string): HTMLElement {\n const dataSection = document.createElement('section')\n\n const title = document.createElement('h2')\n title.innerText = 'Data'\n dataSection.appendChild(title)\n\n const listGroup = document.createElement('div')\n listGroup.classList.add('list-group')\n dataSection.appendChild(listGroup)\n\n const publicDataLink = document.createElement('a')\n publicDataLink.classList.add('list-group-item')\n publicDataLink.href = window.document.location.href + 'public/'\n publicDataLink.innerText = `View ${name}'s files`\n listGroup.appendChild(publicDataLink)\n\n return dataSection\n}\n\nfunction createTitle (uri: string, name: string): HTMLElement {\n const profileLink = document.createElement('a')\n profileLink.href = uri\n profileLink.innerText = name\n\n const profileLinkPost = document.createElement('span')\n profileLinkPost.innerText = '\\'s Pod'\n\n const title = document.createElement('h1')\n title.appendChild(profileLink)\n title.appendChild(profileLinkPost)\n\n return title\n}\n\nasync function loadProfile (\n subject: NamedNode,\n fetcher: Fetcher\n): Promise {\n const pod = subject.site().uri\n // TODO: This is a hack - we cannot assume that the profile is at this document, but we will live with it for now\n const webId = sym(`${pod}profile/card#me`)\n await fetcher.load(webId)\n return webId\n}\n\nfunction getName (store: IndexedFormula, ownersProfile: NamedNode): string {\n return (\n store.anyValue(ownersProfile, ns.vcard('fn'), null, ownersProfile.doc()) ||\n store.anyValue(ownersProfile, ns.foaf('name'), null, ownersProfile.doc()) ||\n new URL(ownersProfile.uri).host.split('.')[0]\n )\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/dataContentPane.js b/dist/dataContentPane.js new file mode 100644 index 00000000..828969ba --- /dev/null +++ b/dist/dataContentPane.js @@ -0,0 +1,260 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.dataContentPane = void 0; +var UI = _interopRequireWildcard(require("solid-ui-jss")); +var $rdf = _interopRequireWildcard(require("rdflib")); +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } +/* Data content Pane + ** + ** This pane shows the content of a particular RDF resource + ** or at least the RDF semantics we attribute to that resource. + */ + +// To do: - Only take data from one graph +// - Only do forwards not backward? +// - Expand automatically all the way down +// - original source view? Use ffox view source + +const ns = UI.ns; +const dataContentPane = exports.dataContentPane = { + icon: UI.icons.originalIconBase + 'rdf_flyer.24.gif', + name: 'dataContents', + audience: [ns.solid('Developer')], + label: function (subject, context) { + if ('http://www.w3.org/2007/ont/link#ProtocolEvent' in context.session.store.findTypeURIs(subject)) { + return null; + } + const n = context.session.store.statementsMatching(undefined, undefined, undefined, subject).length; + if (n === 0) return null; + return 'Data (' + n + ')'; + }, + /* + shouldGetFocus: function(subject) { + return store.whether(subject, UI.ns.rdf('type'), UI.ns.link('RDFDocument')) + }, + */ + statementsAsTables: function statementsAsTables(sts, context, initialRoots) { + const myDocument = context.dom; + // const outliner = context.getOutliner(myDocument) + const rep = myDocument.createElement('table'); + const sz = $rdf.Serializer(context.session.store); + const res = sz.rootSubjects(sts); + let roots = res.roots; + const subjects = res.subjects; + const loopBreakers = res.loopBreakers; + for (const x in loopBreakers) { + console.log('\tdataContentPane: loopbreaker:' + x); + } + const doneBnodes = {}; // For preventing looping + const referencedBnodes = {}; // Bnodes which need to be named alas + + // The property tree for a single subject or anonymous node + function propertyTree(subject) { + // print('Proprty tree for '+subject) + const rep = myDocument.createElement('table'); + let lastPred = null; + const sts = subjects[sz.toStr(subject)]; // relevant statements + if (!sts) { + // No statements in tree + rep.appendChild(myDocument.createTextNode('...')); // just empty bnode as object + return rep; + } + sts.sort(); + let same = 0; + let predicateTD; // The cell which holds the predicate + for (let i = 0; i < sts.length; i++) { + const st = sts[i]; + const tr = myDocument.createElement('tr'); + if (st.predicate.uri !== lastPred) { + if (lastPred && same > 1) { + predicateTD.setAttribute('rowspan', '' + same); + } + predicateTD = myDocument.createElement('td'); + predicateTD.setAttribute('class', 'pred'); + const anchor = myDocument.createElement('a'); + anchor.setAttribute('href', st.predicate.uri); + anchor.addEventListener('click', UI.widgets.openHrefInOutlineMode, true); + anchor.appendChild(myDocument.createTextNode(UI.utils.predicateLabelForXML(st.predicate))); + predicateTD.appendChild(anchor); + tr.appendChild(predicateTD); + lastPred = st.predicate.uri; + same = 0; + } + same++; + const objectTD = myDocument.createElement('td'); + objectTD.appendChild(objectTree(st.object)); + tr.appendChild(objectTD); + rep.appendChild(tr); + } + if (lastPred && same > 1) predicateTD.setAttribute('rowspan', '' + same); + return rep; + } + + // Convert a set of statements into a nested tree of tables + function objectTree(obj) { + let res, anchor; + switch (obj.termType) { + case 'NamedNode': + anchor = myDocument.createElement('a'); + anchor.setAttribute('href', obj.uri); + anchor.addEventListener('click', UI.widgets.openHrefInOutlineMode, true); + anchor.appendChild(myDocument.createTextNode(UI.utils.label(obj))); + return anchor; + case 'Literal': + if (!obj.datatype || !obj.datatype.uri) { + res = myDocument.createElement('div'); + res.setAttribute('style', 'white-space: pre-wrap;'); + res.textContent = obj.value; + return res; + } else if (obj.datatype.uri === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral') { + res = myDocument.createElement('div'); + res.setAttribute('class', 'embeddedXHTML'); + res.innerHTML = obj.value; // Try that @@@ beware embedded dangerous code + return res; + } + return myDocument.createTextNode(obj.value); + // placeholder - could be smarter, + + case 'BlankNode': + { + if (obj.toNT() in doneBnodes) { + // Break infinite recursion + referencedBnodes[obj.toNT()] = true; + const anchor = myDocument.createElement('a'); + anchor.setAttribute('href', '#' + obj.toNT().slice(2)); + anchor.setAttribute('class', 'bnodeRef'); + anchor.textContent = '*' + obj.toNT().slice(3); + return anchor; + } + doneBnodes[obj.toNT()] = true; // Flag to prevent infinite recursion in propertyTree + const newTable = propertyTree(obj); + doneBnodes[obj.toNT()] = newTable; // Track where we mentioned it first + if (UI.utils.ancestor(newTable, 'TABLE') && UI.utils.ancestor(newTable, 'TABLE').style.backgroundColor === 'white') { + newTable.style.backgroundColor = '#eee'; + } else { + newTable.style.backgroundColor = 'white'; + } + return newTable; + } + case 'Collection': + res = myDocument.createElement('table'); + res.setAttribute('class', 'collectionAsTables'); + for (let i = 0; i < obj.elements.length; i++) { + const tr = myDocument.createElement('tr'); + res.appendChild(tr); + tr.appendChild(objectTree(obj.elements[i])); + } + return res; + case 'Graph': + res = context.session.paneRegistry.byName('dataContents').statementsAsTables(obj.statements, context); + res.setAttribute('class', 'nestedFormula'); + return res; + case 'Variable': + res = myDocument.createTextNode('?' + obj.uri); + return res; + } + throw new Error('Unhandled node type: ' + obj.termType); + } + + // roots.sort() + + if (initialRoots) { + roots = initialRoots.concat(roots.filter(function (x) { + for (let i = 0; i < initialRoots.length; i++) { + // Max 2 + if (x.sameTerm(initialRoots[i])) return false; + } + return true; + })); + } + for (let i = 0; i < roots.length; i++) { + const tr = myDocument.createElement('tr'); + tr.setAttribute('style', `background-color: ${i % 2 === 0 ? '#f0f0f0' : 'white'};`); + rep.appendChild(tr); + const subjectTD = myDocument.createElement('td'); + tr.appendChild(subjectTD); + const TDTree = myDocument.createElement('td'); + tr.appendChild(TDTree); + const root = roots[i]; + if (root.termType === 'BlankNode') { + subjectTD.appendChild(myDocument.createTextNode(UI.utils.label(root))); // Don't recurse! + } else { + subjectTD.appendChild(objectTree(root)); // won't have tree + } + TDTree.appendChild(propertyTree(root)); + } + for (const bNT in referencedBnodes) { + // Add number to refer to + const table = doneBnodes[bNT]; + // let tr = myDocument.createElement('tr') + const anchor = myDocument.createElement('a'); + anchor.setAttribute('id', bNT.slice(2)); + anchor.setAttribute('class', 'bnodeDef'); + anchor.textContent = bNT.slice(3) + ')'; + table.insertBefore(anchor, table.firstChild); + } + return rep; + }, + // statementsAsTables + // View the data in a file in user-friendly way + render: function (subject, context) { + const myDocument = context.dom; + function alternativeRendering() { + const sz = $rdf.Serializer(context.session.store); + const res = sz.rootSubjects(sts); + const roots = res.roots; + const p = {}; + p.render = function (s2) { + const div = myDocument.createElement('div'); + div.setAttribute('class', 'withinDocumentPane'); + const plist = kb.statementsMatching(s2, undefined, undefined, subject); + outliner.appendPropertyTRs(div, plist, false, function (_pred, _inverse) { + return true; + }); + return div; + }; + for (let i = 0; i < roots.length; i++) { + const tr = myDocument.createElement('TR'); + const root = roots[i]; + tr.style.verticalAlign = 'top'; + const td = outliner.outlineObjectTD(root, undefined, tr); + tr.appendChild(td); + div.appendChild(tr); + outliner.outlineExpand(td, root, { + pane: p + }); + } + } + function mainRendering() { + const initialRoots = []; // Ordering: start with stuff about this doc + if (kb.holds(subject, undefined, undefined, subject)) { + initialRoots.push(subject); + } + // Then about the primary topic of the document if any + const ps = kb.any(subject, UI.ns.foaf('primaryTopic'), undefined, subject); + if (ps) initialRoots.push(ps); + div.appendChild(context.session.paneRegistry.byName('dataContents').statementsAsTables(sts, context, initialRoots)); + } + const outliner = context.getOutliner(myDocument); + const kb = context.session.store; + const div = myDocument.createElement('div'); + div.setAttribute('class', 'dataContentPane'); + // Because of smushing etc, this will not be a copy of the original source + // We could instead either fetch and re-parse the source, + // or we could keep all the pre-smushed triples. + const sts = kb.statementsMatching(undefined, undefined, undefined, subject); // @@ slow with current store! + + // eslint-disable-next-line no-constant-condition + if (false) { + // keep code + alternativeRendering(); + } else { + mainRendering(); + } + return div; + } +}; +//# sourceMappingURL=dataContentPane.js.map \ No newline at end of file diff --git a/dist/dataContentPane.js.map b/dist/dataContentPane.js.map new file mode 100644 index 00000000..07a8ed0c --- /dev/null +++ b/dist/dataContentPane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dataContentPane.js","names":["UI","_interopRequireWildcard","require","$rdf","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ns","dataContentPane","exports","icon","icons","originalIconBase","name","audience","solid","label","subject","context","session","store","findTypeURIs","statementsMatching","undefined","length","statementsAsTables","sts","initialRoots","myDocument","dom","rep","createElement","sz","Serializer","res","rootSubjects","roots","subjects","loopBreakers","x","console","log","doneBnodes","referencedBnodes","propertyTree","lastPred","toStr","appendChild","createTextNode","sort","same","predicateTD","st","tr","predicate","uri","setAttribute","anchor","addEventListener","widgets","openHrefInOutlineMode","utils","predicateLabelForXML","objectTD","objectTree","object","obj","termType","datatype","textContent","value","innerHTML","toNT","slice","newTable","ancestor","style","backgroundColor","elements","paneRegistry","byName","statements","Error","concat","filter","sameTerm","subjectTD","TDTree","root","bNT","table","insertBefore","firstChild","render","alternativeRendering","p","s2","div","plist","kb","outliner","appendPropertyTRs","_pred","_inverse","verticalAlign","td","outlineObjectTD","outlineExpand","pane","mainRendering","holds","push","ps","any","foaf","getOutliner"],"sources":["../src/dataContentPane.js"],"sourcesContent":["/* Data content Pane\n **\n ** This pane shows the content of a particular RDF resource\n ** or at least the RDF semantics we attribute to that resource.\n */\n\n// To do: - Only take data from one graph\n// - Only do forwards not backward?\n// - Expand automatically all the way down\n// - original source view? Use ffox view source\n\nimport * as UI from 'solid-ui-jss'\nimport * as $rdf from 'rdflib'\n\nconst ns = UI.ns\n\nexport const dataContentPane = {\n icon: UI.icons.originalIconBase + 'rdf_flyer.24.gif',\n\n name: 'dataContents',\n\n audience: [ns.solid('Developer')],\n\n label: function (subject, context) {\n if (\n 'http://www.w3.org/2007/ont/link#ProtocolEvent' in\n context.session.store.findTypeURIs(subject)\n ) {\n return null\n }\n const n = context.session.store.statementsMatching(\n undefined,\n undefined,\n undefined,\n subject\n ).length\n if (n === 0) return null\n return 'Data (' + n + ')'\n },\n /*\n shouldGetFocus: function(subject) {\n return store.whether(subject, UI.ns.rdf('type'), UI.ns.link('RDFDocument'))\n },\n*/\n statementsAsTables: function statementsAsTables (sts, context, initialRoots) {\n const myDocument = context.dom\n // const outliner = context.getOutliner(myDocument)\n const rep = myDocument.createElement('table')\n const sz = $rdf.Serializer(context.session.store)\n const res = sz.rootSubjects(sts)\n let roots = res.roots\n const subjects = res.subjects\n const loopBreakers = res.loopBreakers\n for (const x in loopBreakers) {\n console.log('\\tdataContentPane: loopbreaker:' + x)\n }\n const doneBnodes = {} // For preventing looping\n const referencedBnodes = {} // Bnodes which need to be named alas\n\n // The property tree for a single subject or anonymous node\n function propertyTree (subject) {\n // print('Proprty tree for '+subject)\n const rep = myDocument.createElement('table')\n let lastPred = null\n const sts = subjects[sz.toStr(subject)] // relevant statements\n if (!sts) {\n // No statements in tree\n rep.appendChild(myDocument.createTextNode('...')) // just empty bnode as object\n return rep\n }\n sts.sort()\n let same = 0\n let predicateTD // The cell which holds the predicate\n for (let i = 0; i < sts.length; i++) {\n const st = sts[i]\n const tr = myDocument.createElement('tr')\n if (st.predicate.uri !== lastPred) {\n if (lastPred && same > 1) {\n predicateTD.setAttribute('rowspan', '' + same)\n }\n predicateTD = myDocument.createElement('td')\n predicateTD.setAttribute('class', 'pred')\n const anchor = myDocument.createElement('a')\n anchor.setAttribute('href', st.predicate.uri)\n anchor.addEventListener(\n 'click',\n UI.widgets.openHrefInOutlineMode,\n true\n )\n anchor.appendChild(\n myDocument.createTextNode(\n UI.utils.predicateLabelForXML(st.predicate)\n )\n )\n predicateTD.appendChild(anchor)\n tr.appendChild(predicateTD)\n lastPred = st.predicate.uri\n same = 0\n }\n same++\n const objectTD = myDocument.createElement('td')\n objectTD.appendChild(objectTree(st.object))\n tr.appendChild(objectTD)\n rep.appendChild(tr)\n }\n if (lastPred && same > 1) predicateTD.setAttribute('rowspan', '' + same)\n return rep\n }\n\n // Convert a set of statements into a nested tree of tables\n function objectTree (obj) {\n let res, anchor\n switch (obj.termType) {\n case 'NamedNode':\n anchor = myDocument.createElement('a')\n anchor.setAttribute('href', obj.uri)\n anchor.addEventListener(\n 'click',\n UI.widgets.openHrefInOutlineMode,\n true\n )\n anchor.appendChild(myDocument.createTextNode(UI.utils.label(obj)))\n return anchor\n\n case 'Literal':\n if (!obj.datatype || !obj.datatype.uri) {\n res = myDocument.createElement('div')\n res.setAttribute('style', 'white-space: pre-wrap;')\n res.textContent = obj.value\n return res\n } else if (\n obj.datatype.uri ===\n 'http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral'\n ) {\n res = myDocument.createElement('div')\n res.setAttribute('class', 'embeddedXHTML')\n res.innerHTML = obj.value // Try that @@@ beware embedded dangerous code\n return res\n }\n return myDocument.createTextNode(obj.value) // placeholder - could be smarter,\n\n case 'BlankNode': {\n if (obj.toNT() in doneBnodes) {\n // Break infinite recursion\n referencedBnodes[obj.toNT()] = true\n const anchor = myDocument.createElement('a')\n anchor.setAttribute('href', '#' + obj.toNT().slice(2))\n anchor.setAttribute('class', 'bnodeRef')\n anchor.textContent = '*' + obj.toNT().slice(3)\n return anchor\n }\n doneBnodes[obj.toNT()] = true // Flag to prevent infinite recursion in propertyTree\n const newTable = propertyTree(obj)\n doneBnodes[obj.toNT()] = newTable // Track where we mentioned it first\n if (\n UI.utils.ancestor(newTable, 'TABLE') &&\n UI.utils.ancestor(newTable, 'TABLE').style.backgroundColor ===\n 'white'\n ) {\n newTable.style.backgroundColor = '#eee'\n } else {\n newTable.style.backgroundColor = 'white'\n }\n return newTable\n }\n case 'Collection':\n res = myDocument.createElement('table')\n res.setAttribute('class', 'collectionAsTables')\n for (let i = 0; i < obj.elements.length; i++) {\n const tr = myDocument.createElement('tr')\n res.appendChild(tr)\n tr.appendChild(objectTree(obj.elements[i]))\n }\n return res\n case 'Graph':\n res = context.session.paneRegistry\n .byName('dataContents')\n .statementsAsTables(obj.statements, context)\n res.setAttribute('class', 'nestedFormula')\n return res\n case 'Variable':\n res = myDocument.createTextNode('?' + obj.uri)\n return res\n }\n throw new Error('Unhandled node type: ' + obj.termType)\n }\n\n // roots.sort()\n\n if (initialRoots) {\n roots = initialRoots.concat(\n roots.filter(function (x) {\n for (let i = 0; i < initialRoots.length; i++) {\n // Max 2\n if (x.sameTerm(initialRoots[i])) return false\n }\n return true\n })\n )\n }\n for (let i = 0; i < roots.length; i++) {\n const tr = myDocument.createElement('tr')\n tr.setAttribute('style', `background-color: ${i % 2 === 0 ? '#f0f0f0' : 'white'};`)\n rep.appendChild(tr)\n const subjectTD = myDocument.createElement('td')\n tr.appendChild(subjectTD)\n const TDTree = myDocument.createElement('td')\n tr.appendChild(TDTree)\n const root = roots[i]\n if (root.termType === 'BlankNode') {\n subjectTD.appendChild(myDocument.createTextNode(UI.utils.label(root))) // Don't recurse!\n } else {\n subjectTD.appendChild(objectTree(root)) // won't have tree\n }\n TDTree.appendChild(propertyTree(root))\n }\n for (const bNT in referencedBnodes) {\n // Add number to refer to\n const table = doneBnodes[bNT]\n // let tr = myDocument.createElement('tr')\n const anchor = myDocument.createElement('a')\n anchor.setAttribute('id', bNT.slice(2))\n anchor.setAttribute('class', 'bnodeDef')\n anchor.textContent = bNT.slice(3) + ')'\n table.insertBefore(anchor, table.firstChild)\n }\n return rep\n }, // statementsAsTables\n // View the data in a file in user-friendly way\n render: function (subject, context) {\n const myDocument = context.dom\n\n function alternativeRendering () {\n const sz = $rdf.Serializer(context.session.store)\n const res = sz.rootSubjects(sts)\n const roots = res.roots\n const p = {}\n p.render = function (s2) {\n const div = myDocument.createElement('div')\n div.setAttribute('class', 'withinDocumentPane')\n const plist = kb.statementsMatching(s2, undefined, undefined, subject)\n outliner.appendPropertyTRs(div, plist, false, function (\n _pred,\n _inverse\n ) {\n return true\n })\n return div\n }\n for (let i = 0; i < roots.length; i++) {\n const tr = myDocument.createElement('TR')\n const root = roots[i]\n tr.style.verticalAlign = 'top'\n const td = outliner.outlineObjectTD(root, undefined, tr)\n tr.appendChild(td)\n div.appendChild(tr)\n outliner.outlineExpand(td, root, { pane: p })\n }\n }\n\n function mainRendering () {\n const initialRoots = [] // Ordering: start with stuff about this doc\n if (kb.holds(subject, undefined, undefined, subject)) {\n initialRoots.push(subject)\n }\n // Then about the primary topic of the document if any\n const ps = kb.any(subject, UI.ns.foaf('primaryTopic'), undefined, subject)\n if (ps) initialRoots.push(ps)\n div.appendChild(\n context.session.paneRegistry\n .byName('dataContents')\n .statementsAsTables(sts, context, initialRoots)\n )\n }\n\n const outliner = context.getOutliner(myDocument)\n const kb = context.session.store\n const div = myDocument.createElement('div')\n div.setAttribute('class', 'dataContentPane')\n // Because of smushing etc, this will not be a copy of the original source\n // We could instead either fetch and re-parse the source,\n // or we could keep all the pre-smushed triples.\n const sts = kb.statementsMatching(undefined, undefined, undefined, subject) // @@ slow with current store!\n\n // eslint-disable-next-line no-constant-condition\n if (false) { // keep code\n alternativeRendering()\n } else {\n mainRendering()\n }\n return div\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/defaultPane.js b/dist/defaultPane.js new file mode 100644 index 00000000..17c1faef --- /dev/null +++ b/dist/defaultPane.js @@ -0,0 +1,75 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultPane = void 0; +var UI = _interopRequireWildcard(require("solid-ui-jss")); +var $rdf = _interopRequireWildcard(require("rdflib")); +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } +/* Default Pane + ** + ** This outline pane contains the properties which are + ** normally displayed to the user. See also: internalPane + ** This pane hides the ones considered too low-level for the normal user. + */ + +const ns = UI.ns; +const defaultPane = exports.defaultPane = { + icon: UI.icons.originalIconBase + 'about.png', + name: 'default', + audience: [ns.solid('Developer')], + label: function (_subject) { + return 'about '; + }, + render: function (subject, context) { + const dom = context.dom; + const filter = function (pred, inverse) { + if (typeof context.session.paneRegistry.byName('internal').predicates[pred.uri] !== 'undefined') { + return false; + } + if (inverse && pred.uri === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type') { + return false; + } + return true; + }; + const outliner = context.getOutliner(dom); + const kb = context.session.store; + // var outline = outliner; // @@ + UI.log.info('@defaultPane.render, dom is now ' + dom.location); + subject = kb.canon(subject); + const div = dom.createElement('div'); + div.setAttribute('class', 'defaultPane'); + // appendRemoveIcon(div, subject, div) + + let plist = kb.statementsMatching(subject); + outliner.appendPropertyTRs(div, plist, false, filter); + plist = kb.statementsMatching(undefined, undefined, subject); + outliner.appendPropertyTRs(div, plist, true, filter); + if (subject.termType === 'Literal' && subject.value.slice(0, 7) === 'http://') { + outliner.appendPropertyTRs(div, [$rdf.st(kb.sym(subject.value), UI.ns.link('uri'), subject)], true, filter); + } + if (subject.termType === 'NamedNode' && kb.updater.editable($rdf.Util.uri.docpart(subject.uri), kb) || subject.termType === 'BlankNode' && kb.anyStatementMatching(subject) && kb.anyStatementMatching(subject).why && kb.anyStatementMatching(subject).why.uri && kb.updater.editable(kb.anyStatementMatching(subject).why.uri) + // check the document containing something about of the bnode @@ what about as object? + /* ! && HCIoptions["bottom insert highlights"].enabled */) { + const holdingTr = dom.createElement('tr'); // these are to minimize required changes + const holdingTd = dom.createElement('td'); // in userinput.js + holdingTd.setAttribute('colspan', '2'); + holdingTd.setAttribute('notSelectable', 'true'); + const img = dom.createElement('img'); + img.src = UI.icons.originalIconBase + 'tango/22-list-add-new.png'; + img.addEventListener('click', function addNewTripleIconMouseDownListener(e) { + outliner.UserInput.addNewPredicateObject(e); + e.stopPropagation(); + e.preventDefault(); + }); + img.className = 'bottom-border-active'; + // img.addEventListener('click', thisOutline.UserInput.addNewPredicateObject,false) + div.appendChild(holdingTr).appendChild(holdingTd).appendChild(img); + } + return div; + } +}; + +// ends +//# sourceMappingURL=defaultPane.js.map \ No newline at end of file diff --git a/dist/defaultPane.js.map b/dist/defaultPane.js.map new file mode 100644 index 00000000..de6b955f --- /dev/null +++ b/dist/defaultPane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"defaultPane.js","names":["UI","_interopRequireWildcard","require","$rdf","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ns","defaultPane","exports","icon","icons","originalIconBase","name","audience","solid","label","_subject","render","subject","context","dom","filter","pred","inverse","session","paneRegistry","byName","predicates","uri","outliner","getOutliner","kb","store","log","info","location","canon","div","createElement","setAttribute","plist","statementsMatching","appendPropertyTRs","undefined","termType","value","slice","st","sym","link","updater","editable","Util","docpart","anyStatementMatching","why","holdingTr","holdingTd","img","src","addEventListener","addNewTripleIconMouseDownListener","UserInput","addNewPredicateObject","stopPropagation","preventDefault","className","appendChild"],"sources":["../src/defaultPane.js"],"sourcesContent":["/* Default Pane\n **\n ** This outline pane contains the properties which are\n ** normally displayed to the user. See also: internalPane\n ** This pane hides the ones considered too low-level for the normal user.\n */\n\nimport * as UI from 'solid-ui-jss'\nimport * as $rdf from 'rdflib'\n\nconst ns = UI.ns\n\nexport const defaultPane = {\n icon: UI.icons.originalIconBase + 'about.png',\n\n name: 'default',\n\n audience: [ns.solid('Developer')],\n\n label: function (_subject) {\n return 'about '\n },\n\n render: function (subject, context) {\n const dom = context.dom\n\n const filter = function (pred, inverse) {\n if (\n typeof context.session.paneRegistry.byName('internal').predicates[\n pred.uri\n ] !== 'undefined'\n ) {\n return false\n }\n if (\n inverse &&\n pred.uri === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'\n ) {\n return false\n }\n return true\n }\n\n const outliner = context.getOutliner(dom)\n const kb = context.session.store\n // var outline = outliner; // @@\n UI.log.info('@defaultPane.render, dom is now ' + dom.location)\n subject = kb.canon(subject)\n const div = dom.createElement('div')\n div.setAttribute('class', 'defaultPane')\n // appendRemoveIcon(div, subject, div)\n\n let plist = kb.statementsMatching(subject)\n outliner.appendPropertyTRs(div, plist, false, filter)\n plist = kb.statementsMatching(undefined, undefined, subject)\n outliner.appendPropertyTRs(div, plist, true, filter)\n if (\n subject.termType === 'Literal' &&\n subject.value.slice(0, 7) === 'http://'\n ) {\n outliner.appendPropertyTRs(\n div,\n [$rdf.st(kb.sym(subject.value), UI.ns.link('uri'), subject)],\n true,\n filter\n )\n }\n if (\n (subject.termType === 'NamedNode' &&\n kb.updater.editable($rdf.Util.uri.docpart(subject.uri), kb)) ||\n (subject.termType === 'BlankNode' &&\n kb.anyStatementMatching(subject) &&\n kb.anyStatementMatching(subject).why &&\n kb.anyStatementMatching(subject).why.uri &&\n kb.updater.editable(kb.anyStatementMatching(subject).why.uri))\n // check the document containing something about of the bnode @@ what about as object?\n /* ! && HCIoptions[\"bottom insert highlights\"].enabled */\n ) {\n const holdingTr = dom.createElement('tr') // these are to minimize required changes\n const holdingTd = dom.createElement('td') // in userinput.js\n holdingTd.setAttribute('colspan', '2')\n holdingTd.setAttribute('notSelectable', 'true')\n const img = dom.createElement('img')\n img.src = UI.icons.originalIconBase + 'tango/22-list-add-new.png'\n img.addEventListener('click', function addNewTripleIconMouseDownListener (\n e\n ) {\n outliner.UserInput.addNewPredicateObject(e)\n e.stopPropagation()\n e.preventDefault()\n })\n img.className = 'bottom-border-active'\n // img.addEventListener('click', thisOutline.UserInput.addNewPredicateObject,false)\n div\n .appendChild(holdingTr)\n .appendChild(holdingTd)\n .appendChild(img)\n }\n return div\n }\n}\n\n// ends\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/dokieli/dokieliPane.js b/dist/dokieli/dokieliPane.js new file mode 100644 index 00000000..52f74b64 --- /dev/null +++ b/dist/dokieli/dokieliPane.js @@ -0,0 +1,169 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var UI = _interopRequireWildcard(require("solid-ui-jss")); +var $rdf = _interopRequireWildcard(require("rdflib")); +var mime = _interopRequireWildcard(require("../utils/mimeTypes")); +var _new = _interopRequireDefault(require("./new.js")); +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } +/* Human-readable editable "Dokieli" Pane + ** + ** This outline pane contains the document contents for a Dokieli document + ** The dokeili system allows the user to edit a document including anotations + ** review. It does not use turtle, but RDF/a + */ +// const DOKIELI_TEMPLATE_URI = 'https://dokie.li/new' // Copy to make new dok +// Distributed with this library +var _default = exports.default = { + icon: UI.icons.iconBase + 'dokieli-logo.png', + // @@ improve? more like doccument? + + name: 'Dokieli', + mintClass: UI.ns.solid('DokieliDocument'), + // @@ A better class? + + label: function (subject, context) { + const kb = context.session.store; + const ns = UI.ns; + const allowed = [ + // 'text/plain', + 'text/html', 'application/xhtml+xml' + // 'image/png', 'image/jpeg', 'application/pdf', + // 'video/mp4' + ]; + const hasContentTypeIn = function (kb, x, displayables) { + const cts = kb.fetcher.getHeader(x, 'content-type'); + if (cts) { + for (let j = 0; j < cts.length; j++) { + for (let k = 0; k < displayables.length; k++) { + if (cts[j].indexOf(displayables[k]) >= 0) { + return true; + } + } + } + } + return false; + }; + + // This data coul d come from a fetch OR from ldp comtaimner + const hasContentTypeIn2 = function (kb, x, displayables) { + const t = kb.findTypeURIs(x); + for (let k = 0; k < displayables.length; k++) { + if ($rdf.Util.mediaTypeClass(displayables[k]).uri in t) { + return true; + } + } + return false; + }; + if (!subject.uri) return null; // no bnodes + + const t = kb.findTypeURIs(subject); + if (t[ns.link('WebPage').uri]) return 'view'; + if (hasContentTypeIn(kb, subject, allowed) || hasContentTypeIn2(kb, subject, allowed)) { + return 'Dok'; + } + return null; + }, + // Create a new folder in a Solid system, with a dokieli editable document in it + mintNew: function (context, newPaneOptions) { + const kb = context.session.store; + let newInstance = newPaneOptions.newInstance; + if (!newInstance) { + let uri = newPaneOptions.newBase; + if (uri.endsWith('/')) { + uri = uri.slice(0, -1); + newPaneOptions.newBase = uri; + } + newInstance = kb.sym(uri); + } + const contentType = mime.lookup(newInstance.uri); + if (!contentType || !contentType.includes('html')) { + newInstance = $rdf.sym(newInstance.uri + '.html'); + } + newPaneOptions.newInstance = newInstance; // Save for creation system + + // console.log('New dokieli will make: ' + newInstance) + + let htmlContents = _new.default; + let filename = newInstance.uri.split('/').slice(-1)[0]; + filename = decodeURIComponent(filename.split('.')[0]); + const encodedTitle = filename.replace(/&/g, '&').replace(//g, '>'); + htmlContents = htmlContents.replace('', '<title>' + encodedTitle); + htmlContents = htmlContents.replace('</article>', '<h1>' + encodedTitle + '</h1></article>'); + // console.log('@@ New HTML for Dok:' + htmlContents) + return new Promise(function (resolve) { + kb.fetcher.webOperation('PUT', newInstance.uri, { + data: htmlContents, + contentType: 'text/html' + }).then(function () { + console.log('new Dokieli document created at ' + newPaneOptions.newInstance); + resolve(newPaneOptions); + }).catch(function (err) { + console.log('Error creating dokieli doc at ' + newPaneOptions.newInstance + ': ' + err); + }); + }); + }, + // Derived from: humanReadablePane .. share code? + render: function (subject, context) { + const myDocument = context.dom; + const div = myDocument.createElement('div'); + const kb = context.session.store; + + // @@ When we can, use CSP to turn off scripts within the iframe + div.setAttribute('class', 'docView'); + const iframe = myDocument.createElement('IFRAME'); + + // Function to set iframe attributes + const setIframeAttributes = (iframe, blob, lines) => { + const objectURL = URL.createObjectURL(blob); + iframe.setAttribute('src', objectURL); + iframe.setAttribute('type', blob.type); + iframe.setAttribute('class', 'doc'); + iframe.setAttribute('style', `border: 1px solid; padding: 1em; height:${lines}em; width:800px; resize: both; overflow: auto;`); + + // Apply sandbox attribute only for HTML files + // @@ NOte beflow - if we set ANY sandbox, then Chrome and Safari won't display it if it is PDF. + // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe + // You can;'t have any sandbox and allow plugins. + // We could sandbox only HTML files I suppose. + // HTML5 bug: https://lists.w3.org/Archives/Public/public-html/2011Jun/0330.html + if (blob.type === 'text/html' || blob.type === 'application/xhtml+xml') { + iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin'); + } + }; + + // Fetch and process the blob + kb.fetcher._fetch(subject.uri).then(response => response.blob()).then(blob => { + const blobTextPromise = blob.type.startsWith('text') ? blob.text() : Promise.resolve(''); + return blobTextPromise.then(blobText => ({ + blob, + blobText + })); + }).then(({ + blob, + blobText + }) => { + const newLines = blobText.includes('<script src="https://dokie.li/scripts/dokieli.js">') ? -10 : 5; + const lines = Math.min(30, blobText.split(/\n/).length + newLines); + setIframeAttributes(iframe, blob, lines); + }).catch(err => { + console.log('Error fetching or processing blob:', err); + }); + const cts = kb.fetcher.getHeader(subject.doc(), 'content-type'); + const ct = cts ? cts[0].split(';', 1)[0].trim() : null; + if (ct) { + console.log('dokieliPane: c-t:' + ct); + } else { + console.log('dokieliPane: unknown content-type?'); + } + const tr = myDocument.createElement('tr'); + tr.appendChild(iframe); + div.appendChild(tr); + return div; + } +}; // ends +//# sourceMappingURL=dokieliPane.js.map \ No newline at end of file diff --git a/dist/dokieli/dokieliPane.js.map b/dist/dokieli/dokieliPane.js.map new file mode 100644 index 00000000..f50b66cd --- /dev/null +++ b/dist/dokieli/dokieliPane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dokieliPane.js","names":["UI","_interopRequireWildcard","require","$rdf","mime","_new","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_default","exports","icon","icons","iconBase","name","mintClass","ns","solid","label","subject","context","kb","session","store","allowed","hasContentTypeIn","x","displayables","cts","fetcher","getHeader","j","length","k","indexOf","hasContentTypeIn2","findTypeURIs","Util","mediaTypeClass","uri","link","mintNew","newPaneOptions","newInstance","newBase","endsWith","slice","sym","contentType","lookup","includes","htmlContents","DOKIELI_TEMPLATE","filename","split","decodeURIComponent","encodedTitle","replace","Promise","resolve","webOperation","data","then","console","log","catch","err","render","myDocument","dom","div","createElement","setAttribute","iframe","setIframeAttributes","blob","lines","objectURL","URL","createObjectURL","type","_fetch","response","blobTextPromise","startsWith","text","blobText","newLines","Math","min","doc","ct","trim","tr","appendChild"],"sources":["../../src/dokieli/dokieliPane.js"],"sourcesContent":["/* Human-readable editable \"Dokieli\" Pane\n **\n ** This outline pane contains the document contents for a Dokieli document\n ** The dokeili system allows the user to edit a document including anotations\n ** review. It does not use turtle, but RDF/a\n */\n\nimport * as UI from 'solid-ui-jss'\nimport * as $rdf from 'rdflib'\nimport * as mime from '../utils/mimeTypes'\n\n// const DOKIELI_TEMPLATE_URI = 'https://dokie.li/new' // Copy to make new dok\n\nimport DOKIELI_TEMPLATE from './new.js' // Distributed with this library\n\nexport default {\n icon: UI.icons.iconBase + 'dokieli-logo.png', // @@ improve? more like doccument?\n\n name: 'Dokieli',\n\n mintClass: UI.ns.solid('DokieliDocument'), // @@ A better class?\n\n label: function (subject, context) {\n const kb = context.session.store\n const ns = UI.ns\n const allowed = [\n // 'text/plain',\n 'text/html',\n 'application/xhtml+xml'\n // 'image/png', 'image/jpeg', 'application/pdf',\n // 'video/mp4'\n ]\n\n const hasContentTypeIn = function (kb, x, displayables) {\n const cts = kb.fetcher.getHeader(x, 'content-type')\n if (cts) {\n for (let j = 0; j < cts.length; j++) {\n for (let k = 0; k < displayables.length; k++) {\n if (cts[j].indexOf(displayables[k]) >= 0) {\n return true\n }\n }\n }\n }\n return false\n }\n\n // This data coul d come from a fetch OR from ldp comtaimner\n const hasContentTypeIn2 = function (kb, x, displayables) {\n const t = kb.findTypeURIs(x)\n for (let k = 0; k < displayables.length; k++) {\n if ($rdf.Util.mediaTypeClass(displayables[k]).uri in t) {\n return true\n }\n }\n return false\n }\n\n if (!subject.uri) return null // no bnodes\n\n const t = kb.findTypeURIs(subject)\n if (t[ns.link('WebPage').uri]) return 'view'\n\n if (\n hasContentTypeIn(kb, subject, allowed) ||\n hasContentTypeIn2(kb, subject, allowed)\n ) {\n return 'Dok'\n }\n\n return null\n },\n\n // Create a new folder in a Solid system, with a dokieli editable document in it\n mintNew: function (context, newPaneOptions) {\n const kb = context.session.store\n let newInstance = newPaneOptions.newInstance\n if (!newInstance) {\n let uri = newPaneOptions.newBase\n if (uri.endsWith('/')) {\n uri = uri.slice(0, -1)\n newPaneOptions.newBase = uri\n }\n newInstance = kb.sym(uri)\n }\n\n const contentType = mime.lookup(newInstance.uri)\n if (!contentType || !contentType.includes('html')) {\n newInstance = $rdf.sym(newInstance.uri + '.html')\n }\n newPaneOptions.newInstance = newInstance // Save for creation system\n\n // console.log('New dokieli will make: ' + newInstance)\n\n let htmlContents = DOKIELI_TEMPLATE\n let filename = newInstance.uri.split('/').slice(-1)[0]\n filename = decodeURIComponent(filename.split('.')[0])\n const encodedTitle = filename\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n htmlContents = htmlContents.replace('<title>', '<title>' + encodedTitle)\n htmlContents = htmlContents.replace(\n '</article>',\n '<h1>' + encodedTitle + '</h1></article>'\n )\n // console.log('@@ New HTML for Dok:' + htmlContents)\n return new Promise(function (resolve) {\n kb.fetcher\n .webOperation('PUT', newInstance.uri, {\n data: htmlContents,\n contentType: 'text/html'\n })\n .then(function () {\n console.log(\n 'new Dokieli document created at ' + newPaneOptions.newInstance\n )\n resolve(newPaneOptions)\n })\n .catch(function (err) {\n console.log(\n 'Error creating dokieli doc at ' +\n newPaneOptions.newInstance +\n ': ' +\n err\n )\n })\n })\n },\n\n // Derived from: humanReadablePane .. share code?\n render: function (subject, context) {\n const myDocument = context.dom\n const div = myDocument.createElement('div')\n const kb = context.session.store\n\n // @@ When we can, use CSP to turn off scripts within the iframe\n div.setAttribute('class', 'docView')\n const iframe = myDocument.createElement('IFRAME')\n\n // Function to set iframe attributes\n const setIframeAttributes = (iframe, blob, lines) => {\n const objectURL = URL.createObjectURL(blob)\n iframe.setAttribute('src', objectURL)\n iframe.setAttribute('type', blob.type)\n iframe.setAttribute('class', 'doc')\n iframe.setAttribute('style', `border: 1px solid; padding: 1em; height:${lines}em; width:800px; resize: both; overflow: auto;`)\n\n // Apply sandbox attribute only for HTML files\n // @@ NOte beflow - if we set ANY sandbox, then Chrome and Safari won't display it if it is PDF.\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe\n // You can;'t have any sandbox and allow plugins.\n // We could sandbox only HTML files I suppose.\n // HTML5 bug: https://lists.w3.org/Archives/Public/public-html/2011Jun/0330.html\n if (blob.type === 'text/html' || blob.type === 'application/xhtml+xml') {\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin')\n }\n }\n\n // Fetch and process the blob\n kb.fetcher._fetch(subject.uri)\n .then(response => response.blob())\n .then(blob => {\n const blobTextPromise = blob.type.startsWith('text') ? blob.text() : Promise.resolve('')\n return blobTextPromise.then(blobText => ({ blob, blobText }))\n })\n .then(({ blob, blobText }) => {\n const newLines = blobText.includes('<script src=\"https://dokie.li/scripts/dokieli.js\">') ? -10 : 5\n const lines = Math.min(30, blobText.split(/\\n/).length + newLines)\n setIframeAttributes(iframe, blob, lines)\n })\n .catch(err => {\n console.log('Error fetching or processing blob:', err)\n })\n\n const cts = kb.fetcher.getHeader(subject.doc(), 'content-type')\n const ct = cts ? cts[0].split(';', 1)[0].trim() : null\n if (ct) {\n console.log('dokieliPane: c-t:' + ct)\n } else {\n console.log('dokieliPane: unknown content-type?')\n }\n\n const tr = myDocument.createElement('tr')\n tr.appendChild(iframe)\n div.appendChild(tr)\n return div\n }\n}\n// ends\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/dokieli/new.js b/dist/dokieli/new.js new file mode 100644 index 00000000..62b98a76 --- /dev/null +++ b/dist/dokieli/new.js @@ -0,0 +1,28 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +const DOKIELI_TEMPLATE = ` +<!DOCTYPE html> +<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta charset="utf-8" /> + <title> + + + + + + + +
+
+ +
+
+ +`; +var _default = exports.default = DOKIELI_TEMPLATE; +//# sourceMappingURL=new.js.map \ No newline at end of file diff --git a/dist/dokieli/new.js.map b/dist/dokieli/new.js.map new file mode 100644 index 00000000..2ac4272c --- /dev/null +++ b/dist/dokieli/new.js.map @@ -0,0 +1 @@ +{"version":3,"file":"new.js","names":["DOKIELI_TEMPLATE","_default","exports","default"],"sources":["../../src/dokieli/new.js"],"sourcesContent":["const DOKIELI_TEMPLATE = `\n\n\n \n \n \n \n \n \n \n \n\n \n
\n
\n\n
\n
\n \n`\n\nexport default DOKIELI_TEMPLATE\n"],"mappings":";;;;;;AAAA,MAAMA,gBAAgB,GAAG;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEOH,gBAAgB","ignoreList":[]} \ No newline at end of file diff --git a/dist/form/pane.js b/dist/form/pane.js new file mode 100644 index 00000000..f08fbbbb --- /dev/null +++ b/dist/form/pane.js @@ -0,0 +1,185 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.formPane = void 0; +var UI = _interopRequireWildcard(require("solid-ui-jss")); +var _solidLogicJss = require("solid-logic-jss"); +var $rdf = _interopRequireWildcard(require("rdflib")); +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } +/* + ** Pane for running existing forms for any object + ** + */ + +const ns = UI.ns; +const formPane = exports.formPane = { + icon: UI.icons.iconBase + 'noun_122196.svg', + name: 'form', + audience: [ns.solid('PowerUser')], + // Does the subject deserve this pane? + label: function (subject) { + const n = UI.widgets.formsFor(subject).length; + UI.log.debug('Form pane: forms for ' + subject + ': ' + n); + if (!n) return null; + return '' + n + ' forms'; + }, + render: function (subject, context) { + const kb = context.session.store; + const dom = context.dom; + const mention = function complain(message, style) { + const pre = dom.createElement('p'); + pre.setAttribute('style', style || 'color: grey; background-color: white'); + box.appendChild(pre).textContent = message; + return pre; + }; + const complain = function complain(message, style) { + mention(message, 'style', style || 'color: grey; background-color: #fdd;'); + }; + const complainIfBad = function (ok, body) { + if (ok) { + // setModifiedDate(store, kb, store); + // rerender(box); // Deleted forms at the moment + } else complain('Sorry, failed to save your change:\n' + body); + }; + + // The question of where to store this data about subject + // This in general needs a whole lot more thought + // and it connects to the discoverbility through links + + // const t = kb.findTypeURIs(subject) + + const me = _solidLogicJss.authn.currentUser(); + const box = dom.createElement('div'); + box.setAttribute('class', 'formPane'); + if (!me) { + mention('You are not logged in. If you log in and have ' + 'workspaces then you would be able to select workspace in which ' + 'to put this new information'); + } else { + const ws = kb.each(me, ns.ui('workspace')); + if (ws.length === 0) { + mention('You don\'t seem to have any workspaces defined. ' + 'A workspace is a place on the web (http://..) or in ' + 'the file system (file:///) to store application data.\n'); + } else { + // @@ + } + } + + // Render forms using a given store + + const renderFormsFor = function (store, subject) { + kb.fetcher.nowOrWhenFetched(store.uri, subject, function (ok, body) { + if (!ok) return complain('Cannot load store ' + store.uri + ': ' + body); + + // Render the forms + + const forms = UI.widgets.formsFor(subject); + + // complain('Form for editing this form:'); + for (let i = 0; i < forms.length; i++) { + const form = forms[i]; + const heading = dom.createElement('h4'); + box.appendChild(heading); + if (form.uri) { + const formStore = $rdf.Util.uri.document(form.uri); + if (formStore.uri !== form.uri) { + // The form is a hash-type URI + const e = box.appendChild(UI.widgets.editFormButton(dom, box, form, formStore, complainIfBad)); + e.setAttribute('style', 'float: right;'); + } + } + const anchor = dom.createElement('a'); + anchor.setAttribute('href', form.uri); + heading.appendChild(anchor); + anchor.textContent = UI.utils.label(form, true); + + /* Keep tis as a reminder to let a New one have its URI given by user + mention("Where will this information be stored?") + const ele = dom.createElement('input'); + box.appendChild(ele); + ele.setAttribute('type', 'text'); + ele.setAttribute('size', '72'); + ele.setAttribute('maxlength', '1024'); + ele.setAttribute('style', 'font-size: 80%; color:#222;'); + ele.value = store.uri + */ + + UI.widgets.appendForm(dom, box, {}, subject, form, store, complainIfBad); + } + }); // end: when store loded + }; // renderFormsFor + + // Figure out what store + + // Which places are editable and have stuff about the subject? + + let store = null; + + // 1. The document URI of the subject itself + const docuri = $rdf.Util.uri.docpart(subject.uri); + if (subject.uri !== docuri && kb.updater.editable(docuri, kb)) { + store = subject.doc(); + } // an editable data file with hash + + store = store || kb.any(kb.sym(docuri), ns.link('annotationStore')); + + // 2. where stuff is already stored + if (!store) { + const docs = {}; + const docList = []; + store.statementsMatching(subject).forEach(function (st) { + docs[st.why.uri] = 1; + }); + store.statementsMatching(undefined, undefined, subject).forEach(function (st) { + docs[st.why.uri] = 2; + }); + for (const d in docs) docList.push(docs[d], d); + docList.sort(); + for (let i = 0; i < docList.length; i++) { + const uri = docList[i][1]; + if (uri && store.updater.editable(uri)) { + store = store.sym(uri); + break; + } + } + } + + // 3. In a workspace store + // @@ TODO: Can probably remove _followeach (not done this time because the commit is a very safe refactor) + const _followeach = function (kb, subject, path) { + if (path.length === 0) return [subject]; + const oo = kb.each(subject, path[0]); + let res = []; + for (let i = 0; i < oo.length; i++) { + res = res.concat(_followeach(kb, oo[i], path.slice(1))); + } + return res; + }; + const date = '2014'; // @@@@@@@@@@@@ pass as parameter + + if (store) { + // mention("@@ Ok, we have a store <" + store.uri + ">."); + renderFormsFor(store, subject); + } else { + complain('No suitable store is known, to edit <' + subject.uri + '>.'); + const foobarbaz = UI.login.selectWorkspace(dom, function (ws) { + mention('Workspace selected OK: ' + ws); + const activities = store.each(undefined, ns.space('workspace'), ws); + for (let j = 0; j < activities.length; j++) { + const act = activities[j]; + const subjectDoc2 = store.any(ws, ns.space('store')); + const start = store.any(ws, ns.cal('dtstart')).value(); + const end = store.any(ws, ns.cal('dtend')).value(); + if (subjectDoc2 && start && end && start <= date && end > date) { + renderFormsFor(subjectDoc2, subject); + break; + } else { + complain('Note no suitable annotation store in activity: ' + act); + } + } + }); + box.appendChild(foobarbaz); + } + return box; + } +}; +//# sourceMappingURL=pane.js.map \ No newline at end of file diff --git a/dist/form/pane.js.map b/dist/form/pane.js.map new file mode 100644 index 00000000..faf6dc93 --- /dev/null +++ b/dist/form/pane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pane.js","names":["UI","_interopRequireWildcard","require","_solidLogicJss","$rdf","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ns","formPane","exports","icon","icons","iconBase","name","audience","solid","label","subject","widgets","formsFor","length","log","debug","render","context","kb","session","store","dom","mention","complain","message","style","pre","createElement","setAttribute","box","appendChild","textContent","complainIfBad","ok","body","me","authn","currentUser","ws","each","ui","renderFormsFor","fetcher","nowOrWhenFetched","uri","forms","form","heading","formStore","Util","document","editFormButton","anchor","utils","appendForm","docuri","docpart","updater","editable","doc","any","sym","link","docs","docList","statementsMatching","forEach","st","why","undefined","d","push","sort","_followeach","path","oo","res","concat","slice","date","foobarbaz","login","selectWorkspace","activities","space","j","act","subjectDoc2","start","cal","value","end"],"sources":["../../src/form/pane.js"],"sourcesContent":["/*\n ** Pane for running existing forms for any object\n **\n */\n\nimport * as UI from 'solid-ui-jss'\nimport { authn } from 'solid-logic-jss'\nimport * as $rdf from 'rdflib'\nconst ns = UI.ns\n\nexport const formPane = {\n icon: UI.icons.iconBase + 'noun_122196.svg',\n\n name: 'form',\n\n audience: [ns.solid('PowerUser')],\n\n // Does the subject deserve this pane?\n label: function (subject) {\n const n = UI.widgets.formsFor(subject).length\n UI.log.debug('Form pane: forms for ' + subject + ': ' + n)\n if (!n) return null\n return '' + n + ' forms'\n },\n\n render: function (subject, context) {\n const kb = context.session.store\n const dom = context.dom\n\n const mention = function complain (message, style) {\n const pre = dom.createElement('p')\n pre.setAttribute('style', style || 'color: grey; background-color: white')\n box.appendChild(pre).textContent = message\n return pre\n }\n\n const complain = function complain (message, style) {\n mention(message, 'style', style || 'color: grey; background-color: #fdd;')\n }\n\n const complainIfBad = function (ok, body) {\n if (ok) {\n // setModifiedDate(store, kb, store);\n // rerender(box); // Deleted forms at the moment\n } else complain('Sorry, failed to save your change:\\n' + body)\n }\n\n // The question of where to store this data about subject\n // This in general needs a whole lot more thought\n // and it connects to the discoverbility through links\n\n // const t = kb.findTypeURIs(subject)\n\n const me = authn.currentUser()\n\n const box = dom.createElement('div')\n box.setAttribute('class', 'formPane')\n\n if (!me) {\n mention(\n 'You are not logged in. If you log in and have ' +\n 'workspaces then you would be able to select workspace in which ' +\n 'to put this new information'\n )\n } else {\n const ws = kb.each(me, ns.ui('workspace'))\n if (ws.length === 0) {\n mention(\n 'You don\\'t seem to have any workspaces defined. ' +\n 'A workspace is a place on the web (http://..) or in ' +\n 'the file system (file:///) to store application data.\\n'\n )\n } else {\n // @@\n }\n }\n\n // Render forms using a given store\n\n const renderFormsFor = function (store, subject) {\n kb.fetcher.nowOrWhenFetched(store.uri, subject, function (ok, body) {\n if (!ok) return complain('Cannot load store ' + store.uri + ': ' + body)\n\n // Render the forms\n\n const forms = UI.widgets.formsFor(subject)\n\n // complain('Form for editing this form:');\n for (let i = 0; i < forms.length; i++) {\n const form = forms[i]\n const heading = dom.createElement('h4')\n box.appendChild(heading)\n if (form.uri) {\n const formStore = $rdf.Util.uri.document(form.uri)\n if (formStore.uri !== form.uri) {\n // The form is a hash-type URI\n const e = box.appendChild(\n UI.widgets.editFormButton(\n dom,\n box,\n form,\n formStore,\n complainIfBad\n )\n )\n e.setAttribute('style', 'float: right;')\n }\n }\n const anchor = dom.createElement('a')\n anchor.setAttribute('href', form.uri)\n heading.appendChild(anchor)\n anchor.textContent = UI.utils.label(form, true)\n\n /* Keep tis as a reminder to let a New one have its URI given by user\n mention(\"Where will this information be stored?\")\n const ele = dom.createElement('input');\n box.appendChild(ele);\n ele.setAttribute('type', 'text');\n ele.setAttribute('size', '72');\n ele.setAttribute('maxlength', '1024');\n ele.setAttribute('style', 'font-size: 80%; color:#222;');\n ele.value = store.uri\n */\n\n UI.widgets.appendForm(\n dom,\n box,\n {},\n subject,\n form,\n store,\n complainIfBad\n )\n }\n }) // end: when store loded\n } // renderFormsFor\n\n // Figure out what store\n\n // Which places are editable and have stuff about the subject?\n\n let store = null\n\n // 1. The document URI of the subject itself\n const docuri = $rdf.Util.uri.docpart(subject.uri)\n if (subject.uri !== docuri && kb.updater.editable(docuri, kb)) {\n store = subject.doc()\n } // an editable data file with hash\n\n store = store || kb.any(kb.sym(docuri), ns.link('annotationStore'))\n\n // 2. where stuff is already stored\n if (!store) {\n const docs = {}\n const docList = []\n store.statementsMatching(subject).forEach(function (st) {\n docs[st.why.uri] = 1\n })\n store\n .statementsMatching(undefined, undefined, subject)\n .forEach(function (st) {\n docs[st.why.uri] = 2\n })\n for (const d in docs) docList.push(docs[d], d)\n docList.sort()\n for (let i = 0; i < docList.length; i++) {\n const uri = docList[i][1]\n if (uri && store.updater.editable(uri)) {\n store = store.sym(uri)\n break\n }\n }\n }\n\n // 3. In a workspace store\n // @@ TODO: Can probably remove _followeach (not done this time because the commit is a very safe refactor)\n const _followeach = function (kb, subject, path) {\n if (path.length === 0) return [subject]\n const oo = kb.each(subject, path[0])\n let res = []\n for (let i = 0; i < oo.length; i++) {\n res = res.concat(_followeach(kb, oo[i], path.slice(1)))\n }\n return res\n }\n\n const date = '2014' // @@@@@@@@@@@@ pass as parameter\n\n if (store) {\n // mention(\"@@ Ok, we have a store <\" + store.uri + \">.\");\n renderFormsFor(store, subject)\n } else {\n complain('No suitable store is known, to edit <' + subject.uri + '>.')\n const foobarbaz = UI.login.selectWorkspace(dom, function (ws) {\n mention('Workspace selected OK: ' + ws)\n\n const activities = store.each(undefined, ns.space('workspace'), ws)\n for (let j = 0; j < activities.length; j++) {\n const act = activities[j]\n\n const subjectDoc2 = store.any(ws, ns.space('store'))\n const start = store.any(ws, ns.cal('dtstart')).value()\n const end = store.any(ws, ns.cal('dtend')).value()\n if (subjectDoc2 && start && end && start <= date && end > date) {\n renderFormsFor(subjectDoc2, subject)\n break\n } else {\n complain('Note no suitable annotation store in activity: ' + act)\n }\n }\n })\n box.appendChild(foobarbaz)\n }\n\n return box\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/home/homePane.js b/dist/home/homePane.js new file mode 100644 index 00000000..05064314 --- /dev/null +++ b/dist/home/homePane.js @@ -0,0 +1,73 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _solidLogicJss = require("solid-logic-jss"); +var _solidUiJss = require("solid-ui-jss"); +/* Home Pane + ** + ** The home pane is avaiable everywhere and allows a user + ** to + ** - keep track of their stuff + ** - make new things, and possibly + ** - keep track of accounts and workspaces etc + ** + */ + +const HomePaneSource = { + icon: _solidUiJss.icons.iconBase + 'noun_547570.svg', + // noun_25830 + + global: true, + name: 'home', + // Does the subject deserve an home pane? + // + // yes, always! + // + label: function () { + return 'home'; + }, + render: function (subject, context) { + const dom = context.dom; + const showContent = async function () { + const homePaneContext = { + div, + dom, + statusArea: div, + me + }; + /* + div.appendChild(dom.createElement('h4')).textContent = 'Login status' + var loginStatusDiv = div.appendChild(context.dom.createElement('div')) + // TODO: Find out what the actual type is: + type UriType = unknown; + loginStatusDiv.appendChild(UI.login.loginStatusBox(context.dom, () => { + // Here we know new log in status + })) + */ + div.appendChild(dom.createElement('h4')).textContent = 'Create new thing somewhere'; + const creationDiv = div.appendChild(dom.createElement('div')); + const creationContext = { + div: creationDiv, + dom, + statusArea: div, + me + }; + const relevantPanes = await _solidUiJss.login.filterAvailablePanes(context.session.paneRegistry.list); + _solidUiJss.create.newThingUI(creationContext, context, relevantPanes); // newUI Have to pass panes down + + _solidUiJss.login.registrationList(homePaneContext, {}).then(function () {}); + }; + const div = dom.createElement('div'); + const me = _solidLogicJss.authn.currentUser(); // this will be incorrect if not logged in + + showContent(); + return div; + } +}; // pane object + +// ends +var _default = exports.default = HomePaneSource; +//# sourceMappingURL=homePane.js.map \ No newline at end of file diff --git a/dist/home/homePane.js.map b/dist/home/homePane.js.map new file mode 100644 index 00000000..a0587e48 --- /dev/null +++ b/dist/home/homePane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"homePane.js","names":["_solidLogicJss","require","_solidUiJss","HomePaneSource","icon","icons","iconBase","global","name","label","render","subject","context","dom","showContent","homePaneContext","div","statusArea","me","appendChild","createElement","textContent","creationDiv","creationContext","relevantPanes","login","filterAvailablePanes","session","paneRegistry","list","create","newThingUI","registrationList","then","authn","currentUser","_default","exports","default"],"sources":["../../src/home/homePane.ts"],"sourcesContent":["/* Home Pane\n **\n ** The home pane is avaiable everywhere and allows a user\n ** to\n ** - keep track of their stuff\n ** - make new things, and possibly\n ** - keep track of accounts and workspaces etc\n **\n */\n\nimport { PaneDefinition } from 'pane-registry'\nimport { NamedNode } from 'rdflib'\nimport { authn } from 'solid-logic-jss'\nimport { create, icons, login } from 'solid-ui-jss'\nimport type { CreateContext } from 'solid-ui-jss'\n\nconst HomePaneSource: PaneDefinition = {\n icon: icons.iconBase + 'noun_547570.svg', // noun_25830\n\n global: true,\n\n name: 'home',\n\n // Does the subject deserve an home pane?\n //\n // yes, always!\n //\n label: function () {\n return 'home'\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const showContent = async function () {\n const homePaneContext = { div, dom, statusArea: div, me }\n /*\n div.appendChild(dom.createElement('h4')).textContent = 'Login status'\n var loginStatusDiv = div.appendChild(context.dom.createElement('div'))\n // TODO: Find out what the actual type is:\n type UriType = unknown;\n loginStatusDiv.appendChild(UI.login.loginStatusBox(context.dom, () => {\n // Here we know new log in status\n }))\n */\n div.appendChild(dom.createElement('h4')).textContent =\n 'Create new thing somewhere'\n const creationDiv = div.appendChild(dom.createElement('div'))\n const creationContext: CreateContext = {\n div: creationDiv,\n dom,\n statusArea: div,\n me\n }\n const relevantPanes = await login.filterAvailablePanes(\n context.session.paneRegistry.list\n )\n create.newThingUI(creationContext, context, relevantPanes) // newUI Have to pass panes down\n\n login.registrationList(homePaneContext, {}).then(function () {})\n }\n\n const div = dom.createElement('div')\n const me: NamedNode = authn.currentUser() as NamedNode // this will be incorrect if not logged in\n\n showContent()\n\n return div\n }\n} // pane object\n\n// ends\nexport default HomePaneSource\n"],"mappings":";;;;;;AAYA,IAAAA,cAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA,MAAME,cAA8B,GAAG;EACrCC,IAAI,EAAEC,iBAAK,CAACC,QAAQ,GAAG,iBAAiB;EAAE;;EAE1CC,MAAM,EAAE,IAAI;EAEZC,IAAI,EAAE,MAAM;EAEZ;EACA;EACA;EACA;EACAC,KAAK,EAAE,SAAAA,CAAA,EAAY;IACjB,OAAO,MAAM;EACf,CAAC;EAEDC,MAAM,EAAE,SAAAA,CAAUC,OAAO,EAAEC,OAAO,EAAE;IAClC,MAAMC,GAAG,GAAGD,OAAO,CAACC,GAAG;IACvB,MAAMC,WAAW,GAAG,eAAAA,CAAA,EAAkB;MACpC,MAAMC,eAAe,GAAG;QAAEC,GAAG;QAAEH,GAAG;QAAEI,UAAU,EAAED,GAAG;QAAEE;MAAG,CAAC;MACzD;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACMF,GAAG,CAACG,WAAW,CAACN,GAAG,CAACO,aAAa,CAAC,IAAI,CAAC,CAAC,CAACC,WAAW,GAClD,4BAA4B;MAC9B,MAAMC,WAAW,GAAGN,GAAG,CAACG,WAAW,CAACN,GAAG,CAACO,aAAa,CAAC,KAAK,CAAC,CAAC;MAC7D,MAAMG,eAA8B,GAAG;QACrCP,GAAG,EAAEM,WAAW;QAChBT,GAAG;QACHI,UAAU,EAAED,GAAG;QACfE;MACF,CAAC;MACD,MAAMM,aAAa,GAAG,MAAMC,iBAAK,CAACC,oBAAoB,CACpDd,OAAO,CAACe,OAAO,CAACC,YAAY,CAACC,IAC/B,CAAC;MACDC,kBAAM,CAACC,UAAU,CAACR,eAAe,EAAEX,OAAO,EAAEY,aAAa,CAAC,EAAC;;MAE3DC,iBAAK,CAACO,gBAAgB,CAACjB,eAAe,EAAE,CAAC,CAAC,CAAC,CAACkB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAMjB,GAAG,GAAGH,GAAG,CAACO,aAAa,CAAC,KAAK,CAAC;IACpC,MAAMF,EAAa,GAAGgB,oBAAK,CAACC,WAAW,CAAC,CAAc,EAAC;;IAEvDrB,WAAW,CAAC,CAAC;IAEb,OAAOE,GAAG;EACZ;AACF,CAAC,EAAC;;AAEF;AAAA,IAAAoB,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACenC,cAAc","ignoreList":[]} \ No newline at end of file diff --git a/dist/humanReadablePane.js b/dist/humanReadablePane.js new file mode 100644 index 00000000..34b3fb16 --- /dev/null +++ b/dist/humanReadablePane.js @@ -0,0 +1,135 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _solidUiJss = require("solid-ui-jss"); +var _rdflib = require("rdflib"); +var _marked = require("marked"); +var _dompurify = _interopRequireDefault(require("dompurify")); +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } +/* Human-readable Pane + ** + ** This outline pane contains the document contents for an HTML document + ** This is for peeking at a page, because the user might not want to leave the data browser. + */ + +const humanReadablePane = { + icon: _solidUiJss.icons.originalIconBase + 'tango/22-text-x-generic.png', + name: 'humanReadable', + label: function (subject, context) { + const kb = context.session.store; + + // See also the source pane, which has lower precedence. + + const allowed = ['text/plain', 'text/html', 'text/markdown', 'application/xhtml+xml', 'image/png', 'image/jpeg', 'application/pdf', 'video/mp4']; + const hasContentTypeIn = function (kb, x, displayables) { + const cts = kb.fetcher.getHeader(x, 'content-type'); + if (cts) { + for (let j = 0; j < cts.length; j++) { + for (let k = 0; k < displayables.length; k++) { + if (cts[j].indexOf(displayables[k]) >= 0) { + return true; + } + } + } + } + return false; + }; + + // This data could come from a fetch OR from ldp container + const hasContentTypeIn2 = function (kb, x, displayables) { + const t = kb.findTypeURIs(x); + for (let k = 0; k < displayables.length; k++) { + if (_rdflib.Util.mediaTypeClass(displayables[k]).uri in t) { + return true; + } + } + return false; + }; + if (!subject.uri) return null; // no bnodes + + const t = kb.findTypeURIs(subject); + if (t[_solidUiJss.ns.link('WebPage').uri]) return 'view'; + if (hasContentTypeIn(kb, subject, allowed) || hasContentTypeIn2(kb, subject, allowed)) { + return 'View'; + } + return null; + }, + render: function (subject, context) { + const myDocument = context.dom; + const div = myDocument.createElement('div'); + const kb = context.session.store; + const cts = kb.fetcher.getHeader(subject.doc(), 'content-type'); + const ct = cts ? cts[0].split(';', 1)[0].trim() : null; // remove content-type parameters + if (ct) { + // console.log('humanReadablePane: c-t:' + ct) + } else { + console.log('humanReadablePane: unknown content-type?'); + } + + // @@ When we can, use CSP to turn off scripts within the iframe + div.setAttribute('class', 'docView'); + const element = ct === 'text/markdown' ? 'DIV' : 'IFRAME'; + const frame = myDocument.createElement(element); + const setIframeAttributes = (frame, blob, lines) => { + frame.setAttribute('src', URL.createObjectURL(blob)); + frame.setAttribute('type', blob.type); + frame.setAttribute('class', 'doc'); + frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`); + + // Apply sandbox attribute only for HTML files + // @@ Note below - if we set ANY sandbox, then Chrome and Safari won't display it if it is PDF. + // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe + // You can't have any sandbox and allow plugins. + // We could sandbox only HTML files I suppose. + if (blob.type === 'text/html' || blob.type === 'application/xhtml+xml') { + frame.setAttribute('sandbox', 'allow-scripts allow-same-origin'); + } + }; + + // render markdown to html + const markdownHtml = function () { + kb.fetcher.webOperation('GET', subject.uri).then(response => { + const markdownText = response.responseText; + const lines = Math.min(30, markdownText.split(/\n/).length + 5); + const res = _marked.marked.parse(markdownText); + const clean = _dompurify.default.sanitize(res); + frame.innerHTML = clean; + frame.setAttribute('class', 'doc'); + frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`); + }).catch(error => { + console.error('Error fetching markdown content:', error); + frame.innerHTML = '

Error loading content

'; + }); + }; + if (ct === 'text/markdown') { + markdownHtml(); + } else { + // Fetch and process the blob + kb.fetcher._fetch(subject.uri).then(response => response.blob()).then(blob => { + const blobTextPromise = blob.type.startsWith('text') ? blob.text() : Promise.resolve(''); + return blobTextPromise.then(blobText => ({ + blob, + blobText + })); + }).then(({ + blob, + blobText + }) => { + const newLines = blobText.includes('\n \n\n \n
\n
\n\n
\n
\n \n`\n\nexport default DOKIELI_TEMPLATE\n"],"mappings":";;;;;;AAAA,MAAMA,gBAAgB,GAAG;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEOH,gBAAgB","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"new.js","names":["DOKIELI_TEMPLATE"],"sources":["../../src/dokieli/new.js"],"sourcesContent":["const DOKIELI_TEMPLATE = `\n\n\n \n \n \n \n \n \n \n \n\n \n
\n
\n\n
\n
\n \n`\n\nexport default DOKIELI_TEMPLATE\n"],"mappings":"AAAA,MAAMA,gBAAgB,GAAG;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AAER,eAAeA,gBAAgB","ignoreList":[]} \ No newline at end of file diff --git a/dist/form/pane.js b/dist/form/pane.js index f08fbbbb..8b5d1e7b 100644 --- a/dist/form/pane.js +++ b/dist/form/pane.js @@ -1,20 +1,13 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.formPane = void 0; -var UI = _interopRequireWildcard(require("solid-ui-jss")); -var _solidLogicJss = require("solid-logic-jss"); -var $rdf = _interopRequireWildcard(require("rdflib")); -function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } /* ** Pane for running existing forms for any object ** */ +import * as UI from 'solid-ui-jss'; +import { authn } from 'solid-logic-jss'; +import * as $rdf from 'rdflib'; const ns = UI.ns; -const formPane = exports.formPane = { +export const formPane = { icon: UI.icons.iconBase + 'noun_122196.svg', name: 'form', audience: [ns.solid('PowerUser')], @@ -50,7 +43,7 @@ const formPane = exports.formPane = { // const t = kb.findTypeURIs(subject) - const me = _solidLogicJss.authn.currentUser(); + const me = authn.currentUser(); const box = dom.createElement('div'); box.setAttribute('class', 'formPane'); if (!me) { diff --git a/dist/form/pane.js.map b/dist/form/pane.js.map index faf6dc93..acb83f5b 100644 --- a/dist/form/pane.js.map +++ b/dist/form/pane.js.map @@ -1 +1 @@ -{"version":3,"file":"pane.js","names":["UI","_interopRequireWildcard","require","_solidLogicJss","$rdf","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ns","formPane","exports","icon","icons","iconBase","name","audience","solid","label","subject","widgets","formsFor","length","log","debug","render","context","kb","session","store","dom","mention","complain","message","style","pre","createElement","setAttribute","box","appendChild","textContent","complainIfBad","ok","body","me","authn","currentUser","ws","each","ui","renderFormsFor","fetcher","nowOrWhenFetched","uri","forms","form","heading","formStore","Util","document","editFormButton","anchor","utils","appendForm","docuri","docpart","updater","editable","doc","any","sym","link","docs","docList","statementsMatching","forEach","st","why","undefined","d","push","sort","_followeach","path","oo","res","concat","slice","date","foobarbaz","login","selectWorkspace","activities","space","j","act","subjectDoc2","start","cal","value","end"],"sources":["../../src/form/pane.js"],"sourcesContent":["/*\n ** Pane for running existing forms for any object\n **\n */\n\nimport * as UI from 'solid-ui-jss'\nimport { authn } from 'solid-logic-jss'\nimport * as $rdf from 'rdflib'\nconst ns = UI.ns\n\nexport const formPane = {\n icon: UI.icons.iconBase + 'noun_122196.svg',\n\n name: 'form',\n\n audience: [ns.solid('PowerUser')],\n\n // Does the subject deserve this pane?\n label: function (subject) {\n const n = UI.widgets.formsFor(subject).length\n UI.log.debug('Form pane: forms for ' + subject + ': ' + n)\n if (!n) return null\n return '' + n + ' forms'\n },\n\n render: function (subject, context) {\n const kb = context.session.store\n const dom = context.dom\n\n const mention = function complain (message, style) {\n const pre = dom.createElement('p')\n pre.setAttribute('style', style || 'color: grey; background-color: white')\n box.appendChild(pre).textContent = message\n return pre\n }\n\n const complain = function complain (message, style) {\n mention(message, 'style', style || 'color: grey; background-color: #fdd;')\n }\n\n const complainIfBad = function (ok, body) {\n if (ok) {\n // setModifiedDate(store, kb, store);\n // rerender(box); // Deleted forms at the moment\n } else complain('Sorry, failed to save your change:\\n' + body)\n }\n\n // The question of where to store this data about subject\n // This in general needs a whole lot more thought\n // and it connects to the discoverbility through links\n\n // const t = kb.findTypeURIs(subject)\n\n const me = authn.currentUser()\n\n const box = dom.createElement('div')\n box.setAttribute('class', 'formPane')\n\n if (!me) {\n mention(\n 'You are not logged in. If you log in and have ' +\n 'workspaces then you would be able to select workspace in which ' +\n 'to put this new information'\n )\n } else {\n const ws = kb.each(me, ns.ui('workspace'))\n if (ws.length === 0) {\n mention(\n 'You don\\'t seem to have any workspaces defined. ' +\n 'A workspace is a place on the web (http://..) or in ' +\n 'the file system (file:///) to store application data.\\n'\n )\n } else {\n // @@\n }\n }\n\n // Render forms using a given store\n\n const renderFormsFor = function (store, subject) {\n kb.fetcher.nowOrWhenFetched(store.uri, subject, function (ok, body) {\n if (!ok) return complain('Cannot load store ' + store.uri + ': ' + body)\n\n // Render the forms\n\n const forms = UI.widgets.formsFor(subject)\n\n // complain('Form for editing this form:');\n for (let i = 0; i < forms.length; i++) {\n const form = forms[i]\n const heading = dom.createElement('h4')\n box.appendChild(heading)\n if (form.uri) {\n const formStore = $rdf.Util.uri.document(form.uri)\n if (formStore.uri !== form.uri) {\n // The form is a hash-type URI\n const e = box.appendChild(\n UI.widgets.editFormButton(\n dom,\n box,\n form,\n formStore,\n complainIfBad\n )\n )\n e.setAttribute('style', 'float: right;')\n }\n }\n const anchor = dom.createElement('a')\n anchor.setAttribute('href', form.uri)\n heading.appendChild(anchor)\n anchor.textContent = UI.utils.label(form, true)\n\n /* Keep tis as a reminder to let a New one have its URI given by user\n mention(\"Where will this information be stored?\")\n const ele = dom.createElement('input');\n box.appendChild(ele);\n ele.setAttribute('type', 'text');\n ele.setAttribute('size', '72');\n ele.setAttribute('maxlength', '1024');\n ele.setAttribute('style', 'font-size: 80%; color:#222;');\n ele.value = store.uri\n */\n\n UI.widgets.appendForm(\n dom,\n box,\n {},\n subject,\n form,\n store,\n complainIfBad\n )\n }\n }) // end: when store loded\n } // renderFormsFor\n\n // Figure out what store\n\n // Which places are editable and have stuff about the subject?\n\n let store = null\n\n // 1. The document URI of the subject itself\n const docuri = $rdf.Util.uri.docpart(subject.uri)\n if (subject.uri !== docuri && kb.updater.editable(docuri, kb)) {\n store = subject.doc()\n } // an editable data file with hash\n\n store = store || kb.any(kb.sym(docuri), ns.link('annotationStore'))\n\n // 2. where stuff is already stored\n if (!store) {\n const docs = {}\n const docList = []\n store.statementsMatching(subject).forEach(function (st) {\n docs[st.why.uri] = 1\n })\n store\n .statementsMatching(undefined, undefined, subject)\n .forEach(function (st) {\n docs[st.why.uri] = 2\n })\n for (const d in docs) docList.push(docs[d], d)\n docList.sort()\n for (let i = 0; i < docList.length; i++) {\n const uri = docList[i][1]\n if (uri && store.updater.editable(uri)) {\n store = store.sym(uri)\n break\n }\n }\n }\n\n // 3. In a workspace store\n // @@ TODO: Can probably remove _followeach (not done this time because the commit is a very safe refactor)\n const _followeach = function (kb, subject, path) {\n if (path.length === 0) return [subject]\n const oo = kb.each(subject, path[0])\n let res = []\n for (let i = 0; i < oo.length; i++) {\n res = res.concat(_followeach(kb, oo[i], path.slice(1)))\n }\n return res\n }\n\n const date = '2014' // @@@@@@@@@@@@ pass as parameter\n\n if (store) {\n // mention(\"@@ Ok, we have a store <\" + store.uri + \">.\");\n renderFormsFor(store, subject)\n } else {\n complain('No suitable store is known, to edit <' + subject.uri + '>.')\n const foobarbaz = UI.login.selectWorkspace(dom, function (ws) {\n mention('Workspace selected OK: ' + ws)\n\n const activities = store.each(undefined, ns.space('workspace'), ws)\n for (let j = 0; j < activities.length; j++) {\n const act = activities[j]\n\n const subjectDoc2 = store.any(ws, ns.space('store'))\n const start = store.any(ws, ns.cal('dtstart')).value()\n const end = store.any(ws, ns.cal('dtend')).value()\n if (subjectDoc2 && start && end && start <= date && end > date) {\n renderFormsFor(subjectDoc2, subject)\n break\n } else {\n complain('Note no suitable annotation store in activity: ' + act)\n }\n }\n })\n box.appendChild(foobarbaz)\n }\n\n return box\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"pane.js","names":["UI","authn","$rdf","ns","formPane","icon","icons","iconBase","name","audience","solid","label","subject","n","widgets","formsFor","length","log","debug","render","context","kb","session","store","dom","mention","complain","message","style","pre","createElement","setAttribute","box","appendChild","textContent","complainIfBad","ok","body","me","currentUser","ws","each","ui","renderFormsFor","fetcher","nowOrWhenFetched","uri","forms","i","form","heading","formStore","Util","document","e","editFormButton","anchor","utils","appendForm","docuri","docpart","updater","editable","doc","any","sym","link","docs","docList","statementsMatching","forEach","st","why","undefined","d","push","sort","_followeach","path","oo","res","concat","slice","date","foobarbaz","login","selectWorkspace","activities","space","j","act","subjectDoc2","start","cal","value","end"],"sources":["../../src/form/pane.js"],"sourcesContent":["/*\n ** Pane for running existing forms for any object\n **\n */\n\nimport * as UI from 'solid-ui-jss'\nimport { authn } from 'solid-logic-jss'\nimport * as $rdf from 'rdflib'\nconst ns = UI.ns\n\nexport const formPane = {\n icon: UI.icons.iconBase + 'noun_122196.svg',\n\n name: 'form',\n\n audience: [ns.solid('PowerUser')],\n\n // Does the subject deserve this pane?\n label: function (subject) {\n const n = UI.widgets.formsFor(subject).length\n UI.log.debug('Form pane: forms for ' + subject + ': ' + n)\n if (!n) return null\n return '' + n + ' forms'\n },\n\n render: function (subject, context) {\n const kb = context.session.store\n const dom = context.dom\n\n const mention = function complain (message, style) {\n const pre = dom.createElement('p')\n pre.setAttribute('style', style || 'color: grey; background-color: white')\n box.appendChild(pre).textContent = message\n return pre\n }\n\n const complain = function complain (message, style) {\n mention(message, 'style', style || 'color: grey; background-color: #fdd;')\n }\n\n const complainIfBad = function (ok, body) {\n if (ok) {\n // setModifiedDate(store, kb, store);\n // rerender(box); // Deleted forms at the moment\n } else complain('Sorry, failed to save your change:\\n' + body)\n }\n\n // The question of where to store this data about subject\n // This in general needs a whole lot more thought\n // and it connects to the discoverbility through links\n\n // const t = kb.findTypeURIs(subject)\n\n const me = authn.currentUser()\n\n const box = dom.createElement('div')\n box.setAttribute('class', 'formPane')\n\n if (!me) {\n mention(\n 'You are not logged in. If you log in and have ' +\n 'workspaces then you would be able to select workspace in which ' +\n 'to put this new information'\n )\n } else {\n const ws = kb.each(me, ns.ui('workspace'))\n if (ws.length === 0) {\n mention(\n 'You don\\'t seem to have any workspaces defined. ' +\n 'A workspace is a place on the web (http://..) or in ' +\n 'the file system (file:///) to store application data.\\n'\n )\n } else {\n // @@\n }\n }\n\n // Render forms using a given store\n\n const renderFormsFor = function (store, subject) {\n kb.fetcher.nowOrWhenFetched(store.uri, subject, function (ok, body) {\n if (!ok) return complain('Cannot load store ' + store.uri + ': ' + body)\n\n // Render the forms\n\n const forms = UI.widgets.formsFor(subject)\n\n // complain('Form for editing this form:');\n for (let i = 0; i < forms.length; i++) {\n const form = forms[i]\n const heading = dom.createElement('h4')\n box.appendChild(heading)\n if (form.uri) {\n const formStore = $rdf.Util.uri.document(form.uri)\n if (formStore.uri !== form.uri) {\n // The form is a hash-type URI\n const e = box.appendChild(\n UI.widgets.editFormButton(\n dom,\n box,\n form,\n formStore,\n complainIfBad\n )\n )\n e.setAttribute('style', 'float: right;')\n }\n }\n const anchor = dom.createElement('a')\n anchor.setAttribute('href', form.uri)\n heading.appendChild(anchor)\n anchor.textContent = UI.utils.label(form, true)\n\n /* Keep tis as a reminder to let a New one have its URI given by user\n mention(\"Where will this information be stored?\")\n const ele = dom.createElement('input');\n box.appendChild(ele);\n ele.setAttribute('type', 'text');\n ele.setAttribute('size', '72');\n ele.setAttribute('maxlength', '1024');\n ele.setAttribute('style', 'font-size: 80%; color:#222;');\n ele.value = store.uri\n */\n\n UI.widgets.appendForm(\n dom,\n box,\n {},\n subject,\n form,\n store,\n complainIfBad\n )\n }\n }) // end: when store loded\n } // renderFormsFor\n\n // Figure out what store\n\n // Which places are editable and have stuff about the subject?\n\n let store = null\n\n // 1. The document URI of the subject itself\n const docuri = $rdf.Util.uri.docpart(subject.uri)\n if (subject.uri !== docuri && kb.updater.editable(docuri, kb)) {\n store = subject.doc()\n } // an editable data file with hash\n\n store = store || kb.any(kb.sym(docuri), ns.link('annotationStore'))\n\n // 2. where stuff is already stored\n if (!store) {\n const docs = {}\n const docList = []\n store.statementsMatching(subject).forEach(function (st) {\n docs[st.why.uri] = 1\n })\n store\n .statementsMatching(undefined, undefined, subject)\n .forEach(function (st) {\n docs[st.why.uri] = 2\n })\n for (const d in docs) docList.push(docs[d], d)\n docList.sort()\n for (let i = 0; i < docList.length; i++) {\n const uri = docList[i][1]\n if (uri && store.updater.editable(uri)) {\n store = store.sym(uri)\n break\n }\n }\n }\n\n // 3. In a workspace store\n // @@ TODO: Can probably remove _followeach (not done this time because the commit is a very safe refactor)\n const _followeach = function (kb, subject, path) {\n if (path.length === 0) return [subject]\n const oo = kb.each(subject, path[0])\n let res = []\n for (let i = 0; i < oo.length; i++) {\n res = res.concat(_followeach(kb, oo[i], path.slice(1)))\n }\n return res\n }\n\n const date = '2014' // @@@@@@@@@@@@ pass as parameter\n\n if (store) {\n // mention(\"@@ Ok, we have a store <\" + store.uri + \">.\");\n renderFormsFor(store, subject)\n } else {\n complain('No suitable store is known, to edit <' + subject.uri + '>.')\n const foobarbaz = UI.login.selectWorkspace(dom, function (ws) {\n mention('Workspace selected OK: ' + ws)\n\n const activities = store.each(undefined, ns.space('workspace'), ws)\n for (let j = 0; j < activities.length; j++) {\n const act = activities[j]\n\n const subjectDoc2 = store.any(ws, ns.space('store'))\n const start = store.any(ws, ns.cal('dtstart')).value()\n const end = store.any(ws, ns.cal('dtend')).value()\n if (subjectDoc2 && start && end && start <= date && end > date) {\n renderFormsFor(subjectDoc2, subject)\n break\n } else {\n complain('Note no suitable annotation store in activity: ' + act)\n }\n }\n })\n box.appendChild(foobarbaz)\n }\n\n return box\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/home/homePane.js b/dist/home/homePane.js index 05064314..df1734b2 100644 --- a/dist/home/homePane.js +++ b/dist/home/homePane.js @@ -1,11 +1,3 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _solidLogicJss = require("solid-logic-jss"); -var _solidUiJss = require("solid-ui-jss"); /* Home Pane ** ** The home pane is avaiable everywhere and allows a user @@ -16,8 +8,10 @@ var _solidUiJss = require("solid-ui-jss"); ** */ +import { authn } from 'solid-logic-jss'; +import { create, icons, login } from 'solid-ui-jss'; const HomePaneSource = { - icon: _solidUiJss.icons.iconBase + 'noun_547570.svg', + icon: icons.iconBase + 'noun_547570.svg', // noun_25830 global: true, @@ -55,13 +49,13 @@ const HomePaneSource = { statusArea: div, me }; - const relevantPanes = await _solidUiJss.login.filterAvailablePanes(context.session.paneRegistry.list); - _solidUiJss.create.newThingUI(creationContext, context, relevantPanes); // newUI Have to pass panes down + const relevantPanes = await login.filterAvailablePanes(context.session.paneRegistry.list); + create.newThingUI(creationContext, context, relevantPanes); // newUI Have to pass panes down - _solidUiJss.login.registrationList(homePaneContext, {}).then(function () {}); + login.registrationList(homePaneContext, {}).then(function () {}); }; const div = dom.createElement('div'); - const me = _solidLogicJss.authn.currentUser(); // this will be incorrect if not logged in + const me = authn.currentUser(); // this will be incorrect if not logged in showContent(); return div; @@ -69,5 +63,5 @@ const HomePaneSource = { }; // pane object // ends -var _default = exports.default = HomePaneSource; +export default HomePaneSource; //# sourceMappingURL=homePane.js.map \ No newline at end of file diff --git a/dist/home/homePane.js.map b/dist/home/homePane.js.map index a0587e48..6cbdd066 100644 --- a/dist/home/homePane.js.map +++ b/dist/home/homePane.js.map @@ -1 +1 @@ -{"version":3,"file":"homePane.js","names":["_solidLogicJss","require","_solidUiJss","HomePaneSource","icon","icons","iconBase","global","name","label","render","subject","context","dom","showContent","homePaneContext","div","statusArea","me","appendChild","createElement","textContent","creationDiv","creationContext","relevantPanes","login","filterAvailablePanes","session","paneRegistry","list","create","newThingUI","registrationList","then","authn","currentUser","_default","exports","default"],"sources":["../../src/home/homePane.ts"],"sourcesContent":["/* Home Pane\n **\n ** The home pane is avaiable everywhere and allows a user\n ** to\n ** - keep track of their stuff\n ** - make new things, and possibly\n ** - keep track of accounts and workspaces etc\n **\n */\n\nimport { PaneDefinition } from 'pane-registry'\nimport { NamedNode } from 'rdflib'\nimport { authn } from 'solid-logic-jss'\nimport { create, icons, login } from 'solid-ui-jss'\nimport type { CreateContext } from 'solid-ui-jss'\n\nconst HomePaneSource: PaneDefinition = {\n icon: icons.iconBase + 'noun_547570.svg', // noun_25830\n\n global: true,\n\n name: 'home',\n\n // Does the subject deserve an home pane?\n //\n // yes, always!\n //\n label: function () {\n return 'home'\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const showContent = async function () {\n const homePaneContext = { div, dom, statusArea: div, me }\n /*\n div.appendChild(dom.createElement('h4')).textContent = 'Login status'\n var loginStatusDiv = div.appendChild(context.dom.createElement('div'))\n // TODO: Find out what the actual type is:\n type UriType = unknown;\n loginStatusDiv.appendChild(UI.login.loginStatusBox(context.dom, () => {\n // Here we know new log in status\n }))\n */\n div.appendChild(dom.createElement('h4')).textContent =\n 'Create new thing somewhere'\n const creationDiv = div.appendChild(dom.createElement('div'))\n const creationContext: CreateContext = {\n div: creationDiv,\n dom,\n statusArea: div,\n me\n }\n const relevantPanes = await login.filterAvailablePanes(\n context.session.paneRegistry.list\n )\n create.newThingUI(creationContext, context, relevantPanes) // newUI Have to pass panes down\n\n login.registrationList(homePaneContext, {}).then(function () {})\n }\n\n const div = dom.createElement('div')\n const me: NamedNode = authn.currentUser() as NamedNode // this will be incorrect if not logged in\n\n showContent()\n\n return div\n }\n} // pane object\n\n// ends\nexport default HomePaneSource\n"],"mappings":";;;;;;AAYA,IAAAA,cAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA,MAAME,cAA8B,GAAG;EACrCC,IAAI,EAAEC,iBAAK,CAACC,QAAQ,GAAG,iBAAiB;EAAE;;EAE1CC,MAAM,EAAE,IAAI;EAEZC,IAAI,EAAE,MAAM;EAEZ;EACA;EACA;EACA;EACAC,KAAK,EAAE,SAAAA,CAAA,EAAY;IACjB,OAAO,MAAM;EACf,CAAC;EAEDC,MAAM,EAAE,SAAAA,CAAUC,OAAO,EAAEC,OAAO,EAAE;IAClC,MAAMC,GAAG,GAAGD,OAAO,CAACC,GAAG;IACvB,MAAMC,WAAW,GAAG,eAAAA,CAAA,EAAkB;MACpC,MAAMC,eAAe,GAAG;QAAEC,GAAG;QAAEH,GAAG;QAAEI,UAAU,EAAED,GAAG;QAAEE;MAAG,CAAC;MACzD;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACMF,GAAG,CAACG,WAAW,CAACN,GAAG,CAACO,aAAa,CAAC,IAAI,CAAC,CAAC,CAACC,WAAW,GAClD,4BAA4B;MAC9B,MAAMC,WAAW,GAAGN,GAAG,CAACG,WAAW,CAACN,GAAG,CAACO,aAAa,CAAC,KAAK,CAAC,CAAC;MAC7D,MAAMG,eAA8B,GAAG;QACrCP,GAAG,EAAEM,WAAW;QAChBT,GAAG;QACHI,UAAU,EAAED,GAAG;QACfE;MACF,CAAC;MACD,MAAMM,aAAa,GAAG,MAAMC,iBAAK,CAACC,oBAAoB,CACpDd,OAAO,CAACe,OAAO,CAACC,YAAY,CAACC,IAC/B,CAAC;MACDC,kBAAM,CAACC,UAAU,CAACR,eAAe,EAAEX,OAAO,EAAEY,aAAa,CAAC,EAAC;;MAE3DC,iBAAK,CAACO,gBAAgB,CAACjB,eAAe,EAAE,CAAC,CAAC,CAAC,CAACkB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAMjB,GAAG,GAAGH,GAAG,CAACO,aAAa,CAAC,KAAK,CAAC;IACpC,MAAMF,EAAa,GAAGgB,oBAAK,CAACC,WAAW,CAAC,CAAc,EAAC;;IAEvDrB,WAAW,CAAC,CAAC;IAEb,OAAOE,GAAG;EACZ;AACF,CAAC,EAAC;;AAEF;AAAA,IAAAoB,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACenC,cAAc","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"homePane.js","names":["authn","create","icons","login","HomePaneSource","icon","iconBase","global","name","label","render","subject","context","dom","showContent","homePaneContext","div","statusArea","me","appendChild","createElement","textContent","creationDiv","creationContext","relevantPanes","filterAvailablePanes","session","paneRegistry","list","newThingUI","registrationList","then","currentUser"],"sources":["../../src/home/homePane.ts"],"sourcesContent":["/* Home Pane\n **\n ** The home pane is avaiable everywhere and allows a user\n ** to\n ** - keep track of their stuff\n ** - make new things, and possibly\n ** - keep track of accounts and workspaces etc\n **\n */\n\nimport { PaneDefinition } from 'pane-registry'\nimport { NamedNode } from 'rdflib'\nimport { authn } from 'solid-logic-jss'\nimport { create, icons, login } from 'solid-ui-jss'\nimport type { CreateContext } from 'solid-ui-jss'\n\nconst HomePaneSource: PaneDefinition = {\n icon: icons.iconBase + 'noun_547570.svg', // noun_25830\n\n global: true,\n\n name: 'home',\n\n // Does the subject deserve an home pane?\n //\n // yes, always!\n //\n label: function () {\n return 'home'\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const showContent = async function () {\n const homePaneContext = { div, dom, statusArea: div, me }\n /*\n div.appendChild(dom.createElement('h4')).textContent = 'Login status'\n var loginStatusDiv = div.appendChild(context.dom.createElement('div'))\n // TODO: Find out what the actual type is:\n type UriType = unknown;\n loginStatusDiv.appendChild(UI.login.loginStatusBox(context.dom, () => {\n // Here we know new log in status\n }))\n */\n div.appendChild(dom.createElement('h4')).textContent =\n 'Create new thing somewhere'\n const creationDiv = div.appendChild(dom.createElement('div'))\n const creationContext: CreateContext = {\n div: creationDiv,\n dom,\n statusArea: div,\n me\n }\n const relevantPanes = await login.filterAvailablePanes(\n context.session.paneRegistry.list\n )\n create.newThingUI(creationContext, context, relevantPanes) // newUI Have to pass panes down\n\n login.registrationList(homePaneContext, {}).then(function () {})\n }\n\n const div = dom.createElement('div')\n const me: NamedNode = authn.currentUser() as NamedNode // this will be incorrect if not logged in\n\n showContent()\n\n return div\n }\n} // pane object\n\n// ends\nexport default HomePaneSource\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,SAASA,KAAK,QAAQ,iBAAiB;AACvC,SAASC,MAAM,EAAEC,KAAK,EAAEC,KAAK,QAAQ,cAAc;AAGnD,MAAMC,cAA8B,GAAG;EACrCC,IAAI,EAAEH,KAAK,CAACI,QAAQ,GAAG,iBAAiB;EAAE;;EAE1CC,MAAM,EAAE,IAAI;EAEZC,IAAI,EAAE,MAAM;EAEZ;EACA;EACA;EACA;EACAC,KAAK,EAAE,SAAAA,CAAA,EAAY;IACjB,OAAO,MAAM;EACf,CAAC;EAEDC,MAAM,EAAE,SAAAA,CAAUC,OAAO,EAAEC,OAAO,EAAE;IAClC,MAAMC,GAAG,GAAGD,OAAO,CAACC,GAAG;IACvB,MAAMC,WAAW,GAAG,eAAAA,CAAA,EAAkB;MACpC,MAAMC,eAAe,GAAG;QAAEC,GAAG;QAAEH,GAAG;QAAEI,UAAU,EAAED,GAAG;QAAEE;MAAG,CAAC;MACzD;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACMF,GAAG,CAACG,WAAW,CAACN,GAAG,CAACO,aAAa,CAAC,IAAI,CAAC,CAAC,CAACC,WAAW,GAClD,4BAA4B;MAC9B,MAAMC,WAAW,GAAGN,GAAG,CAACG,WAAW,CAACN,GAAG,CAACO,aAAa,CAAC,KAAK,CAAC,CAAC;MAC7D,MAAMG,eAA8B,GAAG;QACrCP,GAAG,EAAEM,WAAW;QAChBT,GAAG;QACHI,UAAU,EAAED,GAAG;QACfE;MACF,CAAC;MACD,MAAMM,aAAa,GAAG,MAAMrB,KAAK,CAACsB,oBAAoB,CACpDb,OAAO,CAACc,OAAO,CAACC,YAAY,CAACC,IAC/B,CAAC;MACD3B,MAAM,CAAC4B,UAAU,CAACN,eAAe,EAAEX,OAAO,EAAEY,aAAa,CAAC,EAAC;;MAE3DrB,KAAK,CAAC2B,gBAAgB,CAACf,eAAe,EAAE,CAAC,CAAC,CAAC,CAACgB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAMf,GAAG,GAAGH,GAAG,CAACO,aAAa,CAAC,KAAK,CAAC;IACpC,MAAMF,EAAa,GAAGlB,KAAK,CAACgC,WAAW,CAAC,CAAc,EAAC;;IAEvDlB,WAAW,CAAC,CAAC;IAEb,OAAOE,GAAG;EACZ;AACF,CAAC,EAAC;;AAEF;AACA,eAAeZ,cAAc","ignoreList":[]} \ No newline at end of file diff --git a/dist/humanReadablePane.js b/dist/humanReadablePane.js index 34b3fb16..438fc627 100644 --- a/dist/humanReadablePane.js +++ b/dist/humanReadablePane.js @@ -1,22 +1,14 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _solidUiJss = require("solid-ui-jss"); -var _rdflib = require("rdflib"); -var _marked = require("marked"); -var _dompurify = _interopRequireDefault(require("dompurify")); -function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /* Human-readable Pane ** ** This outline pane contains the document contents for an HTML document ** This is for peeking at a page, because the user might not want to leave the data browser. */ - +import { icons, ns } from 'solid-ui-jss'; +import { Util } from 'rdflib'; +import { marked } from 'marked'; +import DOMPurify from 'dompurify'; const humanReadablePane = { - icon: _solidUiJss.icons.originalIconBase + 'tango/22-text-x-generic.png', + icon: icons.originalIconBase + 'tango/22-text-x-generic.png', name: 'humanReadable', label: function (subject, context) { const kb = context.session.store; @@ -42,7 +34,7 @@ const humanReadablePane = { const hasContentTypeIn2 = function (kb, x, displayables) { const t = kb.findTypeURIs(x); for (let k = 0; k < displayables.length; k++) { - if (_rdflib.Util.mediaTypeClass(displayables[k]).uri in t) { + if (Util.mediaTypeClass(displayables[k]).uri in t) { return true; } } @@ -51,7 +43,7 @@ const humanReadablePane = { if (!subject.uri) return null; // no bnodes const t = kb.findTypeURIs(subject); - if (t[_solidUiJss.ns.link('WebPage').uri]) return 'view'; + if (t[ns.link('WebPage').uri]) return 'view'; if (hasContentTypeIn(kb, subject, allowed) || hasContentTypeIn2(kb, subject, allowed)) { return 'View'; } @@ -94,8 +86,8 @@ const humanReadablePane = { kb.fetcher.webOperation('GET', subject.uri).then(response => { const markdownText = response.responseText; const lines = Math.min(30, markdownText.split(/\n/).length + 5); - const res = _marked.marked.parse(markdownText); - const clean = _dompurify.default.sanitize(res); + const res = marked.parse(markdownText); + const clean = DOMPurify.sanitize(res); frame.innerHTML = clean; frame.setAttribute('class', 'doc'); frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`); @@ -131,5 +123,6 @@ const humanReadablePane = { return div; } }; -var _default = exports.default = humanReadablePane; // ends +export default humanReadablePane; +// ends //# sourceMappingURL=humanReadablePane.js.map \ No newline at end of file diff --git a/dist/humanReadablePane.js.map b/dist/humanReadablePane.js.map index 77e1efb1..0b46c235 100644 --- a/dist/humanReadablePane.js.map +++ b/dist/humanReadablePane.js.map @@ -1 +1 @@ -{"version":3,"file":"humanReadablePane.js","names":["_solidUiJss","require","_rdflib","_marked","_dompurify","_interopRequireDefault","e","__esModule","default","humanReadablePane","icon","icons","originalIconBase","name","label","subject","context","kb","session","store","allowed","hasContentTypeIn","x","displayables","cts","fetcher","getHeader","j","length","k","indexOf","hasContentTypeIn2","t","findTypeURIs","Util","mediaTypeClass","uri","ns","link","render","myDocument","dom","div","createElement","doc","ct","split","trim","console","log","setAttribute","element","frame","setIframeAttributes","blob","lines","URL","createObjectURL","type","markdownHtml","webOperation","then","response","markdownText","responseText","Math","min","res","marked","parse","clean","DOMPurify","sanitize","innerHTML","catch","error","_fetch","blobTextPromise","startsWith","text","Promise","resolve","blobText","newLines","includes","err","tr","appendChild","_default","exports"],"sources":["../src/humanReadablePane.js"],"sourcesContent":["/* Human-readable Pane\n **\n ** This outline pane contains the document contents for an HTML document\n ** This is for peeking at a page, because the user might not want to leave the data browser.\n */\nimport { icons, ns } from 'solid-ui-jss'\nimport { Util } from 'rdflib'\nimport { marked } from 'marked'\nimport DOMPurify from 'dompurify'\n\nconst humanReadablePane = {\n icon: icons.originalIconBase + 'tango/22-text-x-generic.png',\n\n name: 'humanReadable',\n\n label: function (subject, context) {\n const kb = context.session.store\n\n // See also the source pane, which has lower precedence.\n\n const allowed = [\n 'text/plain',\n 'text/html',\n 'text/markdown',\n 'application/xhtml+xml',\n 'image/png',\n 'image/jpeg',\n 'application/pdf',\n 'video/mp4'\n ]\n\n const hasContentTypeIn = function (kb, x, displayables) {\n const cts = kb.fetcher.getHeader(x, 'content-type')\n if (cts) {\n for (let j = 0; j < cts.length; j++) {\n for (let k = 0; k < displayables.length; k++) {\n if (cts[j].indexOf(displayables[k]) >= 0) {\n return true\n }\n }\n }\n }\n return false\n }\n\n // This data could come from a fetch OR from ldp container\n const hasContentTypeIn2 = function (kb, x, displayables) {\n const t = kb.findTypeURIs(x)\n for (let k = 0; k < displayables.length; k++) {\n if (Util.mediaTypeClass(displayables[k]).uri in t) {\n return true\n }\n }\n return false\n }\n\n if (!subject.uri) return null // no bnodes\n\n const t = kb.findTypeURIs(subject)\n if (t[ns.link('WebPage').uri]) return 'view'\n\n if (\n hasContentTypeIn(kb, subject, allowed) ||\n hasContentTypeIn2(kb, subject, allowed)\n ) {\n return 'View'\n }\n\n return null\n },\n\n render: function (subject, context) {\n const myDocument = context.dom\n const div = myDocument.createElement('div')\n const kb = context.session.store\n\n const cts = kb.fetcher.getHeader(subject.doc(), 'content-type')\n const ct = cts ? cts[0].split(';', 1)[0].trim() : null // remove content-type parameters\n if (ct) {\n // console.log('humanReadablePane: c-t:' + ct)\n } else {\n console.log('humanReadablePane: unknown content-type?')\n }\n\n // @@ When we can, use CSP to turn off scripts within the iframe\n div.setAttribute('class', 'docView')\n const element = ct === 'text/markdown' ? 'DIV' : 'IFRAME'\n const frame = myDocument.createElement(element)\n\n const setIframeAttributes = (frame, blob, lines) => {\n frame.setAttribute('src', URL.createObjectURL(blob))\n frame.setAttribute('type', blob.type)\n frame.setAttribute('class', 'doc')\n frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`)\n\n // Apply sandbox attribute only for HTML files\n // @@ Note below - if we set ANY sandbox, then Chrome and Safari won't display it if it is PDF.\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe\n // You can't have any sandbox and allow plugins.\n // We could sandbox only HTML files I suppose.\n if (blob.type === 'text/html' || blob.type === 'application/xhtml+xml') {\n frame.setAttribute('sandbox', 'allow-scripts allow-same-origin')\n }\n }\n\n // render markdown to html\n const markdownHtml = function () {\n kb.fetcher.webOperation('GET', subject.uri).then(response => {\n const markdownText = response.responseText\n const lines = Math.min(30, markdownText.split(/\\n/).length + 5)\n const res = marked.parse(markdownText)\n const clean = DOMPurify.sanitize(res)\n frame.innerHTML = clean\n frame.setAttribute('class', 'doc')\n frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`)\n }).catch(error => {\n console.error('Error fetching markdown content:', error)\n frame.innerHTML = '

Error loading content

'\n })\n }\n\n if (ct === 'text/markdown') {\n markdownHtml()\n } else {\n // Fetch and process the blob\n kb.fetcher._fetch(subject.uri)\n .then(response => response.blob())\n .then(blob => {\n const blobTextPromise = blob.type.startsWith('text') ? blob.text() : Promise.resolve('')\n return blobTextPromise.then(blobText => ({ blob, blobText }))\n })\n .then(({ blob, blobText }) => {\n const newLines = blobText.includes(' +``` + +## Matching Criteria + +The pane activates when viewing: +- Resources with type `schema:Bookmark` +- Containers with `schema:Bookmark` items + +## Development + +1. Copy this folder to `solid-panes-jss/src/` +2. Add to `registerPanes.js`: + ```javascript + import { bookmarkPane } from './bookmark-pane/lazy.js' + register(bookmarkPane) + ``` +3. Run `npm start` in mashlib-jss +4. Navigate to a bookmark resource diff --git a/examples/bookmark-pane/lazy.js b/examples/bookmark-pane/lazy.js new file mode 100644 index 00000000..1294ed70 --- /dev/null +++ b/examples/bookmark-pane/lazy.js @@ -0,0 +1,107 @@ +/** + * Bookmark Pane - Lazy Wrapper + * + * This lightweight wrapper is always loaded. It contains only: + * - Icon and name + * - label() function for type checking + * - Async render() that loads the full implementation on demand + * + * The actual rendering code is in render.js and only loads + * when someone views a bookmark. + */ + +// Import only what's needed for label() checks +import * as UI from 'solid-ui-jss' + +const ns = UI.ns + +// Define schema namespace for bookmarks +const schema = UI.rdf.Namespace('http://schema.org/') + +export const bookmarkPane = { + // Unique identifier for this pane + name: 'bookmark', + + // Icon shown in pane selector + icon: UI.icons.iconBase + 'noun_97839.svg', // bookmark icon + + // Optional: restrict to power users + // audience: [ns.solid('PowerUser')], + + /** + * Label function - determines if this pane is relevant + * + * MUST be synchronous and lightweight! + * Called for every subject the user views. + * + * @param {NamedNode} subject - The RDF resource being viewed + * @param {Object} context - Contains session, dom, etc. + * @returns {string|null} - Tooltip string if relevant, null if not + */ + label: function (subject, context) { + const kb = context.session.store + + // Check if subject is a Bookmark + const types = kb.findTypeURIs(subject) + if (types[schema('Bookmark').uri]) { + return 'Bookmark' + } + + // Check if subject is a container with bookmarks + if (types[ns.ldp('Container').uri] || types[ns.ldp('BasicContainer').uri]) { + const contents = kb.each(subject, ns.ldp('contains')) + const hasBookmarks = contents.some(item => { + const itemTypes = kb.findTypeURIs(item) + return itemTypes[schema('Bookmark').uri] + }) + if (hasBookmarks) { + return 'Bookmarks' + } + } + + return null + }, + + /** + * Render function - creates the UI + * + * Can be async! The outline manager handles Promise returns. + * Use dynamic import() to load the full implementation. + * + * @param {NamedNode} subject - The RDF resource to render + * @param {Object} context - Contains session, dom, etc. + * @param {Object} options - Additional render options + * @returns {Promise} - The rendered pane + */ + render: async function (subject, context, options) { + // Dynamic import - webpack creates a separate chunk + const { render } = await import( + /* webpackChunkName: "bookmark-pane" */ + './render.js' + ) + return render(subject, context, options) + }, + + /** + * MintNew - creates a new bookmark + * + * Called when user wants to create a new instance of this type. + * + * @param {Object} context - Contains session, dom, etc. + * @param {Object} options - Contains newBase (suggested URI base) + * @returns {Promise} - The newly created resource + */ + mintNew: async function (context, options) { + const { mintNew } = await import( + /* webpackChunkName: "bookmark-pane" */ + './render.js' + ) + return mintNew(context, options) + }, + + // RDF class this pane can create + mintClass: schema('Bookmark') +} + +// Also export as default for standalone use +export default bookmarkPane diff --git a/examples/bookmark-pane/render.js b/examples/bookmark-pane/render.js new file mode 100644 index 00000000..b30cc0b7 --- /dev/null +++ b/examples/bookmark-pane/render.js @@ -0,0 +1,322 @@ +/** + * Bookmark Pane - Full Implementation + * + * This file is lazy-loaded only when the user views a bookmark. + * It contains all the heavy logic: UI rendering, RDF queries, updates. + */ + +import * as UI from 'solid-ui-jss' +import { store, authn } from 'solid-logic-jss' + +const ns = UI.ns +const $rdf = UI.rdf +const schema = $rdf.Namespace('http://schema.org/') +const dom = document + +/** + * Render a single bookmark + */ +function renderBookmark(subject, context, container) { + const kb = context.session.store + const div = dom.createElement('div') + div.className = 'bookmark-item' + + // Get bookmark properties + const name = kb.anyValue(subject, schema('name')) || 'Untitled' + const url = kb.any(subject, schema('url')) + const description = kb.anyValue(subject, schema('description')) + const dateCreated = kb.anyValue(subject, schema('dateCreated')) + + // Title + const title = dom.createElement('h3') + title.className = 'bookmark-title' + if (url) { + const link = dom.createElement('a') + link.href = url.uri || url.value + link.target = '_blank' + link.rel = 'noopener noreferrer' + link.textContent = name + title.appendChild(link) + } else { + title.textContent = name + } + div.appendChild(title) + + // URL display + if (url) { + const urlDiv = dom.createElement('div') + urlDiv.className = 'bookmark-url' + urlDiv.textContent = url.uri || url.value + div.appendChild(urlDiv) + } + + // Description + if (description) { + const desc = dom.createElement('p') + desc.className = 'bookmark-description' + desc.textContent = description + div.appendChild(desc) + } + + // Date + if (dateCreated) { + const date = dom.createElement('div') + date.className = 'bookmark-date' + date.textContent = 'Added: ' + new Date(dateCreated).toLocaleDateString() + div.appendChild(date) + } + + // Delete button (if user has write access) + const deleteBtn = dom.createElement('button') + deleteBtn.className = 'bookmark-delete' + deleteBtn.textContent = '×' + deleteBtn.title = 'Delete bookmark' + deleteBtn.onclick = async () => { + if (confirm('Delete this bookmark?')) { + try { + // Remove all triples about this bookmark + const triples = kb.statementsMatching(subject, null, null, subject.doc()) + await store.updater.update(triples, []) + div.remove() + } catch (e) { + alert('Failed to delete: ' + e.message) + } + } + } + div.appendChild(deleteBtn) + + return div +} + +/** + * Render the add bookmark form + */ +function renderAddForm(containerUri, context, onAdd) { + const form = dom.createElement('form') + form.className = 'bookmark-add-form' + + form.innerHTML = ` +

Add Bookmark

+ + + + + ` + + form.onsubmit = async (e) => { + e.preventDefault() + const formData = new FormData(form) + const name = formData.get('name') + const url = formData.get('url') + const description = formData.get('description') + + try { + // Generate unique ID + const id = 'bookmark-' + Date.now() + const bookmarkUri = containerUri + '#' + id + const subject = $rdf.sym(bookmarkUri) + const doc = $rdf.sym(containerUri) + + // Create triples + const ins = [ + $rdf.st(subject, ns.rdf('type'), schema('Bookmark'), doc), + $rdf.st(subject, schema('name'), name, doc), + $rdf.st(subject, schema('url'), $rdf.sym(url), doc), + $rdf.st(subject, schema('dateCreated'), new Date().toISOString(), doc) + ] + + if (description) { + ins.push($rdf.st(subject, schema('description'), description, doc)) + } + + await store.updater.update([], ins) + + // Clear form and refresh + form.reset() + if (onAdd) onAdd(subject) + + } catch (e) { + alert('Failed to add bookmark: ' + e.message) + } + } + + return form +} + +/** + * Main render function + */ +export function render(subject, context, options) { + const kb = context.session.store + const div = dom.createElement('div') + div.className = 'bookmark-pane' + + // Add styles + const style = dom.createElement('style') + style.textContent = ` + .bookmark-pane { + padding: 1em; + font-family: system-ui, sans-serif; + } + .bookmark-item { + border: 1px solid #ddd; + border-radius: 8px; + padding: 1em; + margin-bottom: 1em; + position: relative; + background: #fafafa; + } + .bookmark-title { + margin: 0 0 0.5em 0; + font-size: 1.2em; + } + .bookmark-title a { + color: #0066cc; + text-decoration: none; + } + .bookmark-title a:hover { + text-decoration: underline; + } + .bookmark-url { + color: #666; + font-size: 0.9em; + margin-bottom: 0.5em; + } + .bookmark-description { + margin: 0.5em 0; + color: #333; + } + .bookmark-date { + font-size: 0.8em; + color: #999; + } + .bookmark-delete { + position: absolute; + top: 0.5em; + right: 0.5em; + background: #ff4444; + color: white; + border: none; + border-radius: 50%; + width: 24px; + height: 24px; + cursor: pointer; + font-size: 16px; + line-height: 1; + } + .bookmark-delete:hover { + background: #cc0000; + } + .bookmark-add-form { + border: 2px dashed #ccc; + border-radius: 8px; + padding: 1em; + margin-top: 1em; + } + .bookmark-add-form h4 { + margin: 0 0 1em 0; + } + .bookmark-add-form input, + .bookmark-add-form textarea { + display: block; + width: 100%; + padding: 0.5em; + margin-bottom: 0.5em; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; + } + .bookmark-add-form button { + background: #0066cc; + color: white; + border: none; + padding: 0.5em 1em; + border-radius: 4px; + cursor: pointer; + } + .bookmark-add-form button:hover { + background: #0055aa; + } + .bookmark-empty { + color: #666; + font-style: italic; + padding: 2em; + text-align: center; + } + ` + div.appendChild(style) + + // Header + const header = dom.createElement('h2') + header.textContent = '🔖 Bookmarks' + div.appendChild(header) + + // Check what we're rendering + const types = kb.findTypeURIs(subject) + const isContainer = types[ns.ldp('Container').uri] || types[ns.ldp('BasicContainer').uri] + const isBookmark = types[schema('Bookmark').uri] + + // Bookmark list container + const list = dom.createElement('div') + list.className = 'bookmark-list' + div.appendChild(list) + + if (isBookmark) { + // Single bookmark view + list.appendChild(renderBookmark(subject, context, list)) + } else if (isContainer) { + // Container with bookmarks + const contents = kb.each(subject, ns.ldp('contains')) + const bookmarks = contents.filter(item => { + const itemTypes = kb.findTypeURIs(item) + return itemTypes[schema('Bookmark').uri] + }) + + if (bookmarks.length === 0) { + const empty = dom.createElement('div') + empty.className = 'bookmark-empty' + empty.textContent = 'No bookmarks yet. Add one below!' + list.appendChild(empty) + } else { + bookmarks.forEach(bookmark => { + list.appendChild(renderBookmark(bookmark, context, list)) + }) + } + + // Add form for containers + const addForm = renderAddForm(subject.uri, context, (newBookmark) => { + // Remove empty message if present + const empty = list.querySelector('.bookmark-empty') + if (empty) empty.remove() + // Add new bookmark to list + list.appendChild(renderBookmark(newBookmark, context, list)) + }) + div.appendChild(addForm) + } + + return div +} + +/** + * Create a new bookmark resource + */ +export async function mintNew(context, options) { + const newBase = options.newBase || context.session.store.any(null, ns.space('preferencesFile'))?.uri + if (!newBase) { + throw new Error('No location specified for new bookmark') + } + + const bookmarkUri = newBase + 'bookmarks.ttl' + const subject = $rdf.sym(bookmarkUri + '#bookmark-' + Date.now()) + const doc = $rdf.sym(bookmarkUri) + + // Create minimal bookmark + const ins = [ + $rdf.st(subject, ns.rdf('type'), schema('Bookmark'), doc), + $rdf.st(subject, schema('name'), 'New Bookmark', doc), + $rdf.st(subject, schema('dateCreated'), new Date().toISOString(), doc) + ] + + await store.updater.update([], ins) + return subject +} From d7a5a410e6a09e2063bf90f66314271161ea085d Mon Sep 17 00:00:00 2001 From: Melvin Carvalho Date: Sun, 18 Jan 2026 15:55:36 +0100 Subject: [PATCH 09/13] feat: Add working bookmark pane example - src/lazy/bookmarkPane.js: Lazy wrapper with label() and async render() - src/lazy/bookmarkRender.js: Full implementation with UI and CRUD - Register bookmark pane before dataContentPane for priority - Uses kb.holds() for reliable type checking --- dist/lazy/bookmarkPane.js | 105 +++++++++++ dist/lazy/bookmarkPane.js.map | 1 + dist/lazy/bookmarkRender.js | 300 +++++++++++++++++++++++++++++ dist/lazy/bookmarkRender.js.map | 1 + dist/lazy/index.js | 3 + dist/lazy/index.js.map | 2 +- dist/registerPanes.js | 7 +- dist/registerPanes.js.map | 2 +- dist/versionInfo.js | 4 +- dist/versionInfo.js.map | 2 +- src/lazy/bookmarkPane.js | 115 ++++++++++++ src/lazy/bookmarkRender.js | 322 ++++++++++++++++++++++++++++++++ src/lazy/index.js | 3 + src/registerPanes.js | 7 +- 14 files changed, 867 insertions(+), 7 deletions(-) create mode 100644 dist/lazy/bookmarkPane.js create mode 100644 dist/lazy/bookmarkPane.js.map create mode 100644 dist/lazy/bookmarkRender.js create mode 100644 dist/lazy/bookmarkRender.js.map create mode 100644 src/lazy/bookmarkPane.js create mode 100644 src/lazy/bookmarkRender.js diff --git a/dist/lazy/bookmarkPane.js b/dist/lazy/bookmarkPane.js new file mode 100644 index 00000000..bdb6079a --- /dev/null +++ b/dist/lazy/bookmarkPane.js @@ -0,0 +1,105 @@ +/** + * Bookmark Pane - Lazy Wrapper + * + * This lightweight wrapper is always loaded. It contains only: + * - Icon and name + * - label() function for type checking + * - Async render() that loads the full implementation on demand + * + * The actual rendering code is in render.js and only loads + * when someone views a bookmark. + */ + +// Import only what's needed for label() checks +import * as UI from 'solid-ui-jss'; +import * as $rdf from 'rdflib'; +const ns = UI.ns; + +// Define schema namespace for bookmarks +const schema = $rdf.Namespace('http://schema.org/'); +export const bookmarkPane = { + // Unique identifier for this pane + name: 'bookmark', + // Icon shown in pane selector + icon: UI.icons.iconBase + 'noun_97839.svg', + // bookmark icon + + // Optional: restrict to power users + // audience: [ns.solid('PowerUser')], + + /** + * Label function - determines if this pane is relevant + * + * MUST be synchronous and lightweight! + * Called for every subject the user views. + * + * @param {NamedNode} subject - The RDF resource being viewed + * @param {Object} context - Contains session, dom, etc. + * @returns {string|null} - Tooltip string if relevant, null if not + */ + label: function (subject, context) { + const kb = context.session.store; + const rdfType = ns.rdf('type'); + const bookmarkType = schema('Bookmark'); + + // Check if subject is a Bookmark + if (kb.holds(subject, rdfType, bookmarkType)) { + return 'Bookmark'; + } + + // Check if subject is a container with bookmarks + if (kb.holds(subject, rdfType, ns.ldp('Container')) || kb.holds(subject, rdfType, ns.ldp('BasicContainer'))) { + const contents = kb.each(subject, ns.ldp('contains')); + const hasBookmarks = contents.some(item => kb.holds(item, rdfType, bookmarkType)); + if (hasBookmarks) { + return 'Bookmarks'; + } + } + return null; + }, + /** + * Render function - creates the UI + * + * Can be async! The outline manager handles Promise returns. + * Use dynamic import() to load the full implementation. + * + * @param {NamedNode} subject - The RDF resource to render + * @param {Object} context - Contains session, dom, etc. + * @param {Object} options - Additional render options + * @returns {Promise} - The rendered pane + */ + render: async function (subject, context, options) { + try { + const mod = await import(/* webpackChunkName: "bookmark-pane" */ + './bookmarkRender.js'); + return mod.render(subject, context, options); + } catch (e) { + console.error('Bookmark pane error:', e); + const div = document.createElement('div'); + div.textContent = 'Error loading bookmark pane: ' + e.message; + return div; + } + }, + /** + * MintNew - creates a new bookmark + * + * Called when user wants to create a new instance of this type. + * + * @param {Object} context - Contains session, dom, etc. + * @param {Object} options - Contains newBase (suggested URI base) + * @returns {Promise} - The newly created resource + */ + mintNew: async function (context, options) { + const { + mintNew + } = await import(/* webpackChunkName: "bookmark-pane" */ + './bookmarkRender.js'); + return mintNew(context, options); + }, + // RDF class this pane can create + mintClass: schema('Bookmark') +}; + +// Also export as default for standalone use +export default bookmarkPane; +//# sourceMappingURL=bookmarkPane.js.map \ No newline at end of file diff --git a/dist/lazy/bookmarkPane.js.map b/dist/lazy/bookmarkPane.js.map new file mode 100644 index 00000000..53d4fbb9 --- /dev/null +++ b/dist/lazy/bookmarkPane.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bookmarkPane.js","names":["UI","$rdf","ns","schema","Namespace","bookmarkPane","name","icon","icons","iconBase","label","subject","context","kb","session","store","rdfType","rdf","bookmarkType","holds","ldp","contents","each","hasBookmarks","some","item","render","options","mod","e","console","error","div","document","createElement","textContent","message","mintNew","mintClass"],"sources":["../../src/lazy/bookmarkPane.js"],"sourcesContent":["/**\n * Bookmark Pane - Lazy Wrapper\n *\n * This lightweight wrapper is always loaded. It contains only:\n * - Icon and name\n * - label() function for type checking\n * - Async render() that loads the full implementation on demand\n *\n * The actual rendering code is in render.js and only loads\n * when someone views a bookmark.\n */\n\n// Import only what's needed for label() checks\nimport * as UI from 'solid-ui-jss'\nimport * as $rdf from 'rdflib'\n\nconst ns = UI.ns\n\n// Define schema namespace for bookmarks\nconst schema = $rdf.Namespace('http://schema.org/')\n\nexport const bookmarkPane = {\n // Unique identifier for this pane\n name: 'bookmark',\n\n // Icon shown in pane selector\n icon: UI.icons.iconBase + 'noun_97839.svg', // bookmark icon\n\n // Optional: restrict to power users\n // audience: [ns.solid('PowerUser')],\n\n /**\n * Label function - determines if this pane is relevant\n *\n * MUST be synchronous and lightweight!\n * Called for every subject the user views.\n *\n * @param {NamedNode} subject - The RDF resource being viewed\n * @param {Object} context - Contains session, dom, etc.\n * @returns {string|null} - Tooltip string if relevant, null if not\n */\n label: function (subject, context) {\n const kb = context.session.store\n const rdfType = ns.rdf('type')\n const bookmarkType = schema('Bookmark')\n\n // Check if subject is a Bookmark\n if (kb.holds(subject, rdfType, bookmarkType)) {\n return 'Bookmark'\n }\n\n // Check if subject is a container with bookmarks\n if (kb.holds(subject, rdfType, ns.ldp('Container')) ||\n kb.holds(subject, rdfType, ns.ldp('BasicContainer'))) {\n const contents = kb.each(subject, ns.ldp('contains'))\n const hasBookmarks = contents.some(item =>\n kb.holds(item, rdfType, bookmarkType)\n )\n if (hasBookmarks) {\n return 'Bookmarks'\n }\n }\n\n return null\n },\n\n /**\n * Render function - creates the UI\n *\n * Can be async! The outline manager handles Promise returns.\n * Use dynamic import() to load the full implementation.\n *\n * @param {NamedNode} subject - The RDF resource to render\n * @param {Object} context - Contains session, dom, etc.\n * @param {Object} options - Additional render options\n * @returns {Promise} - The rendered pane\n */\n render: async function (subject, context, options) {\n try {\n const mod = await import(\n /* webpackChunkName: \"bookmark-pane\" */\n './bookmarkRender.js'\n )\n return mod.render(subject, context, options)\n } catch (e) {\n console.error('Bookmark pane error:', e)\n const div = document.createElement('div')\n div.textContent = 'Error loading bookmark pane: ' + e.message\n return div\n }\n },\n\n /**\n * MintNew - creates a new bookmark\n *\n * Called when user wants to create a new instance of this type.\n *\n * @param {Object} context - Contains session, dom, etc.\n * @param {Object} options - Contains newBase (suggested URI base)\n * @returns {Promise} - The newly created resource\n */\n mintNew: async function (context, options) {\n const { mintNew } = await import(\n /* webpackChunkName: \"bookmark-pane\" */\n './bookmarkRender.js'\n )\n return mintNew(context, options)\n },\n\n // RDF class this pane can create\n mintClass: schema('Bookmark')\n}\n\n// Also export as default for standalone use\nexport default bookmarkPane\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,KAAKA,EAAE,MAAM,cAAc;AAClC,OAAO,KAAKC,IAAI,MAAM,QAAQ;AAE9B,MAAMC,EAAE,GAAGF,EAAE,CAACE,EAAE;;AAEhB;AACA,MAAMC,MAAM,GAAGF,IAAI,CAACG,SAAS,CAAC,oBAAoB,CAAC;AAEnD,OAAO,MAAMC,YAAY,GAAG;EAC1B;EACAC,IAAI,EAAE,UAAU;EAEhB;EACAC,IAAI,EAAEP,EAAE,CAACQ,KAAK,CAACC,QAAQ,GAAG,gBAAgB;EAAE;;EAE5C;EACA;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,KAAK,EAAE,SAAAA,CAAUC,OAAO,EAAEC,OAAO,EAAE;IACjC,MAAMC,EAAE,GAAGD,OAAO,CAACE,OAAO,CAACC,KAAK;IAChC,MAAMC,OAAO,GAAGd,EAAE,CAACe,GAAG,CAAC,MAAM,CAAC;IAC9B,MAAMC,YAAY,GAAGf,MAAM,CAAC,UAAU,CAAC;;IAEvC;IACA,IAAIU,EAAE,CAACM,KAAK,CAACR,OAAO,EAAEK,OAAO,EAAEE,YAAY,CAAC,EAAE;MAC5C,OAAO,UAAU;IACnB;;IAEA;IACA,IAAIL,EAAE,CAACM,KAAK,CAACR,OAAO,EAAEK,OAAO,EAAEd,EAAE,CAACkB,GAAG,CAAC,WAAW,CAAC,CAAC,IAC/CP,EAAE,CAACM,KAAK,CAACR,OAAO,EAAEK,OAAO,EAAEd,EAAE,CAACkB,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE;MACxD,MAAMC,QAAQ,GAAGR,EAAE,CAACS,IAAI,CAACX,OAAO,EAAET,EAAE,CAACkB,GAAG,CAAC,UAAU,CAAC,CAAC;MACrD,MAAMG,YAAY,GAAGF,QAAQ,CAACG,IAAI,CAACC,IAAI,IACrCZ,EAAE,CAACM,KAAK,CAACM,IAAI,EAAET,OAAO,EAAEE,YAAY,CACtC,CAAC;MACD,IAAIK,YAAY,EAAE;QAChB,OAAO,WAAW;MACpB;IACF;IAEA,OAAO,IAAI;EACb,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEG,MAAM,EAAE,eAAAA,CAAgBf,OAAO,EAAEC,OAAO,EAAEe,OAAO,EAAE;IACjD,IAAI;MACF,MAAMC,GAAG,GAAG,MAAM,MAAM,CACtB;MACA,qBACF,CAAC;MACD,OAAOA,GAAG,CAACF,MAAM,CAACf,OAAO,EAAEC,OAAO,EAAEe,OAAO,CAAC;IAC9C,CAAC,CAAC,OAAOE,CAAC,EAAE;MACVC,OAAO,CAACC,KAAK,CAAC,sBAAsB,EAAEF,CAAC,CAAC;MACxC,MAAMG,GAAG,GAAGC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;MACzCF,GAAG,CAACG,WAAW,GAAG,+BAA+B,GAAGN,CAAC,CAACO,OAAO;MAC7D,OAAOJ,GAAG;IACZ;EACF,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEK,OAAO,EAAE,eAAAA,CAAgBzB,OAAO,EAAEe,OAAO,EAAE;IACzC,MAAM;MAAEU;IAAQ,CAAC,GAAG,MAAM,MAAM,CAC9B;IACA,qBACF,CAAC;IACD,OAAOA,OAAO,CAACzB,OAAO,EAAEe,OAAO,CAAC;EAClC,CAAC;EAED;EACAW,SAAS,EAAEnC,MAAM,CAAC,UAAU;AAC9B,CAAC;;AAED;AACA,eAAeE,YAAY","ignoreList":[]} \ No newline at end of file diff --git a/dist/lazy/bookmarkRender.js b/dist/lazy/bookmarkRender.js new file mode 100644 index 00000000..80637afe --- /dev/null +++ b/dist/lazy/bookmarkRender.js @@ -0,0 +1,300 @@ +/** + * Bookmark Pane - Full Implementation + * + * This file is lazy-loaded only when the user views a bookmark. + * It contains all the heavy logic: UI rendering, RDF queries, updates. + */ + +import * as UI from 'solid-ui-jss'; +import * as $rdf from 'rdflib'; +import { store } from 'solid-logic-jss'; +const ns = UI.ns; +const schema = $rdf.Namespace('http://schema.org/'); +const dom = document; + +/** + * Render a single bookmark + */ +function renderBookmark(subject, context, container) { + const kb = context.session.store; + const div = dom.createElement('div'); + div.className = 'bookmark-item'; + + // Get bookmark properties + const name = kb.anyValue(subject, schema('name')) || 'Untitled'; + const url = kb.any(subject, schema('url')); + const description = kb.anyValue(subject, schema('description')); + const dateCreated = kb.anyValue(subject, schema('dateCreated')); + + // Title + const title = dom.createElement('h3'); + title.className = 'bookmark-title'; + if (url) { + const link = dom.createElement('a'); + link.href = url.uri || url.value; + link.target = '_blank'; + link.rel = 'noopener noreferrer'; + link.textContent = name; + title.appendChild(link); + } else { + title.textContent = name; + } + div.appendChild(title); + + // URL display + if (url) { + const urlDiv = dom.createElement('div'); + urlDiv.className = 'bookmark-url'; + urlDiv.textContent = url.uri || url.value; + div.appendChild(urlDiv); + } + + // Description + if (description) { + const desc = dom.createElement('p'); + desc.className = 'bookmark-description'; + desc.textContent = description; + div.appendChild(desc); + } + + // Date + if (dateCreated) { + const date = dom.createElement('div'); + date.className = 'bookmark-date'; + date.textContent = 'Added: ' + new Date(dateCreated).toLocaleDateString(); + div.appendChild(date); + } + + // Delete button (if user has write access) + const deleteBtn = dom.createElement('button'); + deleteBtn.className = 'bookmark-delete'; + deleteBtn.textContent = '×'; + deleteBtn.title = 'Delete bookmark'; + deleteBtn.onclick = async () => { + if (confirm('Delete this bookmark?')) { + try { + // Remove all triples about this bookmark + const triples = kb.statementsMatching(subject, null, null, subject.doc()); + await store.updater.update(triples, []); + div.remove(); + } catch (e) { + alert('Failed to delete: ' + e.message); + } + } + }; + div.appendChild(deleteBtn); + return div; +} + +/** + * Render the add bookmark form + */ +function renderAddForm(containerUri, context, onAdd) { + const form = dom.createElement('form'); + form.className = 'bookmark-add-form'; + form.innerHTML = ` +

Add Bookmark

+ + + + + `; + form.onsubmit = async e => { + e.preventDefault(); + const formData = new FormData(form); + const name = formData.get('name'); + const url = formData.get('url'); + const description = formData.get('description'); + try { + // Generate unique ID + const id = 'bookmark-' + Date.now(); + const bookmarkUri = containerUri + '#' + id; + const subject = $rdf.sym(bookmarkUri); + const doc = $rdf.sym(containerUri); + + // Create triples + const ins = [$rdf.st(subject, ns.rdf('type'), schema('Bookmark'), doc), $rdf.st(subject, schema('name'), name, doc), $rdf.st(subject, schema('url'), $rdf.sym(url), doc), $rdf.st(subject, schema('dateCreated'), new Date().toISOString(), doc)]; + if (description) { + ins.push($rdf.st(subject, schema('description'), description, doc)); + } + await store.updater.update([], ins); + + // Clear form and refresh + form.reset(); + if (onAdd) onAdd(subject); + } catch (e) { + alert('Failed to add bookmark: ' + e.message); + } + }; + return form; +} + +/** + * Main render function + */ +export function render(subject, context, options) { + const kb = context.session.store; + const div = dom.createElement('div'); + div.className = 'bookmark-pane'; + + // Add styles + const style = dom.createElement('style'); + style.textContent = ` + .bookmark-pane { + padding: 1em; + font-family: system-ui, sans-serif; + } + .bookmark-item { + border: 1px solid #ddd; + border-radius: 8px; + padding: 1em; + margin-bottom: 1em; + position: relative; + background: #fafafa; + } + .bookmark-title { + margin: 0 0 0.5em 0; + font-size: 1.2em; + } + .bookmark-title a { + color: #0066cc; + text-decoration: none; + } + .bookmark-title a:hover { + text-decoration: underline; + } + .bookmark-url { + color: #666; + font-size: 0.9em; + margin-bottom: 0.5em; + } + .bookmark-description { + margin: 0.5em 0; + color: #333; + } + .bookmark-date { + font-size: 0.8em; + color: #999; + } + .bookmark-delete { + position: absolute; + top: 0.5em; + right: 0.5em; + background: #ff4444; + color: white; + border: none; + border-radius: 50%; + width: 24px; + height: 24px; + cursor: pointer; + font-size: 16px; + line-height: 1; + } + .bookmark-delete:hover { + background: #cc0000; + } + .bookmark-add-form { + border: 2px dashed #ccc; + border-radius: 8px; + padding: 1em; + margin-top: 1em; + } + .bookmark-add-form h4 { + margin: 0 0 1em 0; + } + .bookmark-add-form input, + .bookmark-add-form textarea { + display: block; + width: 100%; + padding: 0.5em; + margin-bottom: 0.5em; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; + } + .bookmark-add-form button { + background: #0066cc; + color: white; + border: none; + padding: 0.5em 1em; + border-radius: 4px; + cursor: pointer; + } + .bookmark-add-form button:hover { + background: #0055aa; + } + .bookmark-empty { + color: #666; + font-style: italic; + padding: 2em; + text-align: center; + } + `; + div.appendChild(style); + + // Header + const header = dom.createElement('h2'); + header.textContent = '🔖 Bookmarks'; + div.appendChild(header); + + // Check what we're rendering + const types = kb.findTypeURIs(subject); + const isContainer = types[ns.ldp('Container').uri] || types[ns.ldp('BasicContainer').uri]; + const isBookmark = types[schema('Bookmark').uri]; + + // Bookmark list container + const list = dom.createElement('div'); + list.className = 'bookmark-list'; + div.appendChild(list); + if (isBookmark) { + // Single bookmark view + list.appendChild(renderBookmark(subject, context, list)); + } else if (isContainer) { + // Container with bookmarks + const contents = kb.each(subject, ns.ldp('contains')); + const bookmarks = contents.filter(item => { + const itemTypes = kb.findTypeURIs(item); + return itemTypes[schema('Bookmark').uri]; + }); + if (bookmarks.length === 0) { + const empty = dom.createElement('div'); + empty.className = 'bookmark-empty'; + empty.textContent = 'No bookmarks yet. Add one below!'; + list.appendChild(empty); + } else { + bookmarks.forEach(bookmark => { + list.appendChild(renderBookmark(bookmark, context, list)); + }); + } + + // Add form for containers + const addForm = renderAddForm(subject.uri, context, newBookmark => { + // Remove empty message if present + const empty = list.querySelector('.bookmark-empty'); + if (empty) empty.remove(); + // Add new bookmark to list + list.appendChild(renderBookmark(newBookmark, context, list)); + }); + div.appendChild(addForm); + } + return div; +} + +/** + * Create a new bookmark resource + */ +export async function mintNew(context, options) { + const newBase = options.newBase || context.session.store.any(null, ns.space('preferencesFile'))?.uri; + if (!newBase) { + throw new Error('No location specified for new bookmark'); + } + const bookmarkUri = newBase + 'bookmarks.ttl'; + const subject = $rdf.sym(bookmarkUri + '#bookmark-' + Date.now()); + const doc = $rdf.sym(bookmarkUri); + + // Create minimal bookmark + const ins = [$rdf.st(subject, ns.rdf('type'), schema('Bookmark'), doc), $rdf.st(subject, schema('name'), 'New Bookmark', doc), $rdf.st(subject, schema('dateCreated'), new Date().toISOString(), doc)]; + await store.updater.update([], ins); + return subject; +} +//# sourceMappingURL=bookmarkRender.js.map \ No newline at end of file diff --git a/dist/lazy/bookmarkRender.js.map b/dist/lazy/bookmarkRender.js.map new file mode 100644 index 00000000..a606f795 --- /dev/null +++ b/dist/lazy/bookmarkRender.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bookmarkRender.js","names":["UI","$rdf","store","ns","schema","Namespace","dom","document","renderBookmark","subject","context","container","kb","session","div","createElement","className","name","anyValue","url","any","description","dateCreated","title","link","href","uri","value","target","rel","textContent","appendChild","urlDiv","desc","date","Date","toLocaleDateString","deleteBtn","onclick","confirm","triples","statementsMatching","doc","updater","update","remove","e","alert","message","renderAddForm","containerUri","onAdd","form","innerHTML","onsubmit","preventDefault","formData","FormData","get","id","now","bookmarkUri","sym","ins","st","rdf","toISOString","push","reset","render","options","style","header","types","findTypeURIs","isContainer","ldp","isBookmark","list","contents","each","bookmarks","filter","item","itemTypes","length","empty","forEach","bookmark","addForm","newBookmark","querySelector","mintNew","newBase","space","Error"],"sources":["../../src/lazy/bookmarkRender.js"],"sourcesContent":["/**\n * Bookmark Pane - Full Implementation\n *\n * This file is lazy-loaded only when the user views a bookmark.\n * It contains all the heavy logic: UI rendering, RDF queries, updates.\n */\n\nimport * as UI from 'solid-ui-jss'\nimport * as $rdf from 'rdflib'\nimport { store } from 'solid-logic-jss'\n\nconst ns = UI.ns\nconst schema = $rdf.Namespace('http://schema.org/')\nconst dom = document\n\n/**\n * Render a single bookmark\n */\nfunction renderBookmark(subject, context, container) {\n const kb = context.session.store\n const div = dom.createElement('div')\n div.className = 'bookmark-item'\n\n // Get bookmark properties\n const name = kb.anyValue(subject, schema('name')) || 'Untitled'\n const url = kb.any(subject, schema('url'))\n const description = kb.anyValue(subject, schema('description'))\n const dateCreated = kb.anyValue(subject, schema('dateCreated'))\n\n // Title\n const title = dom.createElement('h3')\n title.className = 'bookmark-title'\n if (url) {\n const link = dom.createElement('a')\n link.href = url.uri || url.value\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n link.textContent = name\n title.appendChild(link)\n } else {\n title.textContent = name\n }\n div.appendChild(title)\n\n // URL display\n if (url) {\n const urlDiv = dom.createElement('div')\n urlDiv.className = 'bookmark-url'\n urlDiv.textContent = url.uri || url.value\n div.appendChild(urlDiv)\n }\n\n // Description\n if (description) {\n const desc = dom.createElement('p')\n desc.className = 'bookmark-description'\n desc.textContent = description\n div.appendChild(desc)\n }\n\n // Date\n if (dateCreated) {\n const date = dom.createElement('div')\n date.className = 'bookmark-date'\n date.textContent = 'Added: ' + new Date(dateCreated).toLocaleDateString()\n div.appendChild(date)\n }\n\n // Delete button (if user has write access)\n const deleteBtn = dom.createElement('button')\n deleteBtn.className = 'bookmark-delete'\n deleteBtn.textContent = '×'\n deleteBtn.title = 'Delete bookmark'\n deleteBtn.onclick = async () => {\n if (confirm('Delete this bookmark?')) {\n try {\n // Remove all triples about this bookmark\n const triples = kb.statementsMatching(subject, null, null, subject.doc())\n await store.updater.update(triples, [])\n div.remove()\n } catch (e) {\n alert('Failed to delete: ' + e.message)\n }\n }\n }\n div.appendChild(deleteBtn)\n\n return div\n}\n\n/**\n * Render the add bookmark form\n */\nfunction renderAddForm(containerUri, context, onAdd) {\n const form = dom.createElement('form')\n form.className = 'bookmark-add-form'\n\n form.innerHTML = `\n

Add Bookmark

\n \n \n \n \n `\n\n form.onsubmit = async (e) => {\n e.preventDefault()\n const formData = new FormData(form)\n const name = formData.get('name')\n const url = formData.get('url')\n const description = formData.get('description')\n\n try {\n // Generate unique ID\n const id = 'bookmark-' + Date.now()\n const bookmarkUri = containerUri + '#' + id\n const subject = $rdf.sym(bookmarkUri)\n const doc = $rdf.sym(containerUri)\n\n // Create triples\n const ins = [\n $rdf.st(subject, ns.rdf('type'), schema('Bookmark'), doc),\n $rdf.st(subject, schema('name'), name, doc),\n $rdf.st(subject, schema('url'), $rdf.sym(url), doc),\n $rdf.st(subject, schema('dateCreated'), new Date().toISOString(), doc)\n ]\n\n if (description) {\n ins.push($rdf.st(subject, schema('description'), description, doc))\n }\n\n await store.updater.update([], ins)\n\n // Clear form and refresh\n form.reset()\n if (onAdd) onAdd(subject)\n\n } catch (e) {\n alert('Failed to add bookmark: ' + e.message)\n }\n }\n\n return form\n}\n\n/**\n * Main render function\n */\nexport function render(subject, context, options) {\n const kb = context.session.store\n const div = dom.createElement('div')\n div.className = 'bookmark-pane'\n\n // Add styles\n const style = dom.createElement('style')\n style.textContent = `\n .bookmark-pane {\n padding: 1em;\n font-family: system-ui, sans-serif;\n }\n .bookmark-item {\n border: 1px solid #ddd;\n border-radius: 8px;\n padding: 1em;\n margin-bottom: 1em;\n position: relative;\n background: #fafafa;\n }\n .bookmark-title {\n margin: 0 0 0.5em 0;\n font-size: 1.2em;\n }\n .bookmark-title a {\n color: #0066cc;\n text-decoration: none;\n }\n .bookmark-title a:hover {\n text-decoration: underline;\n }\n .bookmark-url {\n color: #666;\n font-size: 0.9em;\n margin-bottom: 0.5em;\n }\n .bookmark-description {\n margin: 0.5em 0;\n color: #333;\n }\n .bookmark-date {\n font-size: 0.8em;\n color: #999;\n }\n .bookmark-delete {\n position: absolute;\n top: 0.5em;\n right: 0.5em;\n background: #ff4444;\n color: white;\n border: none;\n border-radius: 50%;\n width: 24px;\n height: 24px;\n cursor: pointer;\n font-size: 16px;\n line-height: 1;\n }\n .bookmark-delete:hover {\n background: #cc0000;\n }\n .bookmark-add-form {\n border: 2px dashed #ccc;\n border-radius: 8px;\n padding: 1em;\n margin-top: 1em;\n }\n .bookmark-add-form h4 {\n margin: 0 0 1em 0;\n }\n .bookmark-add-form input,\n .bookmark-add-form textarea {\n display: block;\n width: 100%;\n padding: 0.5em;\n margin-bottom: 0.5em;\n border: 1px solid #ccc;\n border-radius: 4px;\n box-sizing: border-box;\n }\n .bookmark-add-form button {\n background: #0066cc;\n color: white;\n border: none;\n padding: 0.5em 1em;\n border-radius: 4px;\n cursor: pointer;\n }\n .bookmark-add-form button:hover {\n background: #0055aa;\n }\n .bookmark-empty {\n color: #666;\n font-style: italic;\n padding: 2em;\n text-align: center;\n }\n `\n div.appendChild(style)\n\n // Header\n const header = dom.createElement('h2')\n header.textContent = '🔖 Bookmarks'\n div.appendChild(header)\n\n // Check what we're rendering\n const types = kb.findTypeURIs(subject)\n const isContainer = types[ns.ldp('Container').uri] || types[ns.ldp('BasicContainer').uri]\n const isBookmark = types[schema('Bookmark').uri]\n\n // Bookmark list container\n const list = dom.createElement('div')\n list.className = 'bookmark-list'\n div.appendChild(list)\n\n if (isBookmark) {\n // Single bookmark view\n list.appendChild(renderBookmark(subject, context, list))\n } else if (isContainer) {\n // Container with bookmarks\n const contents = kb.each(subject, ns.ldp('contains'))\n const bookmarks = contents.filter(item => {\n const itemTypes = kb.findTypeURIs(item)\n return itemTypes[schema('Bookmark').uri]\n })\n\n if (bookmarks.length === 0) {\n const empty = dom.createElement('div')\n empty.className = 'bookmark-empty'\n empty.textContent = 'No bookmarks yet. Add one below!'\n list.appendChild(empty)\n } else {\n bookmarks.forEach(bookmark => {\n list.appendChild(renderBookmark(bookmark, context, list))\n })\n }\n\n // Add form for containers\n const addForm = renderAddForm(subject.uri, context, (newBookmark) => {\n // Remove empty message if present\n const empty = list.querySelector('.bookmark-empty')\n if (empty) empty.remove()\n // Add new bookmark to list\n list.appendChild(renderBookmark(newBookmark, context, list))\n })\n div.appendChild(addForm)\n }\n\n return div\n}\n\n/**\n * Create a new bookmark resource\n */\nexport async function mintNew(context, options) {\n const newBase = options.newBase || context.session.store.any(null, ns.space('preferencesFile'))?.uri\n if (!newBase) {\n throw new Error('No location specified for new bookmark')\n }\n\n const bookmarkUri = newBase + 'bookmarks.ttl'\n const subject = $rdf.sym(bookmarkUri + '#bookmark-' + Date.now())\n const doc = $rdf.sym(bookmarkUri)\n\n // Create minimal bookmark\n const ins = [\n $rdf.st(subject, ns.rdf('type'), schema('Bookmark'), doc),\n $rdf.st(subject, schema('name'), 'New Bookmark', doc),\n $rdf.st(subject, schema('dateCreated'), new Date().toISOString(), doc)\n ]\n\n await store.updater.update([], ins)\n return subject\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/lazy/index.js b/dist/lazy/index.js index 7361322e..0df1f04c 100644 --- a/dist/lazy/index.js +++ b/dist/lazy/index.js @@ -49,4 +49,7 @@ export { internalPane } from './internalPane.js'; // Global panes export { homePane } from './homePane.js'; + +// Example panes +export { bookmarkPane } from './bookmarkPane.js'; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/lazy/index.js.map b/dist/lazy/index.js.map index b877dd77..6defdb4a 100644 --- a/dist/lazy/index.js.map +++ b/dist/lazy/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["longChatPane","shortChatPane","profilePane","editProfilePane","contactsPane","issuePane","meetingPane","folderPane","padPane","sourcePane","imagePane","videoPane","audioPane","playlistPane","transactionPane","financialPeriodPane","tripPane","schedulePane","slideshowPane","dokieliPane","socialPane","dashboardPane","basicPreferencesPane","trustedApplicationsPane","activityStreamsPane","formPane","tabbedPane","sharingPane","internalPane","homePane"],"sources":["../../src/lazy/index.js"],"sourcesContent":["/**\n * Lazy-loaded pane wrappers\n *\n * All panes are loaded on-demand when first rendered.\n * Only the lightweight label() functions are loaded upfront.\n */\n\n// Chat pane (already existed)\nexport { longChatPane, shortChatPane } from './chatPane.js'\n\n// Profile & contacts\nexport { profilePane, editProfilePane } from './profilePane.js'\nexport { contactsPane } from './contactsPane.js'\n\n// Issues & meetings\nexport { issuePane } from './issuePane.js'\nexport { meetingPane } from './meetingPane.js'\n\n// Content panes\nexport { folderPane } from './folderPane.js'\nexport { padPane } from './padPane.js'\nexport { sourcePane } from './sourcePane.js'\n\n// Media panes\nexport { imagePane, videoPane, audioPane, playlistPane } from './mediaPane.js'\n\n// Financial panes\nexport { transactionPane, financialPeriodPane, tripPane } from './transactionPane.js'\n\n// Scheduling\nexport { schedulePane } from './schedulePane.js'\n\n// Content views\nexport { slideshowPane } from './slideshowPane.js'\nexport { dokieliPane } from './dokieliPane.js'\nexport { socialPane } from './socialPane.js'\n\n// Dashboard & preferences\nexport { dashboardPane, basicPreferencesPane, trustedApplicationsPane } from './dashboardPane.js'\n\n// Activity & forms\nexport { activityStreamsPane } from './activityPane.js'\nexport { formPane } from './formPane.js'\nexport { tabbedPane } from './tabbedPane.js'\n\n// Sharing & internals\nexport { sharingPane } from './sharingPane.js'\nexport { internalPane } from './internalPane.js'\n\n// Global panes\nexport { homePane } from './homePane.js'\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAASA,YAAY,EAAEC,aAAa,QAAQ,eAAe;;AAE3D;AACA,SAASC,WAAW,EAAEC,eAAe,QAAQ,kBAAkB;AAC/D,SAASC,YAAY,QAAQ,mBAAmB;;AAEhD;AACA,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,SAASC,WAAW,QAAQ,kBAAkB;;AAE9C;AACA,SAASC,UAAU,QAAQ,iBAAiB;AAC5C,SAASC,OAAO,QAAQ,cAAc;AACtC,SAASC,UAAU,QAAQ,iBAAiB;;AAE5C;AACA,SAASC,SAAS,EAAEC,SAAS,EAAEC,SAAS,EAAEC,YAAY,QAAQ,gBAAgB;;AAE9E;AACA,SAASC,eAAe,EAAEC,mBAAmB,EAAEC,QAAQ,QAAQ,sBAAsB;;AAErF;AACA,SAASC,YAAY,QAAQ,mBAAmB;;AAEhD;AACA,SAASC,aAAa,QAAQ,oBAAoB;AAClD,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,UAAU,QAAQ,iBAAiB;;AAE5C;AACA,SAASC,aAAa,EAAEC,oBAAoB,EAAEC,uBAAuB,QAAQ,oBAAoB;;AAEjG;AACA,SAASC,mBAAmB,QAAQ,mBAAmB;AACvD,SAASC,QAAQ,QAAQ,eAAe;AACxC,SAASC,UAAU,QAAQ,iBAAiB;;AAE5C;AACA,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,YAAY,QAAQ,mBAAmB;;AAEhD;AACA,SAASC,QAAQ,QAAQ,eAAe","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["longChatPane","shortChatPane","profilePane","editProfilePane","contactsPane","issuePane","meetingPane","folderPane","padPane","sourcePane","imagePane","videoPane","audioPane","playlistPane","transactionPane","financialPeriodPane","tripPane","schedulePane","slideshowPane","dokieliPane","socialPane","dashboardPane","basicPreferencesPane","trustedApplicationsPane","activityStreamsPane","formPane","tabbedPane","sharingPane","internalPane","homePane","bookmarkPane"],"sources":["../../src/lazy/index.js"],"sourcesContent":["/**\n * Lazy-loaded pane wrappers\n *\n * All panes are loaded on-demand when first rendered.\n * Only the lightweight label() functions are loaded upfront.\n */\n\n// Chat pane (already existed)\nexport { longChatPane, shortChatPane } from './chatPane.js'\n\n// Profile & contacts\nexport { profilePane, editProfilePane } from './profilePane.js'\nexport { contactsPane } from './contactsPane.js'\n\n// Issues & meetings\nexport { issuePane } from './issuePane.js'\nexport { meetingPane } from './meetingPane.js'\n\n// Content panes\nexport { folderPane } from './folderPane.js'\nexport { padPane } from './padPane.js'\nexport { sourcePane } from './sourcePane.js'\n\n// Media panes\nexport { imagePane, videoPane, audioPane, playlistPane } from './mediaPane.js'\n\n// Financial panes\nexport { transactionPane, financialPeriodPane, tripPane } from './transactionPane.js'\n\n// Scheduling\nexport { schedulePane } from './schedulePane.js'\n\n// Content views\nexport { slideshowPane } from './slideshowPane.js'\nexport { dokieliPane } from './dokieliPane.js'\nexport { socialPane } from './socialPane.js'\n\n// Dashboard & preferences\nexport { dashboardPane, basicPreferencesPane, trustedApplicationsPane } from './dashboardPane.js'\n\n// Activity & forms\nexport { activityStreamsPane } from './activityPane.js'\nexport { formPane } from './formPane.js'\nexport { tabbedPane } from './tabbedPane.js'\n\n// Sharing & internals\nexport { sharingPane } from './sharingPane.js'\nexport { internalPane } from './internalPane.js'\n\n// Global panes\nexport { homePane } from './homePane.js'\n\n// Example panes\nexport { bookmarkPane } from './bookmarkPane.js'\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAASA,YAAY,EAAEC,aAAa,QAAQ,eAAe;;AAE3D;AACA,SAASC,WAAW,EAAEC,eAAe,QAAQ,kBAAkB;AAC/D,SAASC,YAAY,QAAQ,mBAAmB;;AAEhD;AACA,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,SAASC,WAAW,QAAQ,kBAAkB;;AAE9C;AACA,SAASC,UAAU,QAAQ,iBAAiB;AAC5C,SAASC,OAAO,QAAQ,cAAc;AACtC,SAASC,UAAU,QAAQ,iBAAiB;;AAE5C;AACA,SAASC,SAAS,EAAEC,SAAS,EAAEC,SAAS,EAAEC,YAAY,QAAQ,gBAAgB;;AAE9E;AACA,SAASC,eAAe,EAAEC,mBAAmB,EAAEC,QAAQ,QAAQ,sBAAsB;;AAErF;AACA,SAASC,YAAY,QAAQ,mBAAmB;;AAEhD;AACA,SAASC,aAAa,QAAQ,oBAAoB;AAClD,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,UAAU,QAAQ,iBAAiB;;AAE5C;AACA,SAASC,aAAa,EAAEC,oBAAoB,EAAEC,uBAAuB,QAAQ,oBAAoB;;AAEjG;AACA,SAASC,mBAAmB,QAAQ,mBAAmB;AACvD,SAASC,QAAQ,QAAQ,eAAe;AACxC,SAASC,UAAU,QAAQ,iBAAiB;;AAE5C;AACA,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,YAAY,QAAQ,mBAAmB;;AAEhD;AACA,SAASC,QAAQ,QAAQ,eAAe;;AAExC;AACA,SAASC,YAAY,QAAQ,mBAAmB","ignoreList":[]} \ No newline at end of file diff --git a/dist/registerPanes.js b/dist/registerPanes.js index e8188483..bb9b85b7 100644 --- a/dist/registerPanes.js +++ b/dist/registerPanes.js @@ -30,7 +30,9 @@ activityStreamsPane, formPane, tabbedPane, // Sharing & internals sharingPane, internalPane, // Global panes -homePane } from './lazy/index.js'; +homePane, +// Example panes +bookmarkPane } from './lazy/index.js'; // Core panes that are always loaded (small, essential) import { classInstancePane } from './classInstancePane.js'; @@ -99,6 +101,9 @@ export function registerPanes(register) { register(classInstancePane); // Core - not lazy register(slideshowPane); + // Example panes - must be before dataContentPane + register(bookmarkPane); + // Social register(socialPane); diff --git a/dist/registerPanes.js.map b/dist/registerPanes.js.map index ee231bc5..2a3343e6 100644 --- a/dist/registerPanes.js.map +++ b/dist/registerPanes.js.map @@ -1 +1 @@ -{"version":3,"file":"registerPanes.js","names":["longChatPane","shortChatPane","profilePane","editProfilePane","contactsPane","issuePane","meetingPane","folderPane","padPane","sourcePane","imagePane","videoPane","audioPane","playlistPane","transactionPane","financialPeriodPane","tripPane","schedulePane","slideshowPane","dokieliPane","socialPane","dashboardPane","basicPreferencesPane","trustedApplicationsPane","activityStreamsPane","formPane","tabbedPane","sharingPane","internalPane","homePane","classInstancePane","dataContentPane","n3Pane","RDFXMLPane","tableViewPane","defaultPane","humanReadablePane","uiPane","registerPanes","register"],"sources":["../src/registerPanes.js"],"sourcesContent":["/**\n * Register all panes with the pane registry\n *\n * Panes are lazy-loaded - only the lightweight label() functions run upfront.\n * The actual pane code is loaded on-demand when render() is called.\n */\n\n// Lazy-loaded pane wrappers\nimport {\n // Chat\n longChatPane,\n shortChatPane,\n // Profile & contacts\n profilePane,\n editProfilePane,\n contactsPane,\n // Issues & meetings\n issuePane,\n meetingPane,\n // Content panes\n folderPane,\n padPane,\n sourcePane,\n // Media panes\n imagePane,\n videoPane,\n audioPane,\n playlistPane,\n // Financial panes\n transactionPane,\n financialPeriodPane,\n tripPane,\n // Scheduling\n schedulePane,\n // Content views\n slideshowPane,\n dokieliPane,\n socialPane,\n // Dashboard & preferences\n dashboardPane,\n basicPreferencesPane,\n trustedApplicationsPane,\n // Activity & forms\n activityStreamsPane,\n formPane,\n tabbedPane,\n // Sharing & internals\n sharingPane,\n internalPane,\n // Global panes\n homePane\n} from './lazy/index.js'\n\n// Core panes that are always loaded (small, essential)\nimport { classInstancePane } from './classInstancePane.js'\nimport { dataContentPane } from './dataContentPane.js'\nimport { n3Pane } from './n3Pane.js'\nimport { RDFXMLPane } from './RDFXMLPane.js'\nimport { tableViewPane } from './tableViewPane.js'\nimport { defaultPane } from './defaultPane.js'\nimport humanReadablePane from './humanReadablePane.js'\nimport uiPane from './ui/pane.js'\n\nexport function registerPanes (register) {\n /* Note that the earliest panes have priority. So the most specific ones are first.\n **\n */\n\n // === LAZY-LOADED PANES ===\n\n // Profile panes - high priority for person URIs\n register(profilePane)\n register(editProfilePane)\n\n // Preferences - must be before basicPreferences\n register(trustedApplicationsPane)\n register(dashboardPane)\n register(basicPreferencesPane)\n\n // Issue tracking\n register(issuePane)\n\n // Contacts\n register(contactsPane)\n\n // Activity streams\n register(activityStreamsPane)\n\n // Notepad\n register(padPane)\n\n // Financial\n register(transactionPane)\n register(financialPeriodPane)\n\n // Meetings\n register(meetingPane)\n register(tabbedPane)\n\n // Chat - lazy-loaded\n register(longChatPane)\n register(shortChatPane)\n\n // Scheduling\n register(schedulePane)\n\n // Trip expenses\n register(tripPane)\n\n // Media panes\n register(imagePane)\n register(playlistPane)\n register(videoPane)\n register(audioPane)\n\n // Document panes\n register(dokieliPane)\n register(folderPane)\n register(classInstancePane) // Core - not lazy\n register(slideshowPane)\n\n // Social\n register(socialPane)\n\n // Human readable (web pages)\n register(humanReadablePane) // Core - not lazy\n\n // === CORE PANES (always loaded) ===\n\n // Data content pane - essential for RDF browsing\n register(dataContentPane)\n\n // Source viewing - lazy\n register(sourcePane)\n\n // RDF format panes - core\n register(n3Pane)\n register(RDFXMLPane)\n\n // Forms - lazy\n register(formPane)\n\n // Table view - core\n register(tableViewPane)\n\n // Default fallback - core, always needed\n register(defaultPane)\n\n // UI pane - core\n register(uiPane)\n\n // Sharing - lazy\n register(sharingPane)\n\n // Internal/developer - lazy\n register(internalPane)\n\n // Home - global, lazy\n register(homePane)\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"registerPanes.js","names":["longChatPane","shortChatPane","profilePane","editProfilePane","contactsPane","issuePane","meetingPane","folderPane","padPane","sourcePane","imagePane","videoPane","audioPane","playlistPane","transactionPane","financialPeriodPane","tripPane","schedulePane","slideshowPane","dokieliPane","socialPane","dashboardPane","basicPreferencesPane","trustedApplicationsPane","activityStreamsPane","formPane","tabbedPane","sharingPane","internalPane","homePane","bookmarkPane","classInstancePane","dataContentPane","n3Pane","RDFXMLPane","tableViewPane","defaultPane","humanReadablePane","uiPane","registerPanes","register"],"sources":["../src/registerPanes.js"],"sourcesContent":["/**\n * Register all panes with the pane registry\n *\n * Panes are lazy-loaded - only the lightweight label() functions run upfront.\n * The actual pane code is loaded on-demand when render() is called.\n */\n\n// Lazy-loaded pane wrappers\nimport {\n // Chat\n longChatPane,\n shortChatPane,\n // Profile & contacts\n profilePane,\n editProfilePane,\n contactsPane,\n // Issues & meetings\n issuePane,\n meetingPane,\n // Content panes\n folderPane,\n padPane,\n sourcePane,\n // Media panes\n imagePane,\n videoPane,\n audioPane,\n playlistPane,\n // Financial panes\n transactionPane,\n financialPeriodPane,\n tripPane,\n // Scheduling\n schedulePane,\n // Content views\n slideshowPane,\n dokieliPane,\n socialPane,\n // Dashboard & preferences\n dashboardPane,\n basicPreferencesPane,\n trustedApplicationsPane,\n // Activity & forms\n activityStreamsPane,\n formPane,\n tabbedPane,\n // Sharing & internals\n sharingPane,\n internalPane,\n // Global panes\n homePane,\n // Example panes\n bookmarkPane\n} from './lazy/index.js'\n\n// Core panes that are always loaded (small, essential)\nimport { classInstancePane } from './classInstancePane.js'\nimport { dataContentPane } from './dataContentPane.js'\nimport { n3Pane } from './n3Pane.js'\nimport { RDFXMLPane } from './RDFXMLPane.js'\nimport { tableViewPane } from './tableViewPane.js'\nimport { defaultPane } from './defaultPane.js'\nimport humanReadablePane from './humanReadablePane.js'\nimport uiPane from './ui/pane.js'\n\nexport function registerPanes (register) {\n /* Note that the earliest panes have priority. So the most specific ones are first.\n **\n */\n\n // === LAZY-LOADED PANES ===\n\n // Profile panes - high priority for person URIs\n register(profilePane)\n register(editProfilePane)\n\n // Preferences - must be before basicPreferences\n register(trustedApplicationsPane)\n register(dashboardPane)\n register(basicPreferencesPane)\n\n // Issue tracking\n register(issuePane)\n\n // Contacts\n register(contactsPane)\n\n // Activity streams\n register(activityStreamsPane)\n\n // Notepad\n register(padPane)\n\n // Financial\n register(transactionPane)\n register(financialPeriodPane)\n\n // Meetings\n register(meetingPane)\n register(tabbedPane)\n\n // Chat - lazy-loaded\n register(longChatPane)\n register(shortChatPane)\n\n // Scheduling\n register(schedulePane)\n\n // Trip expenses\n register(tripPane)\n\n // Media panes\n register(imagePane)\n register(playlistPane)\n register(videoPane)\n register(audioPane)\n\n // Document panes\n register(dokieliPane)\n register(folderPane)\n register(classInstancePane) // Core - not lazy\n register(slideshowPane)\n\n // Example panes - must be before dataContentPane\n register(bookmarkPane)\n\n // Social\n register(socialPane)\n\n // Human readable (web pages)\n register(humanReadablePane) // Core - not lazy\n\n // === CORE PANES (always loaded) ===\n\n // Data content pane - essential for RDF browsing\n register(dataContentPane)\n\n // Source viewing - lazy\n register(sourcePane)\n\n // RDF format panes - core\n register(n3Pane)\n register(RDFXMLPane)\n\n // Forms - lazy\n register(formPane)\n\n // Table view - core\n register(tableViewPane)\n\n // Default fallback - core, always needed\n register(defaultPane)\n\n // UI pane - core\n register(uiPane)\n\n // Sharing - lazy\n register(sharingPane)\n\n // Internal/developer - lazy\n register(internalPane)\n\n // Home - global, lazy\n register(homePane)\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/versionInfo.js b/dist/versionInfo.js index 53e1634f..831a9ebd 100644 --- a/dist/versionInfo.js +++ b/dist/versionInfo.js @@ -1,6 +1,6 @@ export default { - buildTime: "2026-01-18T12:33:19Z", - commit: "8bb405a025b79dcc1e11f1fbaa016a26760f9e10", + buildTime: "2026-01-18T14:55:06Z", + commit: "615bb0df0bb1eb6ebc6c04494abca26d6302bf30", npmInfo: { "'solid-panes-jss'": "'4.0.3',", "npm": "'11.5.1',", diff --git a/dist/versionInfo.js.map b/dist/versionInfo.js.map index d4ecd5d6..1c8a59a7 100644 --- a/dist/versionInfo.js.map +++ b/dist/versionInfo.js.map @@ -1 +1 @@ -{"version":3,"file":"versionInfo.js","names":["buildTime","commit","npmInfo"],"sources":["../src/versionInfo.ts"],"sourcesContent":["export default {\nbuildTime: \"2026-01-18T12:33:19Z\",\ncommit: \"8bb405a025b79dcc1e11f1fbaa016a26760f9e10\",\n npmInfo: {\n \"'solid-panes-jss'\": \"'4.0.3',\",\n \"npm\": \"'11.5.1',\",\n \"node\": \"'24.5.0',\",\n \"acorn\": \"'8.15.0',\",\n \"ada\": \"'3.2.6',\",\n \"amaro\": \"'1.1.1',\",\n \"ares\": \"'1.34.5',\",\n \"brotli\": \"'1.1.0',\",\n \"cjs_module_lexer\": \"'2.1.0',\",\n \"cldr\": \"'47.0',\",\n \"icu\": \"'77.1',\",\n \"llhttp\": \"'9.3.0',\",\n \"modules\": \"'137',\",\n \"napi\": \"'10',\",\n \"nbytes\": \"'0.1.1',\",\n \"ncrypto\": \"'0.0.1',\",\n \"nghttp2\": \"'1.66.0',\",\n \"openssl\": \"'3.5.1',\",\n \"simdjson\": \"'3.13.0',\",\n \"simdutf\": \"'6.4.0',\",\n \"sqlite\": \"'3.50.3',\",\n \"tz\": \"'2025b',\",\n \"undici\": \"'7.12.0',\",\n \"unicode\": \"'16.0',\",\n \"uv\": \"'1.51.0',\",\n \"uvwasi\": \"'0.0.21',\",\n \"v8\": \"'13.6.233.10-node.21',\",\n \"zlib\": \"'1.3.1-470d3a2',\",\n \"zstd\": \"'1.5.7'\",\n \"}\": \"}\",\n }\n}\n"],"mappings":"AAAA,eAAe;EACfA,SAAS,EAAE,sBAAsB;EACjCC,MAAM,EAAE,0CAA0C;EAChDC,OAAO,EAAE;IACP,mBAAmB,EAAE,UAAU;IAC/B,KAAK,EAAE,WAAW;IAClB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,UAAU;IACpB,kBAAkB,EAAE,UAAU;IAC9B,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,UAAU;IACrB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,WAAW;IACvB,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,WAAW;IACrB,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,wBAAwB;IAC9B,MAAM,EAAE,kBAAkB;IAC1B,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE;EACP;AACF,CAAC","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"versionInfo.js","names":["buildTime","commit","npmInfo"],"sources":["../src/versionInfo.ts"],"sourcesContent":["export default {\nbuildTime: \"2026-01-18T14:55:06Z\",\ncommit: \"615bb0df0bb1eb6ebc6c04494abca26d6302bf30\",\n npmInfo: {\n \"'solid-panes-jss'\": \"'4.0.3',\",\n \"npm\": \"'11.5.1',\",\n \"node\": \"'24.5.0',\",\n \"acorn\": \"'8.15.0',\",\n \"ada\": \"'3.2.6',\",\n \"amaro\": \"'1.1.1',\",\n \"ares\": \"'1.34.5',\",\n \"brotli\": \"'1.1.0',\",\n \"cjs_module_lexer\": \"'2.1.0',\",\n \"cldr\": \"'47.0',\",\n \"icu\": \"'77.1',\",\n \"llhttp\": \"'9.3.0',\",\n \"modules\": \"'137',\",\n \"napi\": \"'10',\",\n \"nbytes\": \"'0.1.1',\",\n \"ncrypto\": \"'0.0.1',\",\n \"nghttp2\": \"'1.66.0',\",\n \"openssl\": \"'3.5.1',\",\n \"simdjson\": \"'3.13.0',\",\n \"simdutf\": \"'6.4.0',\",\n \"sqlite\": \"'3.50.3',\",\n \"tz\": \"'2025b',\",\n \"undici\": \"'7.12.0',\",\n \"unicode\": \"'16.0',\",\n \"uv\": \"'1.51.0',\",\n \"uvwasi\": \"'0.0.21',\",\n \"v8\": \"'13.6.233.10-node.21',\",\n \"zlib\": \"'1.3.1-470d3a2',\",\n \"zstd\": \"'1.5.7'\",\n \"}\": \"}\",\n }\n}\n"],"mappings":"AAAA,eAAe;EACfA,SAAS,EAAE,sBAAsB;EACjCC,MAAM,EAAE,0CAA0C;EAChDC,OAAO,EAAE;IACP,mBAAmB,EAAE,UAAU;IAC/B,KAAK,EAAE,WAAW;IAClB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,UAAU;IACpB,kBAAkB,EAAE,UAAU;IAC9B,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,UAAU;IACrB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,WAAW;IACvB,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,WAAW;IACrB,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,wBAAwB;IAC9B,MAAM,EAAE,kBAAkB;IAC1B,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE;EACP;AACF,CAAC","ignoreList":[]} \ No newline at end of file diff --git a/src/lazy/bookmarkPane.js b/src/lazy/bookmarkPane.js new file mode 100644 index 00000000..73697b50 --- /dev/null +++ b/src/lazy/bookmarkPane.js @@ -0,0 +1,115 @@ +/** + * Bookmark Pane - Lazy Wrapper + * + * This lightweight wrapper is always loaded. It contains only: + * - Icon and name + * - label() function for type checking + * - Async render() that loads the full implementation on demand + * + * The actual rendering code is in render.js and only loads + * when someone views a bookmark. + */ + +// Import only what's needed for label() checks +import * as UI from 'solid-ui-jss' +import * as $rdf from 'rdflib' + +const ns = UI.ns + +// Define schema namespace for bookmarks +const schema = $rdf.Namespace('http://schema.org/') + +export const bookmarkPane = { + // Unique identifier for this pane + name: 'bookmark', + + // Icon shown in pane selector + icon: UI.icons.iconBase + 'noun_97839.svg', // bookmark icon + + // Optional: restrict to power users + // audience: [ns.solid('PowerUser')], + + /** + * Label function - determines if this pane is relevant + * + * MUST be synchronous and lightweight! + * Called for every subject the user views. + * + * @param {NamedNode} subject - The RDF resource being viewed + * @param {Object} context - Contains session, dom, etc. + * @returns {string|null} - Tooltip string if relevant, null if not + */ + label: function (subject, context) { + const kb = context.session.store + const rdfType = ns.rdf('type') + const bookmarkType = schema('Bookmark') + + // Check if subject is a Bookmark + if (kb.holds(subject, rdfType, bookmarkType)) { + return 'Bookmark' + } + + // Check if subject is a container with bookmarks + if (kb.holds(subject, rdfType, ns.ldp('Container')) || + kb.holds(subject, rdfType, ns.ldp('BasicContainer'))) { + const contents = kb.each(subject, ns.ldp('contains')) + const hasBookmarks = contents.some(item => + kb.holds(item, rdfType, bookmarkType) + ) + if (hasBookmarks) { + return 'Bookmarks' + } + } + + return null + }, + + /** + * Render function - creates the UI + * + * Can be async! The outline manager handles Promise returns. + * Use dynamic import() to load the full implementation. + * + * @param {NamedNode} subject - The RDF resource to render + * @param {Object} context - Contains session, dom, etc. + * @param {Object} options - Additional render options + * @returns {Promise} - The rendered pane + */ + render: async function (subject, context, options) { + try { + const mod = await import( + /* webpackChunkName: "bookmark-pane" */ + './bookmarkRender.js' + ) + return mod.render(subject, context, options) + } catch (e) { + console.error('Bookmark pane error:', e) + const div = document.createElement('div') + div.textContent = 'Error loading bookmark pane: ' + e.message + return div + } + }, + + /** + * MintNew - creates a new bookmark + * + * Called when user wants to create a new instance of this type. + * + * @param {Object} context - Contains session, dom, etc. + * @param {Object} options - Contains newBase (suggested URI base) + * @returns {Promise} - The newly created resource + */ + mintNew: async function (context, options) { + const { mintNew } = await import( + /* webpackChunkName: "bookmark-pane" */ + './bookmarkRender.js' + ) + return mintNew(context, options) + }, + + // RDF class this pane can create + mintClass: schema('Bookmark') +} + +// Also export as default for standalone use +export default bookmarkPane diff --git a/src/lazy/bookmarkRender.js b/src/lazy/bookmarkRender.js new file mode 100644 index 00000000..bcef872e --- /dev/null +++ b/src/lazy/bookmarkRender.js @@ -0,0 +1,322 @@ +/** + * Bookmark Pane - Full Implementation + * + * This file is lazy-loaded only when the user views a bookmark. + * It contains all the heavy logic: UI rendering, RDF queries, updates. + */ + +import * as UI from 'solid-ui-jss' +import * as $rdf from 'rdflib' +import { store } from 'solid-logic-jss' + +const ns = UI.ns +const schema = $rdf.Namespace('http://schema.org/') +const dom = document + +/** + * Render a single bookmark + */ +function renderBookmark(subject, context, container) { + const kb = context.session.store + const div = dom.createElement('div') + div.className = 'bookmark-item' + + // Get bookmark properties + const name = kb.anyValue(subject, schema('name')) || 'Untitled' + const url = kb.any(subject, schema('url')) + const description = kb.anyValue(subject, schema('description')) + const dateCreated = kb.anyValue(subject, schema('dateCreated')) + + // Title + const title = dom.createElement('h3') + title.className = 'bookmark-title' + if (url) { + const link = dom.createElement('a') + link.href = url.uri || url.value + link.target = '_blank' + link.rel = 'noopener noreferrer' + link.textContent = name + title.appendChild(link) + } else { + title.textContent = name + } + div.appendChild(title) + + // URL display + if (url) { + const urlDiv = dom.createElement('div') + urlDiv.className = 'bookmark-url' + urlDiv.textContent = url.uri || url.value + div.appendChild(urlDiv) + } + + // Description + if (description) { + const desc = dom.createElement('p') + desc.className = 'bookmark-description' + desc.textContent = description + div.appendChild(desc) + } + + // Date + if (dateCreated) { + const date = dom.createElement('div') + date.className = 'bookmark-date' + date.textContent = 'Added: ' + new Date(dateCreated).toLocaleDateString() + div.appendChild(date) + } + + // Delete button (if user has write access) + const deleteBtn = dom.createElement('button') + deleteBtn.className = 'bookmark-delete' + deleteBtn.textContent = '×' + deleteBtn.title = 'Delete bookmark' + deleteBtn.onclick = async () => { + if (confirm('Delete this bookmark?')) { + try { + // Remove all triples about this bookmark + const triples = kb.statementsMatching(subject, null, null, subject.doc()) + await store.updater.update(triples, []) + div.remove() + } catch (e) { + alert('Failed to delete: ' + e.message) + } + } + } + div.appendChild(deleteBtn) + + return div +} + +/** + * Render the add bookmark form + */ +function renderAddForm(containerUri, context, onAdd) { + const form = dom.createElement('form') + form.className = 'bookmark-add-form' + + form.innerHTML = ` +

Add Bookmark

+ + + + + ` + + form.onsubmit = async (e) => { + e.preventDefault() + const formData = new FormData(form) + const name = formData.get('name') + const url = formData.get('url') + const description = formData.get('description') + + try { + // Generate unique ID + const id = 'bookmark-' + Date.now() + const bookmarkUri = containerUri + '#' + id + const subject = $rdf.sym(bookmarkUri) + const doc = $rdf.sym(containerUri) + + // Create triples + const ins = [ + $rdf.st(subject, ns.rdf('type'), schema('Bookmark'), doc), + $rdf.st(subject, schema('name'), name, doc), + $rdf.st(subject, schema('url'), $rdf.sym(url), doc), + $rdf.st(subject, schema('dateCreated'), new Date().toISOString(), doc) + ] + + if (description) { + ins.push($rdf.st(subject, schema('description'), description, doc)) + } + + await store.updater.update([], ins) + + // Clear form and refresh + form.reset() + if (onAdd) onAdd(subject) + + } catch (e) { + alert('Failed to add bookmark: ' + e.message) + } + } + + return form +} + +/** + * Main render function + */ +export function render(subject, context, options) { + const kb = context.session.store + const div = dom.createElement('div') + div.className = 'bookmark-pane' + + // Add styles + const style = dom.createElement('style') + style.textContent = ` + .bookmark-pane { + padding: 1em; + font-family: system-ui, sans-serif; + } + .bookmark-item { + border: 1px solid #ddd; + border-radius: 8px; + padding: 1em; + margin-bottom: 1em; + position: relative; + background: #fafafa; + } + .bookmark-title { + margin: 0 0 0.5em 0; + font-size: 1.2em; + } + .bookmark-title a { + color: #0066cc; + text-decoration: none; + } + .bookmark-title a:hover { + text-decoration: underline; + } + .bookmark-url { + color: #666; + font-size: 0.9em; + margin-bottom: 0.5em; + } + .bookmark-description { + margin: 0.5em 0; + color: #333; + } + .bookmark-date { + font-size: 0.8em; + color: #999; + } + .bookmark-delete { + position: absolute; + top: 0.5em; + right: 0.5em; + background: #ff4444; + color: white; + border: none; + border-radius: 50%; + width: 24px; + height: 24px; + cursor: pointer; + font-size: 16px; + line-height: 1; + } + .bookmark-delete:hover { + background: #cc0000; + } + .bookmark-add-form { + border: 2px dashed #ccc; + border-radius: 8px; + padding: 1em; + margin-top: 1em; + } + .bookmark-add-form h4 { + margin: 0 0 1em 0; + } + .bookmark-add-form input, + .bookmark-add-form textarea { + display: block; + width: 100%; + padding: 0.5em; + margin-bottom: 0.5em; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; + } + .bookmark-add-form button { + background: #0066cc; + color: white; + border: none; + padding: 0.5em 1em; + border-radius: 4px; + cursor: pointer; + } + .bookmark-add-form button:hover { + background: #0055aa; + } + .bookmark-empty { + color: #666; + font-style: italic; + padding: 2em; + text-align: center; + } + ` + div.appendChild(style) + + // Header + const header = dom.createElement('h2') + header.textContent = '🔖 Bookmarks' + div.appendChild(header) + + // Check what we're rendering + const types = kb.findTypeURIs(subject) + const isContainer = types[ns.ldp('Container').uri] || types[ns.ldp('BasicContainer').uri] + const isBookmark = types[schema('Bookmark').uri] + + // Bookmark list container + const list = dom.createElement('div') + list.className = 'bookmark-list' + div.appendChild(list) + + if (isBookmark) { + // Single bookmark view + list.appendChild(renderBookmark(subject, context, list)) + } else if (isContainer) { + // Container with bookmarks + const contents = kb.each(subject, ns.ldp('contains')) + const bookmarks = contents.filter(item => { + const itemTypes = kb.findTypeURIs(item) + return itemTypes[schema('Bookmark').uri] + }) + + if (bookmarks.length === 0) { + const empty = dom.createElement('div') + empty.className = 'bookmark-empty' + empty.textContent = 'No bookmarks yet. Add one below!' + list.appendChild(empty) + } else { + bookmarks.forEach(bookmark => { + list.appendChild(renderBookmark(bookmark, context, list)) + }) + } + + // Add form for containers + const addForm = renderAddForm(subject.uri, context, (newBookmark) => { + // Remove empty message if present + const empty = list.querySelector('.bookmark-empty') + if (empty) empty.remove() + // Add new bookmark to list + list.appendChild(renderBookmark(newBookmark, context, list)) + }) + div.appendChild(addForm) + } + + return div +} + +/** + * Create a new bookmark resource + */ +export async function mintNew(context, options) { + const newBase = options.newBase || context.session.store.any(null, ns.space('preferencesFile'))?.uri + if (!newBase) { + throw new Error('No location specified for new bookmark') + } + + const bookmarkUri = newBase + 'bookmarks.ttl' + const subject = $rdf.sym(bookmarkUri + '#bookmark-' + Date.now()) + const doc = $rdf.sym(bookmarkUri) + + // Create minimal bookmark + const ins = [ + $rdf.st(subject, ns.rdf('type'), schema('Bookmark'), doc), + $rdf.st(subject, schema('name'), 'New Bookmark', doc), + $rdf.st(subject, schema('dateCreated'), new Date().toISOString(), doc) + ] + + await store.updater.update([], ins) + return subject +} diff --git a/src/lazy/index.js b/src/lazy/index.js index b2a508dd..7406b266 100644 --- a/src/lazy/index.js +++ b/src/lazy/index.js @@ -49,3 +49,6 @@ export { internalPane } from './internalPane.js' // Global panes export { homePane } from './homePane.js' + +// Example panes +export { bookmarkPane } from './bookmarkPane.js' diff --git a/src/registerPanes.js b/src/registerPanes.js index 2329bff8..843034f9 100644 --- a/src/registerPanes.js +++ b/src/registerPanes.js @@ -48,7 +48,9 @@ import { sharingPane, internalPane, // Global panes - homePane + homePane, + // Example panes + bookmarkPane } from './lazy/index.js' // Core panes that are always loaded (small, essential) @@ -119,6 +121,9 @@ export function registerPanes (register) { register(classInstancePane) // Core - not lazy register(slideshowPane) + // Example panes - must be before dataContentPane + register(bookmarkPane) + // Social register(socialPane) From 321fd97b0b99364c03e0f8255af3282cfed99775 Mon Sep 17 00:00:00 2001 From: Melvin Carvalho Date: Sun, 18 Jan 2026 15:57:41 +0100 Subject: [PATCH 10/13] docs: Update example bookmark-pane to match working implementation --- examples/bookmark-pane/lazy.js | 36 +++++++++++++++++++------------- examples/bookmark-pane/render.js | 4 ++-- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/examples/bookmark-pane/lazy.js b/examples/bookmark-pane/lazy.js index 1294ed70..41be5390 100644 --- a/examples/bookmark-pane/lazy.js +++ b/examples/bookmark-pane/lazy.js @@ -12,11 +12,12 @@ // Import only what's needed for label() checks import * as UI from 'solid-ui-jss' +import * as $rdf from 'rdflib' const ns = UI.ns // Define schema namespace for bookmarks -const schema = UI.rdf.Namespace('http://schema.org/') +const schema = $rdf.Namespace('http://schema.org/') export const bookmarkPane = { // Unique identifier for this pane @@ -40,20 +41,21 @@ export const bookmarkPane = { */ label: function (subject, context) { const kb = context.session.store + const rdfType = ns.rdf('type') + const bookmarkType = schema('Bookmark') // Check if subject is a Bookmark - const types = kb.findTypeURIs(subject) - if (types[schema('Bookmark').uri]) { + if (kb.holds(subject, rdfType, bookmarkType)) { return 'Bookmark' } // Check if subject is a container with bookmarks - if (types[ns.ldp('Container').uri] || types[ns.ldp('BasicContainer').uri]) { + if (kb.holds(subject, rdfType, ns.ldp('Container')) || + kb.holds(subject, rdfType, ns.ldp('BasicContainer'))) { const contents = kb.each(subject, ns.ldp('contains')) - const hasBookmarks = contents.some(item => { - const itemTypes = kb.findTypeURIs(item) - return itemTypes[schema('Bookmark').uri] - }) + const hasBookmarks = contents.some(item => + kb.holds(item, rdfType, bookmarkType) + ) if (hasBookmarks) { return 'Bookmarks' } @@ -74,12 +76,18 @@ export const bookmarkPane = { * @returns {Promise} - The rendered pane */ render: async function (subject, context, options) { - // Dynamic import - webpack creates a separate chunk - const { render } = await import( - /* webpackChunkName: "bookmark-pane" */ - './render.js' - ) - return render(subject, context, options) + try { + const mod = await import( + /* webpackChunkName: "bookmark-pane" */ + './render.js' + ) + return mod.render(subject, context, options) + } catch (e) { + console.error('Bookmark pane error:', e) + const div = document.createElement('div') + div.textContent = 'Error loading bookmark pane: ' + e.message + return div + } }, /** diff --git a/examples/bookmark-pane/render.js b/examples/bookmark-pane/render.js index b30cc0b7..bcef872e 100644 --- a/examples/bookmark-pane/render.js +++ b/examples/bookmark-pane/render.js @@ -6,10 +6,10 @@ */ import * as UI from 'solid-ui-jss' -import { store, authn } from 'solid-logic-jss' +import * as $rdf from 'rdflib' +import { store } from 'solid-logic-jss' const ns = UI.ns -const $rdf = UI.rdf const schema = $rdf.Namespace('http://schema.org/') const dom = document From 3c1ef391efecd62f1eaee0a0fa0ade525960ccbd Mon Sep 17 00:00:00 2001 From: Melvin Carvalho Date: Sun, 18 Jan 2026 16:05:26 +0100 Subject: [PATCH 11/13] Fix lint errors in bookmark pane files - Add space before function parentheses (stylistic) - Remove blank line before catch block (padded-blocks) - Add global declarations for confirm/alert --- examples/bookmark-pane/render.js | 10 +++++----- src/lazy/bookmarkRender.js | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/bookmark-pane/render.js b/examples/bookmark-pane/render.js index bcef872e..c70db26e 100644 --- a/examples/bookmark-pane/render.js +++ b/examples/bookmark-pane/render.js @@ -4,6 +4,7 @@ * This file is lazy-loaded only when the user views a bookmark. * It contains all the heavy logic: UI rendering, RDF queries, updates. */ +/* global confirm, alert */ import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' @@ -16,7 +17,7 @@ const dom = document /** * Render a single bookmark */ -function renderBookmark(subject, context, container) { +function renderBookmark (subject, context, container) { const kb = context.session.store const div = dom.createElement('div') div.className = 'bookmark-item' @@ -91,7 +92,7 @@ function renderBookmark(subject, context, container) { /** * Render the add bookmark form */ -function renderAddForm(containerUri, context, onAdd) { +function renderAddForm (containerUri, context, onAdd) { const form = dom.createElement('form') form.className = 'bookmark-add-form' @@ -134,7 +135,6 @@ function renderAddForm(containerUri, context, onAdd) { // Clear form and refresh form.reset() if (onAdd) onAdd(subject) - } catch (e) { alert('Failed to add bookmark: ' + e.message) } @@ -146,7 +146,7 @@ function renderAddForm(containerUri, context, onAdd) { /** * Main render function */ -export function render(subject, context, options) { +export function render (subject, context, options) { const kb = context.session.store const div = dom.createElement('div') div.className = 'bookmark-pane' @@ -300,7 +300,7 @@ export function render(subject, context, options) { /** * Create a new bookmark resource */ -export async function mintNew(context, options) { +export async function mintNew (context, options) { const newBase = options.newBase || context.session.store.any(null, ns.space('preferencesFile'))?.uri if (!newBase) { throw new Error('No location specified for new bookmark') diff --git a/src/lazy/bookmarkRender.js b/src/lazy/bookmarkRender.js index bcef872e..c70db26e 100644 --- a/src/lazy/bookmarkRender.js +++ b/src/lazy/bookmarkRender.js @@ -4,6 +4,7 @@ * This file is lazy-loaded only when the user views a bookmark. * It contains all the heavy logic: UI rendering, RDF queries, updates. */ +/* global confirm, alert */ import * as UI from 'solid-ui-jss' import * as $rdf from 'rdflib' @@ -16,7 +17,7 @@ const dom = document /** * Render a single bookmark */ -function renderBookmark(subject, context, container) { +function renderBookmark (subject, context, container) { const kb = context.session.store const div = dom.createElement('div') div.className = 'bookmark-item' @@ -91,7 +92,7 @@ function renderBookmark(subject, context, container) { /** * Render the add bookmark form */ -function renderAddForm(containerUri, context, onAdd) { +function renderAddForm (containerUri, context, onAdd) { const form = dom.createElement('form') form.className = 'bookmark-add-form' @@ -134,7 +135,6 @@ function renderAddForm(containerUri, context, onAdd) { // Clear form and refresh form.reset() if (onAdd) onAdd(subject) - } catch (e) { alert('Failed to add bookmark: ' + e.message) } @@ -146,7 +146,7 @@ function renderAddForm(containerUri, context, onAdd) { /** * Main render function */ -export function render(subject, context, options) { +export function render (subject, context, options) { const kb = context.session.store const div = dom.createElement('div') div.className = 'bookmark-pane' @@ -300,7 +300,7 @@ export function render(subject, context, options) { /** * Create a new bookmark resource */ -export async function mintNew(context, options) { +export async function mintNew (context, options) { const newBase = options.newBase || context.session.store.any(null, ns.space('preferencesFile'))?.uri if (!newBase) { throw new Error('No location specified for new bookmark') From 67ac0c5036c419188f6758adb09349f11098f81a Mon Sep 17 00:00:00 2001 From: Melvin Carvalho Date: Sun, 18 Jan 2026 16:07:26 +0100 Subject: [PATCH 12/13] Fix Jest config for TypeScript/ESM compatibility Use inline babel config for Jest with node target to ensure CommonJS output (modules: auto) instead of preserved ES modules (modules: false). --- jest.config.mjs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/jest.config.mjs b/jest.config.mjs index 330545b5..e463039f 100644 --- a/jest.config.mjs +++ b/jest.config.mjs @@ -8,7 +8,12 @@ export default { }, testPathIgnorePatterns: ['/node_modules/', '/dist/'], transform: { - '^.+\\.[tj]sx?$': ['babel-jest', { configFile: './babel.config.mjs' }], + '^.+\\.[tj]sx?$': ['babel-jest', { + presets: [ + ['@babel/preset-env', { targets: { node: 'current' } }], + '@babel/preset-typescript' + ] + }], }, transformIgnorePatterns: ['/node_modules/(?!(lit-html|solid-logic-jss)).+\\.js'], setupFilesAfterEnv: ['./test/helpers/setup.ts'], From 33e7f0265604ca406d83bd9910900309f7d8d071 Mon Sep 17 00:00:00 2001 From: Melvin Carvalho Date: Sun, 18 Jan 2026 16:07:38 +0100 Subject: [PATCH 13/13] v4.0.4 - Lazy loading + bookmark pane + Jest fix --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7390b737..748ccbe3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "solid-panes-jss", - "version": "4.0.3", + "version": "4.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "solid-panes-jss", - "version": "4.0.3", + "version": "4.0.4", "license": "MIT", "dependencies": { "@solid/better-simple-slideshow": "^0.1.0", diff --git a/package.json b/package.json index a6ad3401..3904bad4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "solid-panes-jss", - "version": "4.0.3", + "version": "4.0.4", "description": "Solid-compatible Panes (JSS variant with minimal solid-oidc authentication)", "main": "dist/index.js", "types": "dist/index.d.ts",