diff --git a/README.md b/README.md
index ef5f4287..ee4c3afd 100644
--- a/README.md
+++ b/README.md
@@ -78,3 +78,10 @@ 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.

+
+## Genertive AI usage
+The SolidOS team is using GitHub Copilot integrated in Visual Studio Code.
+We have added comments in the code to make it explicit which parts are 100% written by AI.
+Example:
+* Some code was generated by the GPT-5.3-Codex model in GitHub Copilot based on the following prompt:
+* This is the comment I got from copilot, but suggested fix remove the dark class as well The nested table shading logic checks UI.utils.ancestor(newTable, 'TABLE') immediately after creating newTable, but at that moment newTable typically has no parent in the DOM yet. This makes parentTable null and will always apply dataContentPaneNestedLight, preventing the intended alternating light/dark nested backgrounds. Consider assigning the class after appending newTable into its parent table, or pass the parent table (or current nesting depth) into objectTree() so the decision can be made reliably. can you help me fix this without removing the dark altering
diff --git a/dev/loader.ts b/dev/loader.ts
index 207e35db..c3f82f34 100644
--- a/dev/loader.ts
+++ b/dev/loader.ts
@@ -3,9 +3,30 @@ import * as paneRegistry from 'pane-registry'
import * as $rdf from 'rdflib'
import { solidLogicSingleton, store, authSession } from 'solid-logic'
import { getOutliner } from '../src'
-import Pane from 'profile-pane'
+import { formPane as Pane } from '../src/form/pane'
import './dev-mash.css'
+function registerPaneModule (moduleOrPane: any) {
+ const pane = moduleOrPane?.default || moduleOrPane
+ paneRegistry.register(pane)
+}
+
+async function preloadFormOntologies () {
+ const ontologyDocs = [
+ 'https://www.w3.org/ns/ui.ttl'
+ ]
+
+ await Promise.all(
+ ontologyDocs.map(async uri => {
+ try {
+ await store.fetcher.load($rdf.sym(uri))
+ } catch (error) {
+ console.warn('Could not preload ontology:', uri, error)
+ }
+ })
+ )
+}
+
// Add custom properties to the Window interface for TypeScript
declare global {
interface Window {
@@ -23,10 +44,22 @@ async function renderPane (uri: string) {
}
const subject = $rdf.sym(uri)
const doc = subject.doc()
+ const paneSubject = Pane.name === 'dataContents' ? doc : subject
+
+ const target = document.getElementById('render')
+
+ try {
+ await new Promise((resolve, reject) => {
+ store.fetcher.load(doc).then(resolve, reject)
+ })
+ } catch (error) {
+ console.error('Failed to load document for pane rendering', error)
+ if (target) {
+ target.innerHTML = `
Failed to load ${doc.uri}\n${String(error)} `
+ }
+ return
+ }
- await new Promise((resolve, reject) => {
- store.fetcher.load(doc).then(resolve, reject)
- })
const context = {
// see https://github.com/solidos/solid-panes/blob/005f90295d83e499fd626bd84aeb3df10135d5c1/src/index.ts#L30-L34
dom: document,
@@ -39,16 +72,21 @@ async function renderPane (uri: string) {
}
console.log(subject, context)
- const icon = createIconElement(Pane)
- const paneDiv = Pane.render(subject, context)
-
- const target = document.getElementById('render')
- if (target) {
- target.innerHTML = ''
- target.appendChild(icon)
- target.appendChild(paneDiv)
- } else {
- console.error("Element with id 'render' not found.")
+ try {
+ const icon = createIconElement(Pane)
+ const paneDiv = Pane.render(paneSubject, context, {})
+ if (target) {
+ target.innerHTML = ''
+ target.appendChild(icon)
+ target.appendChild(paneDiv)
+ } else {
+ console.error("Element with id 'render' not found.")
+ }
+ } catch (error) {
+ console.error('Pane render failed', error)
+ if (target) {
+ target.innerHTML = `Pane render failed\n${String(error)} `
+ }
}
}
@@ -63,7 +101,9 @@ function createIconElement (Pane: { icon: string }) {
window.onload = async () => {
console.log('document ready')
// registerPanes((cjsOrEsModule: any) => paneRegistry.register(cjsOrEsModule.default || cjsOrEsModule))
- paneRegistry.register(require('contacts-pane'))
+ registerPaneModule(Pane)
+ registerPaneModule(require('contacts-pane'))
+ await preloadFormOntologies()
await authSession.handleIncomingRedirect({
restorePreviousSession: true
})
@@ -82,7 +122,7 @@ window.onload = async () => {
loginBanner.innerHTML = `Logged in as ${session.info.webId} Log out `;
}
}
- renderPane('https://testingsolidos.solidcommunity.net/profile/card#me')
+ renderPane('https://sstratsianis.solidcommunity.net/formtest.ttl#this')
}
window.logout = () => {
authSession.logout()
diff --git a/jest.config.mjs b/jest.config.mjs
index 804b7415..a1881765 100644
--- a/jest.config.mjs
+++ b/jest.config.mjs
@@ -11,6 +11,12 @@ export default {
'^.+\\.[tj]sx?$': ['babel-jest', { configFile: './babel.config.mjs' }],
},
transformIgnorePatterns: ['/node_modules/(?!lit-html).+\\.js'],
+ moduleNameMapper: {
+ '^SolidLogic$': 'solid-logic',
+ '^UI$': 'solid-ui',
+ '^\\$rdf$': 'rdflib',
+ '\\.css$': '/test/__mocks__/styleMock.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 be3bbcfa..3bc9cd5d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,6 +22,7 @@
"pane-registry": "^3.0.1",
"profile-pane": "^3.1.2",
"solid-namespace": "^0.5.4",
+ "solid-ui": "^3.0.4",
"source-pane": "^3.0.1"
},
"devDependencies": {
@@ -39,6 +40,7 @@
"babel-loader": "^10.0.0",
"babel-plugin-inline-import": "^3.0.0",
"buffer": "^6.0.3",
+ "copy-webpack-plugin": "^13.0.1",
"css-loader": "^7.1.4",
"eslint": "^9.39.3",
"globals": "^17.3.0",
@@ -54,8 +56,8 @@
"react": "^19.2.4",
"react-dom": "^19.2.4",
"solid-logic": "^4.0.3",
- "solid-ui": "^3.0.4",
"style-loader": "^4.0.0",
+ "terser-webpack-plugin": "^5.3.16",
"ts-jest": "^29.4.6",
"ts-loader": "^9.5.4",
"typescript": "^5.9.3",
@@ -2533,13 +2535,13 @@
}
},
"node_modules/@isaacs/cliui/node_modules/strip-ansi": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
- "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.2.2"
+ "ansi-regex": "^6.0.1"
},
"engines": {
"node": ">=12"
@@ -2650,17 +2652,17 @@
}
},
"node_modules/@jest/console": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz",
- "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz",
+ "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/types": "30.3.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
"chalk": "^4.1.2",
- "jest-message-util": "30.3.0",
- "jest-util": "30.3.0",
+ "jest-message-util": "30.2.0",
+ "jest-util": "30.2.0",
"slash": "^3.0.0"
},
"engines": {
@@ -2678,38 +2680,39 @@
}
},
"node_modules/@jest/core": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz",
- "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz",
+ "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/console": "30.3.0",
+ "@jest/console": "30.2.0",
"@jest/pattern": "30.0.1",
- "@jest/reporters": "30.3.0",
- "@jest/test-result": "30.3.0",
- "@jest/transform": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/reporters": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
"ansi-escapes": "^4.3.2",
"chalk": "^4.1.2",
"ci-info": "^4.2.0",
"exit-x": "^0.2.2",
"graceful-fs": "^4.2.11",
- "jest-changed-files": "30.3.0",
- "jest-config": "30.3.0",
- "jest-haste-map": "30.3.0",
- "jest-message-util": "30.3.0",
+ "jest-changed-files": "30.2.0",
+ "jest-config": "30.2.0",
+ "jest-haste-map": "30.2.0",
+ "jest-message-util": "30.2.0",
"jest-regex-util": "30.0.1",
- "jest-resolve": "30.3.0",
- "jest-resolve-dependencies": "30.3.0",
- "jest-runner": "30.3.0",
- "jest-runtime": "30.3.0",
- "jest-snapshot": "30.3.0",
- "jest-util": "30.3.0",
- "jest-validate": "30.3.0",
- "jest-watcher": "30.3.0",
- "pretty-format": "30.3.0",
+ "jest-resolve": "30.2.0",
+ "jest-resolve-dependencies": "30.2.0",
+ "jest-runner": "30.2.0",
+ "jest-runtime": "30.2.0",
+ "jest-snapshot": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0",
+ "jest-watcher": "30.2.0",
+ "micromatch": "^4.0.8",
+ "pretty-format": "30.2.0",
"slash": "^3.0.0"
},
"engines": {
@@ -2738,9 +2741,9 @@
}
},
"node_modules/@jest/core/node_modules/pretty-format": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
- "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2770,9 +2773,9 @@
}
},
"node_modules/@jest/diff-sequences": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz",
- "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==",
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz",
+ "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2780,35 +2783,35 @@
}
},
"node_modules/@jest/environment": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz",
- "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz",
+ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/fake-timers": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/fake-timers": "30.2.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
- "jest-mock": "30.3.0"
+ "jest-mock": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
"node_modules/@jest/environment-jsdom-abstract": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.3.0.tgz",
- "integrity": "sha512-0hNFs5N6We3DMCwobzI0ydhkY10sT1tZSC0AAiy+0g2Dt/qEWgrcV5BrMxPczhe41cxW4qm6X+jqZaUdpZIajA==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.2.0.tgz",
+ "integrity": "sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "30.3.0",
- "@jest/fake-timers": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/environment": "30.2.0",
+ "@jest/fake-timers": "30.2.0",
+ "@jest/types": "30.2.0",
"@types/jsdom": "^21.1.7",
"@types/node": "*",
- "jest-mock": "30.3.0",
- "jest-util": "30.3.0"
+ "jest-mock": "30.2.0",
+ "jest-util": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -2824,23 +2827,23 @@
}
},
"node_modules/@jest/expect": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz",
- "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz",
+ "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "expect": "30.3.0",
- "jest-snapshot": "30.3.0"
+ "expect": "30.2.0",
+ "jest-snapshot": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
"node_modules/@jest/expect-utils": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz",
- "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz",
+ "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2851,18 +2854,18 @@
}
},
"node_modules/@jest/fake-timers": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz",
- "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz",
+ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/types": "30.3.0",
- "@sinonjs/fake-timers": "^15.0.0",
+ "@jest/types": "30.2.0",
+ "@sinonjs/fake-timers": "^13.0.0",
"@types/node": "*",
- "jest-message-util": "30.3.0",
- "jest-mock": "30.3.0",
- "jest-util": "30.3.0"
+ "jest-message-util": "30.2.0",
+ "jest-mock": "30.2.0",
+ "jest-util": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -2879,16 +2882,16 @@
}
},
"node_modules/@jest/globals": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz",
- "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz",
+ "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "30.3.0",
- "@jest/expect": "30.3.0",
- "@jest/types": "30.3.0",
- "jest-mock": "30.3.0"
+ "@jest/environment": "30.2.0",
+ "@jest/expect": "30.2.0",
+ "@jest/types": "30.2.0",
+ "jest-mock": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -2909,32 +2912,32 @@
}
},
"node_modules/@jest/reporters": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz",
- "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz",
+ "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "30.3.0",
- "@jest/test-result": "30.3.0",
- "@jest/transform": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/console": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
"@jridgewell/trace-mapping": "^0.3.25",
"@types/node": "*",
"chalk": "^4.1.2",
"collect-v8-coverage": "^1.0.2",
"exit-x": "^0.2.2",
- "glob": "^10.5.0",
+ "glob": "^10.3.10",
"graceful-fs": "^4.2.11",
"istanbul-lib-coverage": "^3.0.0",
"istanbul-lib-instrument": "^6.0.0",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^5.0.0",
"istanbul-reports": "^3.1.3",
- "jest-message-util": "30.3.0",
- "jest-util": "30.3.0",
- "jest-worker": "30.3.0",
+ "jest-message-util": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-worker": "30.2.0",
"slash": "^3.0.0",
"string-length": "^4.0.2",
"v8-to-istanbul": "^9.0.1"
@@ -2955,7 +2958,6 @@
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
- "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -2997,13 +2999,13 @@
}
},
"node_modules/@jest/snapshot-utils": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz",
- "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz",
+ "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/types": "30.3.0",
+ "@jest/types": "30.2.0",
"chalk": "^4.1.2",
"graceful-fs": "^4.2.11",
"natural-compare": "^1.4.0"
@@ -3028,14 +3030,14 @@
}
},
"node_modules/@jest/test-result": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz",
- "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz",
+ "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/console": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/console": "30.2.0",
+ "@jest/types": "30.2.0",
"@types/istanbul-lib-coverage": "^2.0.6",
"collect-v8-coverage": "^1.0.2"
},
@@ -3044,15 +3046,15 @@
}
},
"node_modules/@jest/test-sequencer": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz",
- "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz",
+ "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/test-result": "30.3.0",
+ "@jest/test-result": "30.2.0",
"graceful-fs": "^4.2.11",
- "jest-haste-map": "30.3.0",
+ "jest-haste-map": "30.2.0",
"slash": "^3.0.0"
},
"engines": {
@@ -3070,23 +3072,24 @@
}
},
"node_modules/@jest/transform": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz",
- "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz",
+ "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.27.4",
- "@jest/types": "30.3.0",
+ "@jest/types": "30.2.0",
"@jridgewell/trace-mapping": "^0.3.25",
"babel-plugin-istanbul": "^7.0.1",
"chalk": "^4.1.2",
"convert-source-map": "^2.0.0",
"fast-json-stable-stringify": "^2.1.0",
"graceful-fs": "^4.2.11",
- "jest-haste-map": "30.3.0",
+ "jest-haste-map": "30.2.0",
"jest-regex-util": "30.0.1",
- "jest-util": "30.3.0",
+ "jest-util": "30.2.0",
+ "micromatch": "^4.0.8",
"pirates": "^4.0.7",
"slash": "^3.0.0",
"write-file-atomic": "^5.0.1"
@@ -3106,9 +3109,9 @@
}
},
"node_modules/@jest/types": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz",
- "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz",
+ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3570,9 +3573,9 @@
}
},
"node_modules/@sinonjs/fake-timers": {
- "version": "15.1.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz",
- "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==",
+ "version": "13.0.5",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz",
+ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -4674,6 +4677,9 @@
"arm64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4688,6 +4694,9 @@
"arm64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4702,6 +4711,9 @@
"ppc64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4716,6 +4728,9 @@
"riscv64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4730,6 +4745,9 @@
"riscv64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4744,6 +4762,9 @@
"s390x"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4758,6 +4779,9 @@
"x64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4772,6 +4796,9 @@
"x64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -5567,16 +5594,16 @@
}
},
"node_modules/babel-jest": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz",
- "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz",
+ "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/transform": "30.3.0",
+ "@jest/transform": "30.2.0",
"@types/babel__core": "^7.20.5",
"babel-plugin-istanbul": "^7.0.1",
- "babel-preset-jest": "30.3.0",
+ "babel-preset-jest": "30.2.0",
"chalk": "^4.1.2",
"graceful-fs": "^4.2.11",
"slash": "^3.0.0"
@@ -5655,9 +5682,9 @@
}
},
"node_modules/babel-plugin-jest-hoist": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz",
- "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz",
+ "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5737,13 +5764,13 @@
}
},
"node_modules/babel-preset-jest": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz",
- "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz",
+ "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "babel-plugin-jest-hoist": "30.3.0",
+ "babel-plugin-jest-hoist": "30.2.0",
"babel-preset-current-node-syntax": "^1.2.0"
},
"engines": {
@@ -6444,9 +6471,9 @@
}
},
"node_modules/cjs-module-lexer": {
- "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==",
+ "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==",
"dev": true,
"license": "MIT"
},
@@ -6686,6 +6713,53 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/copy-webpack-plugin": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.1.tgz",
+ "integrity": "sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "glob-parent": "^6.0.1",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.2.0",
+ "serialize-javascript": "^6.0.2",
+ "tinyglobby": "^0.2.12"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
"node_modules/core-js": {
"version": "3.48.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz",
@@ -7073,9 +7147,9 @@
"license": "MIT"
},
"node_modules/dedent": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz",
- "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz",
+ "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -7378,10 +7452,13 @@
}
},
"node_modules/dompurify": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz",
- "integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.2.tgz",
+ "integrity": "sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==",
"license": "(MPL-2.0 OR Apache-2.0)",
+ "engines": {
+ "node": ">=20"
+ },
"optionalDependencies": {
"@types/trusted-types": "^2.0.7"
}
@@ -8257,18 +8334,18 @@
}
},
"node_modules/expect": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz",
- "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz",
+ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/expect-utils": "30.3.0",
+ "@jest/expect-utils": "30.2.0",
"@jest/get-type": "30.1.0",
- "jest-matcher-utils": "30.3.0",
- "jest-message-util": "30.3.0",
- "jest-mock": "30.3.0",
- "jest-util": "30.3.0"
+ "jest-matcher-utils": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-mock": "30.2.0",
+ "jest-util": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -10310,9 +10387,9 @@
}
},
"node_modules/istanbul-lib-report/node_modules/semver": {
- "version": "7.7.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "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": {
@@ -10386,16 +10463,16 @@
}
},
"node_modules/jest": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz",
- "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz",
+ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/core": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/core": "30.2.0",
+ "@jest/types": "30.2.0",
"import-local": "^3.2.0",
- "jest-cli": "30.3.0"
+ "jest-cli": "30.2.0"
},
"bin": {
"jest": "bin/jest.js"
@@ -10413,14 +10490,14 @@
}
},
"node_modules/jest-changed-files": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz",
- "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz",
+ "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"execa": "^5.1.1",
- "jest-util": "30.3.0",
+ "jest-util": "30.2.0",
"p-limit": "^3.1.0"
},
"engines": {
@@ -10428,29 +10505,29 @@
}
},
"node_modules/jest-circus": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz",
- "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz",
+ "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "30.3.0",
- "@jest/expect": "30.3.0",
- "@jest/test-result": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/environment": "30.2.0",
+ "@jest/expect": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
"chalk": "^4.1.2",
"co": "^4.6.0",
"dedent": "^1.6.0",
"is-generator-fn": "^2.1.0",
- "jest-each": "30.3.0",
- "jest-matcher-utils": "30.3.0",
- "jest-message-util": "30.3.0",
- "jest-runtime": "30.3.0",
- "jest-snapshot": "30.3.0",
- "jest-util": "30.3.0",
+ "jest-each": "30.2.0",
+ "jest-matcher-utils": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-runtime": "30.2.0",
+ "jest-snapshot": "30.2.0",
+ "jest-util": "30.2.0",
"p-limit": "^3.1.0",
- "pretty-format": "30.3.0",
+ "pretty-format": "30.2.0",
"pure-rand": "^7.0.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.6"
@@ -10473,9 +10550,9 @@
}
},
"node_modules/jest-circus/node_modules/pretty-format": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
- "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10505,21 +10582,21 @@
}
},
"node_modules/jest-cli": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz",
- "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz",
+ "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/core": "30.3.0",
- "@jest/test-result": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/core": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/types": "30.2.0",
"chalk": "^4.1.2",
"exit-x": "^0.2.2",
"import-local": "^3.2.0",
- "jest-config": "30.3.0",
- "jest-util": "30.3.0",
- "jest-validate": "30.3.0",
+ "jest-config": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0",
"yargs": "^17.7.2"
},
"bin": {
@@ -10538,33 +10615,34 @@
}
},
"node_modules/jest-config": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz",
- "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz",
+ "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.27.4",
"@jest/get-type": "30.1.0",
"@jest/pattern": "30.0.1",
- "@jest/test-sequencer": "30.3.0",
- "@jest/types": "30.3.0",
- "babel-jest": "30.3.0",
+ "@jest/test-sequencer": "30.2.0",
+ "@jest/types": "30.2.0",
+ "babel-jest": "30.2.0",
"chalk": "^4.1.2",
"ci-info": "^4.2.0",
"deepmerge": "^4.3.1",
- "glob": "^10.5.0",
+ "glob": "^10.3.10",
"graceful-fs": "^4.2.11",
- "jest-circus": "30.3.0",
+ "jest-circus": "30.2.0",
"jest-docblock": "30.2.0",
- "jest-environment-node": "30.3.0",
+ "jest-environment-node": "30.2.0",
"jest-regex-util": "30.0.1",
- "jest-resolve": "30.3.0",
- "jest-runner": "30.3.0",
- "jest-util": "30.3.0",
- "jest-validate": "30.3.0",
+ "jest-resolve": "30.2.0",
+ "jest-runner": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0",
+ "micromatch": "^4.0.8",
"parse-json": "^5.2.0",
- "pretty-format": "30.3.0",
+ "pretty-format": "30.2.0",
"slash": "^3.0.0",
"strip-json-comments": "^3.1.1"
},
@@ -10605,7 +10683,6 @@
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
- "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -10624,9 +10701,9 @@
}
},
"node_modules/jest-config/node_modules/pretty-format": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
- "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10656,16 +10733,16 @@
}
},
"node_modules/jest-diff": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz",
- "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz",
+ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/diff-sequences": "30.3.0",
+ "@jest/diff-sequences": "30.0.1",
"@jest/get-type": "30.1.0",
"chalk": "^4.1.2",
- "pretty-format": "30.3.0"
+ "pretty-format": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -10685,9 +10762,9 @@
}
},
"node_modules/jest-diff/node_modules/pretty-format": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
- "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10720,17 +10797,17 @@
}
},
"node_modules/jest-each": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz",
- "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz",
+ "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/get-type": "30.1.0",
- "@jest/types": "30.3.0",
+ "@jest/types": "30.2.0",
"chalk": "^4.1.2",
- "jest-util": "30.3.0",
- "pretty-format": "30.3.0"
+ "jest-util": "30.2.0",
+ "pretty-format": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -10750,9 +10827,9 @@
}
},
"node_modules/jest-each/node_modules/pretty-format": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
- "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10772,14 +10849,16 @@
"license": "MIT"
},
"node_modules/jest-environment-jsdom": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.3.0.tgz",
- "integrity": "sha512-RLEOJy6ip1lpw0yqJ8tB3i88FC7VBz7i00Zvl2qF71IdxjS98gC9/0SPWYIBVXHm5hgCYK0PAlSlnHGGy9RoMg==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.2.0.tgz",
+ "integrity": "sha512-zbBTiqr2Vl78pKp/laGBREYzbZx9ZtqPjOK4++lL4BNDhxRnahg51HtoDrk9/VjIy9IthNEWdKVd7H5bqBhiWQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "30.3.0",
- "@jest/environment-jsdom-abstract": "30.3.0",
+ "@jest/environment": "30.2.0",
+ "@jest/environment-jsdom-abstract": "30.2.0",
+ "@types/jsdom": "^21.1.7",
+ "@types/node": "*",
"jsdom": "^26.1.0"
},
"engines": {
@@ -10795,19 +10874,19 @@
}
},
"node_modules/jest-environment-node": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz",
- "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz",
+ "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "30.3.0",
- "@jest/fake-timers": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/environment": "30.2.0",
+ "@jest/fake-timers": "30.2.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
- "jest-mock": "30.3.0",
- "jest-util": "30.3.0",
- "jest-validate": "30.3.0"
+ "jest-mock": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -10825,21 +10904,21 @@
}
},
"node_modules/jest-haste-map": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz",
- "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz",
+ "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/types": "30.3.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
"anymatch": "^3.1.3",
"fb-watchman": "^2.0.2",
"graceful-fs": "^4.2.11",
"jest-regex-util": "30.0.1",
- "jest-util": "30.3.0",
- "jest-worker": "30.3.0",
- "picomatch": "^4.0.3",
+ "jest-util": "30.2.0",
+ "jest-worker": "30.2.0",
+ "micromatch": "^4.0.8",
"walker": "^1.0.8"
},
"engines": {
@@ -10849,28 +10928,15 @@
"fsevents": "^2.3.3"
}
},
- "node_modules/jest-haste-map/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
"node_modules/jest-leak-detector": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz",
- "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz",
+ "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/get-type": "30.1.0",
- "pretty-format": "30.3.0"
+ "pretty-format": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -10890,9 +10956,9 @@
}
},
"node_modules/jest-leak-detector/node_modules/pretty-format": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
- "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10912,16 +10978,16 @@
"license": "MIT"
},
"node_modules/jest-matcher-utils": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz",
- "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz",
+ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/get-type": "30.1.0",
"chalk": "^4.1.2",
- "jest-diff": "30.3.0",
- "pretty-format": "30.3.0"
+ "jest-diff": "30.2.0",
+ "pretty-format": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -10941,9 +11007,9 @@
}
},
"node_modules/jest-matcher-utils/node_modules/pretty-format": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
- "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10963,19 +11029,19 @@
"license": "MIT"
},
"node_modules/jest-message-util": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz",
- "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz",
+ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
- "@jest/types": "30.3.0",
+ "@jest/types": "30.2.0",
"@types/stack-utils": "^2.0.3",
"chalk": "^4.1.2",
"graceful-fs": "^4.2.11",
- "picomatch": "^4.0.3",
- "pretty-format": "30.3.0",
+ "micromatch": "^4.0.8",
+ "pretty-format": "30.2.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.6"
},
@@ -10996,23 +11062,10 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/jest-message-util/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
"node_modules/jest-message-util/node_modules/pretty-format": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
- "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11042,15 +11095,15 @@
}
},
"node_modules/jest-mock": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz",
- "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz",
+ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/types": "30.3.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
- "jest-util": "30.3.0"
+ "jest-util": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -11085,18 +11138,18 @@
}
},
"node_modules/jest-resolve": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz",
- "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz",
+ "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^4.1.2",
"graceful-fs": "^4.2.11",
- "jest-haste-map": "30.3.0",
+ "jest-haste-map": "30.2.0",
"jest-pnp-resolver": "^1.2.3",
- "jest-util": "30.3.0",
- "jest-validate": "30.3.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0",
"slash": "^3.0.0",
"unrs-resolver": "^1.7.11"
},
@@ -11105,14 +11158,14 @@
}
},
"node_modules/jest-resolve-dependencies": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz",
- "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz",
+ "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==",
"dev": true,
"license": "MIT",
"dependencies": {
"jest-regex-util": "30.0.1",
- "jest-snapshot": "30.3.0"
+ "jest-snapshot": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -11129,32 +11182,32 @@
}
},
"node_modules/jest-runner": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz",
- "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz",
+ "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/console": "30.3.0",
- "@jest/environment": "30.3.0",
- "@jest/test-result": "30.3.0",
- "@jest/transform": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/console": "30.2.0",
+ "@jest/environment": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
"chalk": "^4.1.2",
"emittery": "^0.13.1",
"exit-x": "^0.2.2",
"graceful-fs": "^4.2.11",
"jest-docblock": "30.2.0",
- "jest-environment-node": "30.3.0",
- "jest-haste-map": "30.3.0",
- "jest-leak-detector": "30.3.0",
- "jest-message-util": "30.3.0",
- "jest-resolve": "30.3.0",
- "jest-runtime": "30.3.0",
- "jest-util": "30.3.0",
- "jest-watcher": "30.3.0",
- "jest-worker": "30.3.0",
+ "jest-environment-node": "30.2.0",
+ "jest-haste-map": "30.2.0",
+ "jest-leak-detector": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-resolve": "30.2.0",
+ "jest-runtime": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-watcher": "30.2.0",
+ "jest-worker": "30.2.0",
"p-limit": "^3.1.0",
"source-map-support": "0.5.13"
},
@@ -11163,32 +11216,32 @@
}
},
"node_modules/jest-runtime": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz",
- "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz",
+ "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "30.3.0",
- "@jest/fake-timers": "30.3.0",
- "@jest/globals": "30.3.0",
+ "@jest/environment": "30.2.0",
+ "@jest/fake-timers": "30.2.0",
+ "@jest/globals": "30.2.0",
"@jest/source-map": "30.0.1",
- "@jest/test-result": "30.3.0",
- "@jest/transform": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
"chalk": "^4.1.2",
"cjs-module-lexer": "^2.1.0",
"collect-v8-coverage": "^1.0.2",
- "glob": "^10.5.0",
+ "glob": "^10.3.10",
"graceful-fs": "^4.2.11",
- "jest-haste-map": "30.3.0",
- "jest-message-util": "30.3.0",
- "jest-mock": "30.3.0",
+ "jest-haste-map": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-mock": "30.2.0",
"jest-regex-util": "30.0.1",
- "jest-resolve": "30.3.0",
- "jest-snapshot": "30.3.0",
- "jest-util": "30.3.0",
+ "jest-resolve": "30.2.0",
+ "jest-snapshot": "30.2.0",
+ "jest-util": "30.2.0",
"slash": "^3.0.0",
"strip-bom": "^4.0.0"
},
@@ -11200,7 +11253,6 @@
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
- "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -11229,9 +11281,9 @@
}
},
"node_modules/jest-snapshot": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz",
- "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz",
+ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11240,20 +11292,20 @@
"@babel/plugin-syntax-jsx": "^7.27.1",
"@babel/plugin-syntax-typescript": "^7.27.1",
"@babel/types": "^7.27.3",
- "@jest/expect-utils": "30.3.0",
+ "@jest/expect-utils": "30.2.0",
"@jest/get-type": "30.1.0",
- "@jest/snapshot-utils": "30.3.0",
- "@jest/transform": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/snapshot-utils": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
"babel-preset-current-node-syntax": "^1.2.0",
"chalk": "^4.1.2",
- "expect": "30.3.0",
+ "expect": "30.2.0",
"graceful-fs": "^4.2.11",
- "jest-diff": "30.3.0",
- "jest-matcher-utils": "30.3.0",
- "jest-message-util": "30.3.0",
- "jest-util": "30.3.0",
- "pretty-format": "30.3.0",
+ "jest-diff": "30.2.0",
+ "jest-matcher-utils": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-util": "30.2.0",
+ "pretty-format": "30.2.0",
"semver": "^7.7.2",
"synckit": "^0.11.8"
},
@@ -11275,9 +11327,9 @@
}
},
"node_modules/jest-snapshot/node_modules/pretty-format": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
- "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11297,9 +11349,9 @@
"license": "MIT"
},
"node_modules/jest-snapshot/node_modules/semver": {
- "version": "7.7.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "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": {
@@ -11310,18 +11362,18 @@
}
},
"node_modules/jest-util": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz",
- "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz",
+ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/types": "30.3.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
"chalk": "^4.1.2",
"ci-info": "^4.2.0",
"graceful-fs": "^4.2.11",
- "picomatch": "^4.0.3"
+ "picomatch": "^4.0.2"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -11341,18 +11393,18 @@
}
},
"node_modules/jest-validate": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz",
- "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz",
+ "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/get-type": "30.1.0",
- "@jest/types": "30.3.0",
+ "@jest/types": "30.2.0",
"camelcase": "^6.3.0",
"chalk": "^4.1.2",
"leven": "^3.1.0",
- "pretty-format": "30.3.0"
+ "pretty-format": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -11385,9 +11437,9 @@
}
},
"node_modules/jest-validate/node_modules/pretty-format": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
- "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11407,19 +11459,19 @@
"license": "MIT"
},
"node_modules/jest-watcher": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz",
- "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz",
+ "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/test-result": "30.3.0",
- "@jest/types": "30.3.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/types": "30.2.0",
"@types/node": "*",
"ansi-escapes": "^4.3.2",
"chalk": "^4.1.2",
"emittery": "^0.13.1",
- "jest-util": "30.3.0",
+ "jest-util": "30.2.0",
"string-length": "^4.0.2"
},
"engines": {
@@ -11427,15 +11479,15 @@
}
},
"node_modules/jest-worker": {
- "version": "30.3.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz",
- "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==",
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz",
+ "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
"@ungap/structured-clone": "^1.3.0",
- "jest-util": "30.3.0",
+ "jest-util": "30.2.0",
"merge-stream": "^2.0.0",
"supports-color": "^8.1.1"
},
@@ -12271,11 +12323,11 @@
}
},
"node_modules/minipass": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "ISC",
"engines": {
"node": ">=16 || 14 >=14.17"
}
@@ -12705,9 +12757,9 @@
}
},
"node_modules/nwsapi": {
- "version": "2.2.23",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz",
- "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==",
+ "version": "2.2.22",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz",
+ "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==",
"dev": true,
"license": "MIT"
},
@@ -15595,9 +15647,9 @@
"license": "MIT"
},
"node_modules/synckit": {
- "version": "0.11.12",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
- "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==",
+ "version": "0.11.11",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz",
+ "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -17070,7 +17122,6 @@
"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": {
diff --git a/package.json b/package.json
index e5491f1a..58839dd1 100644
--- a/package.json
+++ b/package.json
@@ -14,11 +14,10 @@
],
"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": "npm run clean && npm run build-version && npm run typecheck && npm run build-dist && npm run build-js && npm run postbuild-js",
"build-version": "bash timestamp.sh > src/versionInfo.ts && ./node_modules/.bin/eslint 'src/versionInfo.ts' --fix",
- "build-dist": "npm run build-js && npm run build-types",
- "build-js": "babel src --out-dir dist --extensions '.ts,.js' --source-maps",
- "build-types": "tsc --emitDeclarationOnly",
+ "build-dist": "webpack --progress",
+ "build-js": "babel src --out-dir dist --extensions '.js,.ts' && tsc --emitDeclarationOnly",
"postbuild-js": "rm -f dist/versionInfo.d.ts dist/versionInfo.d.ts.map",
"lint": "eslint",
"lint-fix": "eslint --fix",
@@ -71,6 +70,7 @@
"pane-registry": "^3.0.1",
"profile-pane": "^3.1.2",
"solid-namespace": "^0.5.4",
+ "solid-ui": "^3.0.4",
"source-pane": "^3.0.1"
},
"overrides": {
@@ -93,6 +93,7 @@
"babel-loader": "^10.0.0",
"babel-plugin-inline-import": "^3.0.0",
"buffer": "^6.0.3",
+ "copy-webpack-plugin": "^13.0.1",
"css-loader": "^7.1.4",
"eslint": "^9.39.3",
"globals": "^17.3.0",
@@ -108,8 +109,8 @@
"react": "^19.2.4",
"react-dom": "^19.2.4",
"solid-logic": "^4.0.3",
- "solid-ui": "^3.0.4",
"style-loader": "^4.0.0",
+ "terser-webpack-plugin": "^5.3.16",
"ts-jest": "^29.4.6",
"ts-loader": "^9.5.4",
"typescript": "^5.9.3",
diff --git a/src/dataContentPane.js b/src/dataContentPane.js
index 749ebc75..269af8a8 100644
--- a/src/dataContentPane.js
+++ b/src/dataContentPane.js
@@ -11,6 +11,7 @@
import * as UI from 'solid-ui'
import * as $rdf from 'rdflib'
+import './styles/dataContentPane.css'
const ns = UI.ns
@@ -42,6 +43,21 @@ export const dataContentPane = {
return store.whether(subject, UI.ns.rdf('type'), UI.ns.link('RDFDocument'))
},
*/
+ /* This code was generated by Generative AI (GPT-5.3-Codex in GitHub Copilot) based on the following prompt:
+ Only the class assignments of dataContentPaneNestedLight and dataContentPaneNestedDark
+ are the only things added by AI.
+
+ This is the comment I got from copilot, but suggested fix remove the dark
+ class as well The nested table shading logic checks
+ UI.utils.ancestor(newTable, 'TABLE') immediately after
+ creating newTable, but at that moment newTable typically has no
+ parent in the DOM yet. This makes parentTable null and will
+ always apply dataContentPaneNestedLight, preventing the
+ intended alternating light/dark nested backgrounds.
+ Consider assigning the class after appending newTable into
+ its parent table, or pass the parent table (or current nesting
+ depth) into objectTree() so the decision can be made reliably.
+ can you help me fix this without removing the dark altering */
statementsAsTables: function statementsAsTables (sts, context, initialRoots) {
const myDocument = context.dom
// const outliner = context.getOutliner(myDocument)
@@ -58,7 +74,7 @@ export const dataContentPane = {
const referencedBnodes = {} // Bnodes which need to be named alas
// The property tree for a single subject or anonymous node
- function propertyTree (subject) {
+ function propertyTree (subject, nestingLevel = 0) {
// print('Proprty tree for '+subject)
const rep = myDocument.createElement('table')
let lastPred = null
@@ -74,6 +90,7 @@ export const dataContentPane = {
for (let i = 0; i < sts.length; i++) {
const st = sts[i]
const tr = myDocument.createElement('tr')
+ tr.classList.add('dataContentPaneTopAlignedRow')
if (st.predicate.uri !== lastPred) {
if (lastPred && same > 1) {
predicateTD.setAttribute('rowspan', '' + same)
@@ -99,7 +116,7 @@ export const dataContentPane = {
}
same++
const objectTD = myDocument.createElement('td')
- objectTD.appendChild(objectTree(st.object))
+ objectTD.appendChild(objectTree(st.object, nestingLevel + 1))
tr.appendChild(objectTD)
rep.appendChild(tr)
}
@@ -108,7 +125,7 @@ export const dataContentPane = {
}
// Convert a set of statements into a nested tree of tables
- function objectTree (obj) {
+ function objectTree (obj, nestingLevel = 0) {
let res, anchor
switch (obj.termType) {
case 'NamedNode':
@@ -125,7 +142,7 @@ export const dataContentPane = {
case 'Literal':
if (!obj.datatype || !obj.datatype.uri) {
res = myDocument.createElement('div')
- res.setAttribute('style', 'white-space: pre-wrap;')
+ res.classList.add('contentPaneLiteral')
res.textContent = obj.value
return res
} else if (
@@ -133,7 +150,7 @@ export const dataContentPane = {
'http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral'
) {
res = myDocument.createElement('div')
- res.setAttribute('class', 'embeddedXHTML')
+ res.classList.add('embeddedXHTML')
res.innerHTML = obj.value // Try that @@@ beware embedded dangerous code
return res
}
@@ -150,16 +167,12 @@ export const dataContentPane = {
return anchor
}
doneBnodes[obj.toNT()] = true // Flag to prevent infinite recursion in propertyTree
- const newTable = propertyTree(obj)
+ const newTable = propertyTree(obj, nestingLevel)
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'
+ if (nestingLevel % 2 === 1) {
+ newTable.classList.add('dataContentPaneNestedLight')
} else {
- newTable.style.backgroundColor = 'white'
+ newTable.classList.add('dataContentPaneNestedDark')
}
return newTable
}
@@ -169,7 +182,7 @@ export const dataContentPane = {
for (let i = 0; i < obj.elements.length; i++) {
const tr = myDocument.createElement('tr')
res.appendChild(tr)
- tr.appendChild(objectTree(obj.elements[i]))
+ tr.appendChild(objectTree(obj.elements[i], nestingLevel + 1))
}
return res
case 'Graph':
@@ -200,7 +213,7 @@ export const dataContentPane = {
}
for (let i = 0; i < roots.length; i++) {
const tr = myDocument.createElement('tr')
- tr.setAttribute('style', `background-color: ${i % 2 === 0 ? '#f0f0f0' : 'white'};`)
+ tr.classList.add(i % 2 === 0 ? 'dataContentPaneRowEven' : 'dataContentPaneRowOdd')
rep.appendChild(tr)
const subjectTD = myDocument.createElement('td')
tr.appendChild(subjectTD)
@@ -210,9 +223,9 @@ export const dataContentPane = {
if (root.termType === 'BlankNode') {
subjectTD.appendChild(myDocument.createTextNode(UI.utils.label(root))) // Don't recurse!
} else {
- subjectTD.appendChild(objectTree(root)) // won't have tree
+ subjectTD.appendChild(objectTree(root, 0)) // won't have tree
}
- TDTree.appendChild(propertyTree(root))
+ TDTree.appendChild(propertyTree(root, 0))
}
for (const bNT in referencedBnodes) {
// Add number to refer to
@@ -248,9 +261,9 @@ export const dataContentPane = {
return div
}
for (let i = 0; i < roots.length; i++) {
- const tr = myDocument.createElement('TR')
+ const tr = myDocument.createElement('tr')
+ tr.classList.add('dataContentPaneTopAlignedRow')
const root = roots[i]
- tr.style.verticalAlign = 'top'
const td = outliner.outlineObjectTD(root, undefined, tr)
tr.appendChild(td)
div.appendChild(tr)
diff --git a/src/form/pane.js b/src/form/pane.js
index 373b1b7c..d6e3f784 100644
--- a/src/form/pane.js
+++ b/src/form/pane.js
@@ -6,6 +6,8 @@
import * as UI from 'solid-ui'
import { authn } from 'solid-logic'
import * as $rdf from 'rdflib'
+import '../styles/formPane.css'
+
const ns = UI.ns
export const formPane = {
@@ -27,15 +29,16 @@ export const formPane = {
const kb = context.session.store
const dom = context.dom
- const mention = function complain (message, style) {
+ const mention = function mention (message, className) {
const pre = dom.createElement('p')
- pre.setAttribute('style', style || 'color: grey; background-color: white')
+ pre.classList.add('formPaneMessage')
+ pre.classList.add(className || 'formPaneMessageInfo')
box.appendChild(pre).textContent = message
return pre
}
- const complain = function complain (message, style) {
- mention(message, 'style', style || 'color: grey; background-color: #fdd;')
+ const complain = function complain (message) {
+ mention(message, 'formPaneMessageError')
}
const complainIfBad = function (ok, body) {
@@ -103,7 +106,7 @@ export const formPane = {
complainIfBad
)
)
- e.setAttribute('style', 'float: right;')
+ e.classList.add('formPaneEditButton')
}
}
const anchor = dom.createElement('a')
diff --git a/src/humanReadablePane.js b/src/humanReadablePane.js
index f054c9bb..d764fc14 100644
--- a/src/humanReadablePane.js
+++ b/src/humanReadablePane.js
@@ -7,6 +7,7 @@ import { icons, ns } from 'solid-ui'
import { Util } from 'rdflib'
import { marked } from 'marked'
import DOMPurify from 'dompurify'
+import './styles/humanReadablePane.css'
// Helper function to check if a URI has a markdown file extension
const isMarkdownFile = (uri) => {
@@ -176,6 +177,11 @@ const humanReadablePane = {
// @@ When we can, use CSP to turn off scripts within the iframe
div.setAttribute('class', 'docView')
+ const setFrameDisplayStyles = function (frame, lines) {
+ frame.classList.add('doc', 'humanReadableFrame')
+ frame.style.setProperty('--human-readable-height', `${lines}em`)
+ }
+
// render markdown to html in a DIV element
const renderMarkdownContent = function (frame) {
kb.fetcher.webOperation('GET', subject.uri).then(response => {
@@ -184,8 +190,7 @@ const humanReadablePane = {
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;`)
+ setFrameDisplayStyles(frame, lines)
}).catch(error => {
console.error('Error fetching markdown content:', error)
frame.innerHTML = 'Error loading content
'
@@ -194,20 +199,19 @@ const humanReadablePane = {
const setIframeAttributes = (frame, lines) => {
frame.setAttribute('src', subject.uri)
- frame.setAttribute('class', 'doc')
- frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`)
+ setFrameDisplayStyles(frame, lines)
}
if (isMarkdown) {
// For markdown, use a DIV element and render the content
- const frame = myDocument.createElement('DIV')
+ const frame = myDocument.createElement('div')
renderMarkdownContent(frame)
- const tr = myDocument.createElement('TR')
+ const tr = myDocument.createElement('tr')
tr.appendChild(frame)
div.appendChild(tr)
} else {
// For other content types, use IFRAME
- const frame = myDocument.createElement('IFRAME')
+ const frame = myDocument.createElement('iframe')
// Apply sandbox for HTML/XHTML
if (ct === 'text/html' || ct === 'application/xhtml+xml') {
@@ -232,7 +236,7 @@ const humanReadablePane = {
setIframeAttributes(frame, 30)
})
- const tr = myDocument.createElement('TR')
+ const tr = myDocument.createElement('tr')
tr.appendChild(frame)
div.appendChild(tr)
}
diff --git a/src/imagePane.js b/src/imagePane.js
index a8b3f819..6a04d8bb 100644
--- a/src/imagePane.js
+++ b/src/imagePane.js
@@ -3,6 +3,7 @@
** This outline pane contains the document contents for an Image document
*/
import * as UI from 'solid-ui'
+import './styles/imagePane.css'
export const imagePane = {
icon: UI.icons.originalIconBase + 'tango/22-image-x-generic.png',
@@ -50,7 +51,7 @@ export const imagePane = {
const store = context.session.store
const div = myDocument.createElement('div')
div.setAttribute('class', 'imageView')
- const img = myDocument.createElement('IMG')
+ const img = myDocument.createElement('img')
// get image with authenticated fetch
store.fetcher._fetch(subject.uri)
@@ -61,11 +62,8 @@ export const imagePane = {
const objectURL = URL.createObjectURL(myBlob)
img.setAttribute('src', objectURL) // w640 h480 //
})
-
- img.setAttribute('style', 'max-width: 100%; max-height: 100%;')
- // div.style['max-width'] = '640'
- // div.style['max-height'] = '480'
- const tr = myDocument.createElement('TR') // why need tr?
+ img.classList.add('imagePaneViewImage')
+ const tr = myDocument.createElement('tr') // why need tr?
tr.appendChild(img)
div.appendChild(tr)
return div
diff --git a/src/internal/internalPane.ts b/src/internal/internalPane.ts
index b041634a..b1224f5d 100644
--- a/src/internal/internalPane.ts
+++ b/src/internal/internalPane.ts
@@ -8,6 +8,7 @@
import { icons, ns, widgets } from 'solid-ui'
import { BlankNode, IndexedFormula, literal, NamedNode, st, sym, Variable, Store } from 'rdflib'
import { PaneDefinition } from 'pane-registry'
+import '../styles/internalPane.css'
const pane: PaneDefinition = {
icon: icons.originalIconBase + 'tango/22-emblem-system.png',
@@ -35,11 +36,7 @@ const pane: PaneDefinition = {
}
const div = dom.createElement('div')
- div.setAttribute('class', 'internalPane')
- div.setAttribute(
- 'style',
- 'background-color: #ddddff; padding: 0.5em; border-radius: 1em;'
- )
+ div.classList.add('internalPane', 'internalPaneContent')
function deleteRecursive (kb: IndexedFormula, folder: NamedNode) {
const fetcher = (kb as any).fetcher
@@ -85,8 +82,7 @@ const pane: PaneDefinition = {
const isDocument = subject.uri && !subject.uri.includes('#')
if (isDocument) {
const controls = div.appendChild(dom.createElement('table'))
- controls.style.width = '100%'
- controls.style.margin = '1em'
+ controls.classList.add('internalPaneControls')
const controlRow = controls.appendChild(dom.createElement('tr'))
const deleteCell = controlRow.appendChild(dom.createElement('td'))
@@ -127,8 +123,9 @@ const pane: PaneDefinition = {
})
}
)
- deleteButton.style = 'height: 2em;'
+
deleteButton.class = '' // Remove hover hide
+ deleteButton.classList.add('internalPaneDeleteButton')
deleteCell.appendChild(deleteButton)
}
diff --git a/src/outline/manager.css b/src/outline/manager.css
new file mode 100644
index 00000000..d34ac2af
--- /dev/null
+++ b/src/outline/manager.css
@@ -0,0 +1,80 @@
+/* Styles extracted from manager.js */
+
+.obj {
+ margin: 0.2em;
+ border: none;
+ padding: 0;
+ vertical-align: top;
+}
+
+.pred, .pred.internal {
+ /* Add any specific styles for predicate TDs here */
+}
+
+.iconTD {
+ margin: 0.2em;
+ border: none;
+ padding: 0;
+ vertical-align: top;
+ width: 0px;
+}
+
+.labelTD {
+ width: 100%;
+}
+
+.paneIconTray {
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+}
+
+.paneShown {
+ width: 24px;
+ border-radius: 0.5em;
+ border-top: solid #222 1px;
+ border-left: solid #222 0.1em;
+ border-bottom: solid #eee 0.1em;
+ border-right: solid #eee 0.1em;
+ margin-left: 1em;
+ padding: 3px;
+ background-color: #ffd;
+}
+
+.paneHidden {
+ width: 24px;
+ border-radius: 0.5em;
+ margin-left: 1em;
+ padding: 3px;
+}
+
+.header {
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+ flex-wrap: wrap;
+}
+
+.strongHeader {
+ font-size: 150%;
+ margin: 0 0.6em 0 0;
+ padding: 0.1em 0.4em;
+}
+
+.tableFullWidth {
+ width: 100%;
+}
+
+.placeholderTable {
+ width: 100%;
+}
+
+.tdFlex {
+ margin: 0.2em;
+ border: none;
+ padding: 0;
+ vertical-align: top;
+ display: flex;
+ justify-content: space-between;
+ flex-direction: row;
+}
diff --git a/src/outline/manager.js b/src/outline/manager.js
index 767a832e..a4829ece 100644
--- a/src/outline/manager.js
+++ b/src/outline/manager.js
@@ -3,6 +3,7 @@
Outline Mode Manager
*/
import * as paneRegistry from 'pane-registry'
+import './manager.css'
import * as $rdf from 'rdflib'
import * as UI from 'solid-ui'
import { authn, authSession, store } from 'solid-logic'
@@ -170,10 +171,7 @@ export default function (context) {
statement
) {
const td = dom.createElement('td')
- td.setAttribute(
- 'style',
- 'margin: 0.2em; border: none; padding: 0; vertical-align: top;'
- )
+ td.classList.add('obj')
td.setAttribute('notSelectable', 'false')
const theClass = 'obj'
@@ -198,7 +196,6 @@ export default function (context) {
).addEventListener('click', expandMouseDownListener)
}
td.setAttribute('class', theClass) // this is how you find an object
- // @@ TAKE CSS OUT OF STYLE SHEET
if (kb.whether(obj, UI.ns.rdf('type'), UI.ns.link('Request'))) {
td.className = 'undetermined'
} // @@? why-timbl
@@ -249,10 +246,7 @@ export default function (context) {
// if (kb.statementsMatching(predicate,rdf('type'), UI.ns.link('Request')).length) predicateTD.className='undetermined';
const labelTD = dom.createElement('TD')
- labelTD.setAttribute(
- 'style',
- 'margin: 0.2em; border: none; padding: 0; vertical-align: top;'
- )
+ labelTD.classList.add('labelTD')
labelTD.setAttribute('notSelectable', 'true')
labelTD.appendChild(dom.createTextNode(lab))
predicateTD.appendChild(labelTD)
@@ -345,7 +339,7 @@ export default function (context) {
const me = authn.currentUser()
if (!me) return []
const div = dom.createElement('div')
- const [books, pods] = await Promise.all([getAddressBooks(), getPods()])
+ const [pods] = await Promise.all([getPods()])
return [
{
paneName: 'home',
@@ -368,7 +362,6 @@ export default function (context) {
icon: UI.icons.iconBase + 'noun_492246.svg'
}
]
- .concat(books)
.concat(pods)
async function getPods () {
@@ -808,7 +801,7 @@ export default function (context) {
const table = d.parentNode
const par = table.parentNode
const placeholder = dom.createElement('table')
- placeholder.setAttribute('style', 'width: 100%;')
+ placeholder.classList.add('placeholderTable')
par.replaceChild(placeholder, table)
table.removeChild(d)
par.replaceChild(table, placeholder) // Attempt to
@@ -827,7 +820,7 @@ export default function (context) {
if (!table) {
// Create a new property table
table = dom.createElement('table')
- table.setAttribute('style', 'width: 100%;')
+ table.classList.add('tableFullWidth')
expandedHeaderTR(subject, pane, options).then(tr1 => {
table.appendChild(tr1)
@@ -2365,7 +2358,7 @@ export default function (context) {
} else if (obj.termType === 'Collection') {
// obj.elements is an array of the elements in the collection
rep = dom.createElement('table')
- rep.setAttribute('style', 'width: 100%;')
+ rep.classList.add('tableFullWidth')
rep.setAttribute('about', obj.toNT())
/* Not sure which looks best -- with or without. I think without
@@ -2377,10 +2370,7 @@ export default function (context) {
const elt = obj.elements[i]
const row = rep.appendChild(dom.createElement('tr'))
const numcell = row.appendChild(dom.createElement('td'))
- numcell.setAttribute(
- 'style',
- 'margin: 0.2em; border: none; padding: 0; vertical-align: top;'
- )
+ numcell.classList.add('obj')
numcell.setAttribute('notSelectable', 'false')
numcell.setAttribute('about', obj.toNT())
numcell.innerHTML = i + 1 + ')'
diff --git a/src/pad/padPane.ts b/src/pad/padPane.ts
index 7003d960..d6b029a5 100644
--- a/src/pad/padPane.ts
+++ b/src/pad/padPane.ts
@@ -2,6 +2,7 @@ import { icons, ns, pad, widgets, login } from 'solid-ui'
import { authn, AppDetails } from 'solid-logic'
import { graph, log, NamedNode, Namespace, sym, serialize, Store } from 'rdflib'
import { PaneDefinition } from 'pane-registry'
+import '../styles/padPane.css'
/* pad Pane
**
*/
@@ -390,7 +391,7 @@ const paneDef: PaneDefinition = {
// give the user links to the new app
const p = div.appendChild(dom.createElement('p'))
- p.setAttribute('style', 'font-size: 140%;')
+ p.classList.add('padPaneSuccess')
p.innerHTML =
'Your {
+ fetcher.nowOrWhenFetched(resultsDoc.uri, undefined, (ok, body, response) => {
if (!ok) {
if (response.status === 404) {
// / Check explicitly for 404 error
@@ -997,11 +1046,11 @@ export const schedulePane = {
matrix.setAttribute('class', 'matrix')
const refreshButton = dom.createElement('button')
- refreshButton.setAttribute('style', inputStyle)
+ refreshButton.classList.add('schedulePaneButton')
// refreshButton.textContent = 'refresh' // noun_479395.svg
const refreshIcon = dom.createElement('img')
refreshIcon.setAttribute('src', UI.icons.iconBase + 'noun_479395.svg')
- refreshIcon.setAttribute('style', buttonIconStyle)
+ refreshIcon.classList.add('schedulePaneButtonIcon')
refreshButton.appendChild(refreshIcon)
refreshButton.addEventListener(
'click',
@@ -1130,11 +1179,11 @@ export const schedulePane = {
const instanceCreator = kb.any(subject, ns.foaf('maker')) // owner?
if (!instanceCreator || instanceCreator.sameTerm(me)) {
const editButton = dom.createElement('button')
- editButton.setAttribute('style', inputStyle)
+ editButton.classList.add('schedulePaneButton')
// editButton.textContent = '(Modify the poll)' // noun_344563.svg
const editIcon = dom.createElement('img')
editIcon.setAttribute('src', UI.icons.iconBase + 'noun_344563.svg')
- editIcon.setAttribute('style', buttonIconStyle)
+ editIcon.classList.add('schedulePaneButtonIcon')
editButton.appendChild(editIcon)
editButton.addEventListener(
'click',
@@ -1156,10 +1205,7 @@ export const schedulePane = {
const div = dom.createElement('div')
const structure = div.appendChild(dom.createElement('table')) // @@ make responsive style
- structure.setAttribute(
- 'style',
- 'background-color: white; min-width: 40em; min-height: 13em;'
- )
+ structure.classList.add('schedulePaneTable')
const naviLoginoutTR = structure.appendChild(dom.createElement('tr'))
naviLoginoutTR.appendChild(dom.createElement('td'))
@@ -1180,12 +1226,7 @@ export const schedulePane = {
naviMain.setAttribute('colspan', '3')
const naviMenu = structure.appendChild(dom.createElement('tr'))
- naviMenu.setAttribute('class', 'naviMenu')
- naviMenu.setAttribute(
- 'style',
- ' text-align: middle; vertical-align: middle; padding-top: 4em; '
- )
- // naviMenu.setAttribute('style', 'margin-top: 3em;')
+ naviMenu.classList.add('naviMenu', 'schedulePaneNaviMenu')
const naviLeft = naviMenu.appendChild(dom.createElement('td'))
const naviCenter = naviMenu.appendChild(dom.createElement('td'))
const naviRight = naviMenu.appendChild(dom.createElement('td'))
diff --git a/src/styles/dataContentPane.css b/src/styles/dataContentPane.css
new file mode 100644
index 00000000..586d8136
--- /dev/null
+++ b/src/styles/dataContentPane.css
@@ -0,0 +1,23 @@
+.contentPaneLiteral {
+ white-space: pre-wrap;
+}
+
+.dataContentPaneRowEven {
+ background-color: #f0f0f0;
+}
+
+.dataContentPaneRowOdd {
+ background-color: var(--color-background, white);
+}
+
+.dataContentPaneTopAlignedRow {
+ vertical-align: top;
+}
+
+.dataContentPaneNestedLight {
+ background-color: var(--color-background, white);
+}
+
+.dataContentPaneNestedDark {
+ background-color: #eee;
+}
\ No newline at end of file
diff --git a/src/styles/formPane.css b/src/styles/formPane.css
new file mode 100644
index 00000000..b99f1128
--- /dev/null
+++ b/src/styles/formPane.css
@@ -0,0 +1,19 @@
+.formPaneMessage {
+ color: #666;
+ margin: var(--spacing-xs, 0.5em) 0;
+ padding: var(--spacing-xs, 0.35em) var(--spacing-xs, 0.5em);
+}
+
+.formPaneMessageInfo {
+ background-color: var(--color-main-block-bg, #eee);
+}
+
+.formPaneMessageError {
+ background-color: var(--color-log-error-bg, #fee);
+}
+.formPaneEditButton {
+ padding: var(--spacing-xs, 0.5em);
+ border: .5em solid white;
+ font-size: 100%;
+ float: right;
+}
diff --git a/src/styles/humanReadablePane.css b/src/styles/humanReadablePane.css
new file mode 100644
index 00000000..42a23545
--- /dev/null
+++ b/src/styles/humanReadablePane.css
@@ -0,0 +1,8 @@
+.humanReadableFrame {
+ border: 1px solid;
+ padding: var(--spacing-md, 1em);
+ height: var(--human-readable-height, 30em);
+ width: 800px;
+ resize: both;
+ overflow: auto;
+}
diff --git a/src/styles/imagePane.css b/src/styles/imagePane.css
new file mode 100644
index 00000000..a049633f
--- /dev/null
+++ b/src/styles/imagePane.css
@@ -0,0 +1,4 @@
+.imagePaneViewImage {
+ max-width: 100%;
+ max-height: 100%;
+}
diff --git a/src/styles/internalPane.css b/src/styles/internalPane.css
new file mode 100644
index 00000000..eac9bcff
--- /dev/null
+++ b/src/styles/internalPane.css
@@ -0,0 +1,12 @@
+.internalPaneContent {
+ background-color: #ddddff;
+ padding: var(--spacing-xs, 0.5em);
+ border-radius: 1em;
+}
+.internalPaneControls {
+ width: 100%;
+ margin: var(--spacing-sm, 1em);
+}
+.internalPaneDeleteButton {
+ height: var(--icon-base, 2em);
+}
\ No newline at end of file
diff --git a/src/styles/padPane.css b/src/styles/padPane.css
new file mode 100644
index 00000000..3d6ee1f2
--- /dev/null
+++ b/src/styles/padPane.css
@@ -0,0 +1,13 @@
+.padPaneTable {
+ border-collapse: collapse;
+ width: 100%;
+ background-color: white;
+ min-width: 94%;
+ margin-right: 3%;
+ margin-left: 3%;
+ min-height: 13em;
+}
+
+.padPaneSuccess {
+ font-size: 140%;
+}
\ No newline at end of file
diff --git a/src/styles/schedulePane.css b/src/styles/schedulePane.css
new file mode 100644
index 00000000..3f5d4724
--- /dev/null
+++ b/src/styles/schedulePane.css
@@ -0,0 +1,28 @@
+.schedulePaneTable {
+ border-collapse: collapse;
+ background-color: white;
+ min-width: 40em;
+ min-height: 13em;
+}
+
+.schedulePaneButton {
+ background-color: #eef;
+ padding: var(--spacing-xs, 0.5em);
+ border: .5em solid white;
+ font-size: 100%
+}
+
+.schedulePaneButtonIcon {
+ width: var(--icon-sm, 1.8em);
+ height: var(--icon-sm, 1.8em);
+}
+
+.schedulePaneNaviMenu {
+ text-align: center;
+ vertical-align: middle;
+ padding-top: 4em;
+}
+.schedulePaneCell {
+ padding: var(--spacing-xs, 0.3em);
+ text-align: center;
+}
diff --git a/src/style/tabbedtab.css b/src/styles/tabbedtab.css
similarity index 100%
rename from src/style/tabbedtab.css
rename to src/styles/tabbedtab.css
diff --git a/src/styles/utilities.css b/src/styles/utilities.css
new file mode 100644
index 00000000..47e14e3d
--- /dev/null
+++ b/src/styles/utilities.css
@@ -0,0 +1,5 @@
+:root {
+ --icon-sm: 1.8em;
+ --color-background-row-default: white;
+ --color-background-row-alternate: #f0f0f0;
+}
\ No newline at end of file
diff --git a/test/__mocks__/styleMock.js b/test/__mocks__/styleMock.js
new file mode 100644
index 00000000..4ba52ba2
--- /dev/null
+++ b/test/__mocks__/styleMock.js
@@ -0,0 +1 @@
+module.exports = {}
diff --git a/test/unit/outline/manager.test.ts b/test/unit/outline/manager.test.ts
index 33f471c1..2453ec41 100644
--- a/test/unit/outline/manager.test.ts
+++ b/test/unit/outline/manager.test.ts
@@ -40,8 +40,8 @@ describe('manager', () => {
it('is selectable', () => {
expect(result).toHaveAttribute('notselectable', 'false')
})
- it('has style', () => {
- expect(result).toHaveStyle('margin: 0.2em; border: none; padding: 0; vertical-align: top;')
+ it('uses stylesheet layout (no inline style)', () => {
+ expect(result).not.toHaveAttribute('style')
})
it('shows an expand icon', () => {
const img = result.firstChild
@@ -94,8 +94,8 @@ describe('manager', () => {
it('is selectable', () => {
expect(result).toHaveAttribute('notselectable', 'false')
})
- it('has style', () => {
- expect(result).toHaveStyle('margin: 0.2em; border: none; padding: 0; vertical-align: top;')
+ it('uses stylesheet layout (no inline style)', () => {
+ expect(result).not.toHaveAttribute('style')
})
it('shows an expand icon', () => {
const img = result.firstChild
@@ -141,8 +141,8 @@ describe('manager', () => {
it('is selectable', () => {
expect(result).toHaveAttribute('notselectable', 'false')
})
- it('has style', () => {
- expect(result).toHaveStyle('margin: 0.2em; border: none; padding: 0; vertical-align: top;')
+ it('uses stylesheet layout (no inline style)', () => {
+ expect(result).not.toHaveAttribute('style')
})
it('shows the literal text', () => {
expect(result).toHaveTextContent('some text')
@@ -171,8 +171,8 @@ describe('manager', () => {
it('is selectable', () => {
expect(result).toHaveAttribute('notselectable', 'false')
})
- it('has style', () => {
- expect(result).toHaveStyle('margin: 0.2em; border: none; padding: 0; vertical-align: top;')
+ it('uses stylesheet layout (no inline style)', () => {
+ expect(result).not.toHaveAttribute('style')
})
it('shows 3 dots', () => {
expect(result).toHaveTextContent('...')
diff --git a/webpack.config.mjs b/webpack.config.mjs
new file mode 100644
index 00000000..922b356c
--- /dev/null
+++ b/webpack.config.mjs
@@ -0,0 +1,124 @@
+import path from 'path'
+import TerserPlugin from 'terser-webpack-plugin'
+import CopyPlugin from 'copy-webpack-plugin'
+
+const common = {
+ entry: './src/index.ts',
+ resolve: {
+ extensions: ['.ts', '.js', '.json'],
+ fallback: {
+ path: false,
+ },
+ },
+ module: {
+ rules: [
+ {
+ test: /\.ts$/,
+ use: 'ts-loader',
+ exclude: /node_modules/,
+ },
+ {
+ test: /\.css$/,
+ use: ['style-loader', 'css-loader'],
+ },
+ {
+ test: /\.ttl$/i,
+ type: 'asset/source'
+ }
+ ],
+ },
+ externals: {
+ fs: 'null',
+ 'node-fetch': 'fetch',
+ 'isomorphic-fetch': 'fetch',
+ 'text-encoding': 'TextEncoder',
+ '@trust/webcrypto': 'crypto',
+ rdflib: 'rdflib',
+ $rdf: 'rdflib',
+ 'solid-logic': 'SolidLogic',
+ SolidLogic: 'SolidLogic',
+ 'solid-ui': 'UI',
+ UI: 'UI',
+ },
+ devtool: 'source-map',
+}
+
+const normalConfig = {
+ ...common,
+ mode: 'production',
+ output: {
+ path: path.resolve(process.cwd(), 'dist'),
+ filename: 'solid-panes.js',
+ library: {
+ type: 'umd',
+ name: 'SolidPanes',
+ export: 'default',
+ },
+ globalObject: 'this',
+ clean: true,
+ },
+ plugins: [
+ ...(common.plugins || []),
+ new CopyPlugin({
+ patterns: [
+ {
+ from: 'src/**/*.css',
+ to: ({ context, absoluteFilename }) => {
+ // Preserve folder structure under dist/
+ const relPath = path.relative(path.resolve('src'), absoluteFilename)
+ return path.resolve('dist', relPath)
+ },
+ },
+ ],
+ }),
+ ],
+ optimization: {
+ minimize: false,
+ }
+}
+
+const minConfig = {
+ ...common,
+ mode: 'production',
+ output: {
+ path: path.resolve(process.cwd(), 'dist'),
+ filename: 'solid-panes.min.js',
+ library: {
+ type: 'umd',
+ name: 'SolidPanes',
+ export: 'default',
+ },
+ globalObject: 'this',
+ clean: false,
+ },
+ plugins: [
+ ...(common.plugins || []),
+ new CopyPlugin({
+ patterns: [
+ {
+ from: 'src/**/*.css',
+ to: ({ context, absoluteFilename }) => {
+ // Preserve folder structure under dist/
+ const relPath = path.relative(path.resolve('src'), absoluteFilename)
+ return path.resolve('dist', relPath)
+ },
+ },
+ ],
+ }),
+ ],
+ optimization: {
+ minimize: true,
+ minimizer: [
+ new TerserPlugin({
+ terserOptions: {
+ format: {
+ comments: false,
+ },
+ },
+ extractComments: false,
+ })
+ ],
+ }
+}
+
+export default [normalConfig, minConfig]