diff --git a/infrastructure/control-panel/.npmrc b/infrastructure/control-panel/.npmrc
index b6f27f135..c0c80ba44 100644
--- a/infrastructure/control-panel/.npmrc
+++ b/infrastructure/control-panel/.npmrc
@@ -1 +1 @@
-engine-strict=true
+engine-strict=false
diff --git a/infrastructure/control-panel/package.json b/infrastructure/control-panel/package.json
index 2d0d9172d..2ab30fe72 100644
--- a/infrastructure/control-panel/package.json
+++ b/infrastructure/control-panel/package.json
@@ -52,6 +52,7 @@
"flowbite-svelte-icons": "^2.2.1",
"lowdb": "^7.0.1",
"lucide-svelte": "^0.561.0",
- "tailwind-merge": "^3.0.2"
+ "tailwind-merge": "^3.0.2",
+ "vis-network": "^10.0.2"
}
}
diff --git a/infrastructure/control-panel/src/routes/+layout.svelte b/infrastructure/control-panel/src/routes/+layout.svelte
index bd6d767b8..76f973eea 100644
--- a/infrastructure/control-panel/src/routes/+layout.svelte
+++ b/infrastructure/control-panel/src/routes/+layout.svelte
@@ -12,7 +12,8 @@
const navLinks = [
{ label: 'Dashboard', href: '/' },
{ label: 'Monitoring', href: '/monitoring' },
- { label: 'Actions', href: '/actions' }
+ { label: 'Actions', href: '/actions' },
+ { label: 'Visualizer', href: '/visualizer' }
];
const isActive = (href: string) => (href === '/' ? pageUrl === '/' : pageUrl.startsWith(href));
diff --git a/infrastructure/control-panel/src/routes/api/references/+server.ts b/infrastructure/control-panel/src/routes/api/references/+server.ts
new file mode 100644
index 000000000..c8e235781
--- /dev/null
+++ b/infrastructure/control-panel/src/routes/api/references/+server.ts
@@ -0,0 +1,22 @@
+import { json } from '@sveltejs/kit';
+import type { RequestHandler } from '@sveltejs/kit';
+import { env } from '$env/dynamic/private';
+
+export const GET: RequestHandler = async () => {
+ const baseUrl = env.VITE_EREPUTATION_BASE_URL || 'http://localhost:8765';
+
+ try {
+ const response = await fetch(`${baseUrl}/api/references/all`);
+
+ if (!response.ok) {
+ console.error('eReputation API error:', response.status, response.statusText);
+ return json({ error: 'Failed to fetch references', references: [] }, { status: 500 });
+ }
+
+ const data = await response.json();
+ return json(data);
+ } catch (error) {
+ console.error('Error fetching references from eReputation:', error);
+ return json({ error: 'Failed to connect to eReputation API', references: [] }, { status: 500 });
+ }
+};
diff --git a/infrastructure/control-panel/src/routes/visualizer/+page.server.ts b/infrastructure/control-panel/src/routes/visualizer/+page.server.ts
new file mode 100644
index 000000000..f0335f361
--- /dev/null
+++ b/infrastructure/control-panel/src/routes/visualizer/+page.server.ts
@@ -0,0 +1,30 @@
+import type { PageServerLoad } from './$types';
+
+export interface ReferenceEdge {
+ id: string;
+ content: string;
+ numericScore: number | null;
+ referenceType: string;
+ status: string;
+ targetType: string; // "user" | "group" | "platform"
+ targetId: string;
+ targetName: string;
+ author: {
+ id: string;
+ ename: string;
+ name: string;
+ };
+ createdAt: string;
+}
+
+
+export const load: PageServerLoad = async ({ fetch }) => {
+ try {
+ const response = await fetch('/api/references');
+ const data = await response.json();
+ return { references: (data.references ?? []) as ReferenceEdge[] };
+ } catch (error) {
+ console.error('Error loading references for visualizer:', error);
+ return { references: [] as ReferenceEdge[] };
+ }
+};
diff --git a/infrastructure/control-panel/src/routes/visualizer/+page.svelte b/infrastructure/control-panel/src/routes/visualizer/+page.svelte
new file mode 100644
index 000000000..ff7f68b80
--- /dev/null
+++ b/infrastructure/control-panel/src/routes/visualizer/+page.svelte
@@ -0,0 +1,426 @@
+
+
+
+
+
+
+
+
+ Showing every signed eReference — who vouches for whom across the ecosystem
+
+
+
+
+ {data.references?.length ?? 0} references
+
+
+
+
+
+
+
+
+ Author (user)
+
+
+
+ Target: user
+
+
+
+ Target: group
+
+
+
+ Target: platform
+
+ → eReference (click node for details)
+
+
+
+
+
+
+
+
+
+
+
diff --git a/platforms/ereputation/api/src/controllers/ReferenceController.ts b/platforms/ereputation/api/src/controllers/ReferenceController.ts
index e250c6854..a015c4e84 100644
--- a/platforms/ereputation/api/src/controllers/ReferenceController.ts
+++ b/platforms/ereputation/api/src/controllers/ReferenceController.ts
@@ -73,6 +73,37 @@ export class ReferenceController {
}
};
+ /**
+ * Get ALL signed references in the system (admin/visualizer endpoint).
+ */
+ getAllReferences = async (_req: Request, res: Response) => {
+ try {
+ const references = await this.referenceService.getAllReferences();
+
+ res.json({
+ references: references.map(ref => ({
+ id: ref.id,
+ content: ref.content,
+ numericScore: ref.numericScore,
+ referenceType: ref.referenceType,
+ status: ref.status,
+ targetType: ref.targetType,
+ targetId: ref.targetId,
+ targetName: ref.targetName,
+ author: {
+ id: ref.author.id,
+ ename: ref.author.ename,
+ name: ref.author.name
+ },
+ createdAt: ref.createdAt
+ }))
+ });
+ } catch (error) {
+ console.error("Error getting all references:", error);
+ res.status(500).json({ error: "Internal server error" });
+ }
+ };
+
getReferencesForTarget = async (req: Request, res: Response) => {
try {
const { targetType, targetId } = req.params;
diff --git a/platforms/ereputation/api/src/database/seed.ts b/platforms/ereputation/api/src/database/seed.ts
new file mode 100644
index 000000000..78868f5f6
--- /dev/null
+++ b/platforms/ereputation/api/src/database/seed.ts
@@ -0,0 +1,227 @@
+/**
+ * Seed script for eReputation database.
+ * Creates mock users and signed eReferences for the visualizer.
+ *
+ * Usage (from platforms/ereputation/api):
+ * npx ts-node src/database/seed.ts
+ */
+import "reflect-metadata";
+import path from "node:path";
+import { config } from "dotenv";
+import { DataSource } from "typeorm";
+import { User } from "./entities/User";
+import { Reference } from "./entities/Reference";
+import { Vote } from "./entities/Vote";
+import { Poll } from "./entities/Poll";
+import { Wishlist } from "./entities/Wishlist";
+import { VoteReputationResult } from "./entities/VoteReputationResult";
+import { ReferenceSignature } from "./entities/ReferenceSignature";
+import { Group } from "./entities/Group";
+import { Calculation } from "./entities/Calculation";
+import { Message } from "./entities/Message";
+
+config({ path: path.resolve(__dirname, "../../../../.env") });
+
+// Parse DB URL into explicit connection options (avoids SCRAM password parsing issues)
+function parseDbUrl(url: string) {
+ const parsed = new URL(url);
+ return {
+ host: parsed.hostname,
+ port: parseInt(parsed.port || "5432", 10),
+ username: decodeURIComponent(parsed.username),
+ password: decodeURIComponent(parsed.password),
+ database: parsed.pathname.replace(/^\//, ""),
+ };
+}
+
+const dbConfig = parseDbUrl(process.env.EREPUTATION_DATABASE_URL || "postgresql://postgres:postgres@localhost:5432/ereputation");
+
+// Standalone data source (no subscribers, no migrations)
+const SeedDataSource = new DataSource({
+ type: "postgres",
+ ...dbConfig,
+ synchronize: true, // create tables if missing
+ entities: [User, Reference, Vote, Poll, Wishlist, VoteReputationResult, ReferenceSignature, Group, Calculation, Message],
+ logging: false,
+});
+
+// ── Seed data ──────────────────────────────────────────────────────────
+
+const USERS = [
+ { handle: "alice", name: "Alice Dupont", ename: "alice.w3ds", email: "alice@example.com" },
+ { handle: "bob", name: "Bob Martin", ename: "bob.w3ds", email: "bob@example.com" },
+ { handle: "charlie", name: "Charlie Roux", ename: "charlie.w3ds", email: "charlie@example.com" },
+ { handle: "diana", name: "Diana Chen", ename: "diana.w3ds", email: "diana@example.com" },
+ { handle: "emile", name: "Emile Voss", ename: "emile.w3ds", email: "emile@example.com" },
+ { handle: "fatima", name: "Fatima Nouri", ename: "fatima.w3ds", email: "fatima@example.com" },
+ { handle: "gabriel", name: "Gabriel Leroy", ename: "gabriel.w3ds", email: "gabriel@example.com" },
+ { handle: "hana", name: "Hana Takahashi", ename: "hana.w3ds", email: "hana@example.com" },
+ { handle: "ivan", name: "Ivan Petrov", ename: "ivan.w3ds", email: "ivan@example.com" },
+ { handle: "julia", name: "Julia Moreau", ename: "julia.w3ds", email: "julia@example.com" },
+ { handle: "karl", name: "Karl Weber", ename: "karl.w3ds", email: "karl@example.com" },
+ { handle: "lina", name: "Lina Alves", ename: "lina.w3ds", email: "lina@example.com" },
+ { handle: "marco", name: "Marco Rossi", ename: "marco.w3ds", email: "marco@example.com" },
+ { handle: "nadia", name: "Nadia Sergeeva", ename: "nadia.w3ds", email: "nadia@example.com" },
+ { handle: "omar", name: "Omar Farah", ename: "omar.w3ds", email: "omar@example.com" },
+];
+
+const GROUPS = [
+ { id: "g-core-team", name: "MetaState Core Team" },
+ { id: "g-w3ds-wg", name: "W3DS Working Group" },
+ { id: "g-dao-gov", name: "DAO Governance Board" },
+ { id: "g-open-data", name: "Open Data Collective" },
+];
+
+const PLATFORMS = [
+ { id: "p-blabsy", name: "Blabsy" },
+ { id: "p-pictique", name: "Pictique" },
+ { id: "p-evoting", name: "eVoting" },
+ { id: "p-ecurrency", name: "eCurrency" },
+ { id: "p-marketplace", name: "Marketplace" },
+ { id: "p-esigner", name: "eSigner" },
+];
+
+const REF_TYPES = ["professional", "academic", "character", "skill", "leadership"];
+
+const TEXTS: Record = {
+ professional: [
+ "Outstanding work ethic and delivery quality. Consistently exceeded expectations on every project we collaborated on.",
+ "A reliable professional who brings deep technical expertise to every project. I would hire them again without hesitation.",
+ "Excellent collaborator — always willing to help and share knowledge with the team. Elevated everyone around them.",
+ "Demonstrated exceptional project management skills and always delivered on time despite tight deadlines.",
+ ],
+ academic: [
+ "Exceptional research capabilities and a talent for synthesizing complex information into actionable insights.",
+ "Contributed groundbreaking insights during our joint research project on decentralized identity systems.",
+ "A brilliant mind with a knack for breaking down complex cryptographic concepts for broader audiences.",
+ ],
+ character: [
+ "Trustworthy and principled. A person of integrity in all interactions, both professional and personal.",
+ "Genuinely kind and supportive, making every team better by being in it. Their positive energy is contagious.",
+ "An exceptionally honest and transparent individual. You always know where you stand with them.",
+ ],
+ skill: [
+ "Expert-level proficiency in distributed systems and cryptographic protocols. A true technical authority.",
+ "Remarkable problem-solving skills and attention to detail. Finds solutions others wouldn't think of.",
+ "Strong architectural thinking — designs systems that are both elegant and resilient at scale.",
+ "Full-stack expertise with deep knowledge of both frontend UX and backend infrastructure.",
+ ],
+ leadership: [
+ "Led our team through a challenging transition with empathy and clarity. Everyone felt supported.",
+ "Inspires others through vision and by example. A natural leader who earns respect rather than demands it.",
+ "Exceptional at mentoring junior team members. Several people on our team grew significantly under their guidance.",
+ ],
+};
+
+function pick(arr: T[]): T {
+ return arr[Math.floor(Math.random() * arr.length)];
+}
+
+function randomDate(daysBack: number): Date {
+ return new Date(Date.now() - Math.floor(Math.random() * daysBack) * 86_400_000);
+}
+
+// ── Main ───────────────────────────────────────────────────────────────
+
+async function seed() {
+ console.log("Connecting to eReputation database...");
+ await SeedDataSource.initialize();
+ console.log("Connected.\n");
+
+ const userRepo = SeedDataSource.getRepository(User);
+ const refRepo = SeedDataSource.getRepository(Reference);
+
+ // 1. Upsert users
+ console.log(`Seeding ${USERS.length} users...`);
+ const savedUsers: User[] = [];
+ for (const u of USERS) {
+ let existing = await userRepo.findOneBy({ ename: u.ename });
+ if (!existing) {
+ existing = userRepo.create(u);
+ existing = await userRepo.save(existing);
+ console.log(` + Created user: ${u.name} (${u.ename})`);
+ } else {
+ console.log(` · Exists: ${u.name} (${u.ename})`);
+ }
+ savedUsers.push(existing);
+ }
+
+ // 2. Clear old seed references (optional, idempotent re-runs)
+ const existingRefCount = await refRepo.count();
+ if (existingRefCount > 0) {
+ console.log(`\nClearing ${existingRefCount} existing references...`);
+ await refRepo.clear();
+ }
+
+ // 3. Generate references
+ console.log("\nGenerating eReferences...");
+ const references: Partial[] = [];
+
+ for (const author of savedUsers) {
+ const numRefs = 2 + Math.floor(Math.random() * 4); // 2-5 references each
+
+ for (let i = 0; i < numRefs; i++) {
+ const roll = Math.random();
+ let targetType: string;
+ let targetId: string;
+ let targetName: string;
+
+ if (roll < 0.55) {
+ // User target (not self)
+ const candidates = savedUsers.filter((u) => u.id !== author.id);
+ const target = pick(candidates);
+ targetType = "user";
+ targetId = target.id;
+ targetName = target.name;
+ } else if (roll < 0.80) {
+ // Group target
+ const target = pick(GROUPS);
+ targetType = "group";
+ targetId = target.id;
+ targetName = target.name;
+ } else {
+ // Platform target
+ const target = pick(PLATFORMS);
+ targetType = "platform";
+ targetId = target.id;
+ targetName = target.name;
+ }
+
+ const refType = pick(REF_TYPES);
+ const content = pick(TEXTS[refType]);
+ const hasScore = Math.random() > 0.25;
+
+ references.push({
+ authorId: author.id,
+ targetType,
+ targetId,
+ targetName,
+ content,
+ referenceType: refType,
+ numericScore: hasScore ? Math.floor(Math.random() * 3) + 3 : undefined, // 3-5
+ status: "signed",
+ createdAt: randomDate(365),
+ });
+ }
+ }
+
+ // Bulk insert
+ await refRepo.save(references as Reference[]);
+ console.log(` ✓ Created ${references.length} signed eReferences\n`);
+
+ // 4. Summary
+ const userCount = await userRepo.count();
+ const refCount = await refRepo.count();
+ console.log("── Seed complete ──");
+ console.log(` Users: ${userCount}`);
+ console.log(` References: ${refCount}`);
+ console.log("");
+
+ await SeedDataSource.destroy();
+ process.exit(0);
+}
+
+seed().catch((err) => {
+ console.error("Seed failed:", err);
+ process.exit(1);
+});
diff --git a/platforms/ereputation/api/src/index.ts b/platforms/ereputation/api/src/index.ts
index 2ad365765..7274d95c0 100644
--- a/platforms/ereputation/api/src/index.ts
+++ b/platforms/ereputation/api/src/index.ts
@@ -85,6 +85,9 @@ app.post("/api/webhook", webhookController.handleWebhook);
app.get("/api/platforms", platformController.getPlatforms);
app.get("/api/platforms/search", platformController.searchPlatforms);
+// Public reference routes (for visualizer / admin)
+app.get("/api/references/all", referenceController.getAllReferences);
+
// Protected routes (auth required)
app.use(authMiddleware); // Apply auth middleware to all routes below
diff --git a/platforms/ereputation/api/src/services/ReferenceService.ts b/platforms/ereputation/api/src/services/ReferenceService.ts
index 17f5a314d..189fbb6b9 100644
--- a/platforms/ereputation/api/src/services/ReferenceService.ts
+++ b/platforms/ereputation/api/src/services/ReferenceService.ts
@@ -82,6 +82,14 @@ export class ReferenceService {
return { references, total };
}
+ async getAllReferences(): Promise {
+ return await this.referenceRepository.find({
+ where: { status: "signed" },
+ relations: ["author"],
+ order: { createdAt: "DESC" }
+ });
+ }
+
async revokeReference(referenceId: string, authorId: string): Promise {
const reference = await this.referenceRepository.findOne({
where: { id: referenceId, authorId }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f8f55c60e..c36a39baf 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -157,6 +157,9 @@ importers:
tailwind-merge:
specifier: ^3.0.2
version: 3.4.1
+ vis-network:
+ specifier: ^10.0.2
+ version: 10.0.2(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)(keycharm@0.4.0)(uuid@13.0.0)(vis-data@8.0.3(uuid@13.0.0)(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)))(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0))
devDependencies:
'@eslint/compat':
specifier: ^1.2.5
@@ -2992,7 +2995,7 @@ importers:
version: 1.1.1(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
draft-js:
specifier: ^0.11.7
- version: 0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
lucide-react:
specifier: ^0.561.0
version: 0.561.0(react@18.3.1)
@@ -3013,7 +3016,7 @@ importers:
version: 18.3.1(react@18.3.1)
react-draft-wysiwyg:
specifier: ^1.15.0
- version: 1.15.0(draft-js@0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 1.15.0(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-hook-form:
specifier: ^7.55.0
version: 7.71.1(react@18.3.1)
@@ -5104,6 +5107,10 @@ packages:
'@drizzle-team/brocli@0.10.2':
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
+ '@egjs/hammerjs@2.0.17':
+ resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==}
+ engines: {node: '>=0.8.0'}
+
'@emnapi/core@1.8.1':
resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==}
@@ -9613,6 +9620,9 @@ packages:
'@types/gtag.js@0.0.12':
resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==}
+ '@types/hammerjs@2.0.46':
+ resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==}
+
'@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
@@ -11357,6 +11367,10 @@ packages:
resolution: {integrity: sha512-j1yoUo4gxPND1JWV9xj5ELih0yMv1iCWDG6eEQIPLSWLxzCXiFoyS7kvB+WwU+tZMf4snwJMMtaubV0laFpiBA==}
hasBin: true
+ component-emitter@2.0.0:
+ resolution: {integrity: sha512-4m5s3Me2xxlVKG9PkZpQqHQR7bgpnN7joDMJ4yvVkVXngjoITG76IaZmzmywSeRTeTpc6N6r3H3+KyUurV8OYw==}
+ engines: {node: '>=18'}
+
compress-commons@6.0.2:
resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==}
engines: {node: '>= 14'}
@@ -14551,6 +14565,9 @@ packages:
resolution: {integrity: sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==}
hasBin: true
+ keycharm@0.4.0:
+ resolution: {integrity: sha512-TyQTtsabOVv3MeOpR92sIKk/br9wxS+zGj4BG7CR8YbK4jM3tyIBaF0zhzeBUMx36/Q/iQLOKKOT+3jOQtemRQ==}
+
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
@@ -16525,6 +16542,7 @@ packages:
prebuild-install@7.1.3:
resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==}
engines: {node: '>=10'}
+ deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
hasBin: true
prelude-ls@1.2.1:
@@ -18932,6 +18950,29 @@ packages:
victory-vendor@36.9.2:
resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==}
+ vis-data@8.0.3:
+ resolution: {integrity: sha512-jhnb6rJNqkKR1Qmlay0VuDXY9ZlvAnYN1udsrP4U+krgZEq7C0yNSKdZqmnCe13mdnf9AdVcdDGFOzy2mpPoqw==}
+ peerDependencies:
+ uuid: ^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^13.0.0
+ vis-util: '>=6.0.0'
+
+ vis-network@10.0.2:
+ resolution: {integrity: sha512-qPl8GLYBeHEFqiTqp4VBbYQIJ2EA8KLr7TstA2E8nJxfEHaKCU81hQLz7hhq11NUpHbMaRzBjW5uZpVKJ45/wA==}
+ peerDependencies:
+ '@egjs/hammerjs': ^2.0.0
+ component-emitter: ^1.3.0 || ^2.0.0
+ keycharm: ^0.2.0 || ^0.3.0 || ^0.4.0
+ uuid: ^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^13.0.0
+ vis-data: '>=8.0.0'
+ vis-util: '>=6.0.0'
+
+ vis-util@6.0.0:
+ resolution: {integrity: sha512-qtpts3HRma0zPe4bO7t9A2uejkRNj8Z2Tb6do6lN85iPNWExFkUiVhdAq5uLGIUqBFduyYeqWJKv/jMkxX0R5g==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ '@egjs/hammerjs': ^2.0.0
+ component-emitter: ^1.3.0 || ^2.0.0
+
vite-node@1.6.1:
resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -21955,6 +21996,10 @@ snapshots:
'@drizzle-team/brocli@0.10.2': {}
+ '@egjs/hammerjs@2.0.17':
+ dependencies:
+ '@types/hammerjs': 2.0.46
+
'@emnapi/core@1.8.1':
dependencies:
'@emnapi/wasi-threads': 1.1.0
@@ -27302,6 +27347,8 @@ snapshots:
'@types/gtag.js@0.0.12': {}
+ '@types/hammerjs@2.0.46': {}
+
'@types/hast@3.0.4':
dependencies:
'@types/unist': 3.0.3
@@ -29576,6 +29623,8 @@ snapshots:
minimist: 1.2.8
string.prototype.repeat: 0.2.0
+ component-emitter@2.0.0: {}
+
compress-commons@6.0.2:
dependencies:
crc-32: 1.2.2
@@ -30516,9 +30565,9 @@ snapshots:
dotenv@17.3.1: {}
- draft-js@0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- fbjs: 2.0.0(encoding@0.1.13)
+ fbjs: 2.0.0
immutable: 3.7.6
object-assign: 4.1.1
react: 18.3.1
@@ -30526,9 +30575,9 @@ snapshots:
transitivePeerDependencies:
- encoding
- draftjs-utils@0.10.2(draft-js@0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4):
+ draftjs-utils@0.10.2(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4):
dependencies:
- draft-js: 0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ draft-js: 0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
immutable: 5.1.4
drizzle-kit@0.31.9:
@@ -30976,8 +31025,8 @@ snapshots:
'@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2)
eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-react-hooks: 5.2.0(eslint@9.39.2(jiti@2.6.1))
@@ -31040,21 +31089,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)):
- dependencies:
- '@nolyfill/is-core-module': 1.0.39
- debug: 4.4.3(supports-color@5.5.0)
- eslint: 9.39.2(jiti@2.6.1)
- get-tsconfig: 4.13.6
- is-bun-module: 2.0.0
- stable-hash: 0.0.5
- tinyglobby: 0.2.15
- unrs-resolver: 1.11.1
- optionalDependencies:
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))
- transitivePeerDependencies:
- - supports-color
-
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1):
dependencies:
'@nolyfill/is-core-module': 1.0.39
@@ -31097,17 +31131,6 @@ snapshots:
- supports-color
eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)):
- dependencies:
- debug: 3.2.7
- optionalDependencies:
- '@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2)
- eslint: 9.39.2(jiti@2.6.1)
- eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))
- transitivePeerDependencies:
- - supports-color
-
- eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
debug: 3.2.7
optionalDependencies:
@@ -31147,35 +31170,6 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)):
- dependencies:
- '@rtsao/scc': 1.1.0
- array-includes: 3.1.9
- array.prototype.findlastindex: 1.2.6
- array.prototype.flat: 1.3.3
- array.prototype.flatmap: 1.3.3
- debug: 3.2.7
- doctrine: 2.1.0
- eslint: 9.39.2(jiti@2.6.1)
- eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))
- hasown: 2.0.2
- is-core-module: 2.16.1
- is-glob: 4.0.3
- minimatch: 3.1.2
- object.fromentries: 2.0.8
- object.groupby: 1.0.3
- object.values: 1.2.1
- semver: 6.3.1
- string.prototype.trimend: 1.0.9
- tsconfig-paths: 3.15.0
- optionalDependencies:
- '@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2)
- transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- - supports-color
-
eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
'@rtsao/scc': 1.1.0
@@ -31187,7 +31181,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.2))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -31860,7 +31854,7 @@ snapshots:
fbjs-css-vars@1.0.2: {}
- fbjs@2.0.0(encoding@0.1.13):
+ fbjs@2.0.0:
dependencies:
core-js: 3.48.0
cross-fetch: 3.2.0(encoding@0.1.13)
@@ -32691,9 +32685,9 @@ snapshots:
html-tags@3.3.1: {}
- html-to-draftjs@1.5.0(draft-js@0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4):
+ html-to-draftjs@1.5.0(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4):
dependencies:
- draft-js: 0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ draft-js: 0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
immutable: 5.1.4
html-url-attributes@3.0.1: {}
@@ -34164,6 +34158,8 @@ snapshots:
dependencies:
commander: 8.3.0
+ keycharm@0.4.0: {}
+
keyv@4.5.4:
dependencies:
json-buffer: 3.0.1
@@ -37002,12 +36998,12 @@ snapshots:
react: 18.3.1
scheduler: 0.23.2
- react-draft-wysiwyg@1.15.0(draft-js@0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ react-draft-wysiwyg@1.15.0(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
classnames: 2.5.1
- draft-js: 0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- draftjs-utils: 0.10.2(draft-js@0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4)
- html-to-draftjs: 1.5.0(draft-js@0.11.7(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4)
+ draft-js: 0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ draftjs-utils: 0.10.2(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4)
+ html-to-draftjs: 1.5.0(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@5.1.4)
immutable: 5.1.4
linkify-it: 2.2.0
prop-types: 15.8.1
@@ -39567,6 +39563,25 @@ snapshots:
d3-time: 3.1.0
d3-timer: 3.0.1
+ vis-data@8.0.3(uuid@13.0.0)(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)):
+ dependencies:
+ uuid: 13.0.0
+ vis-util: 6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)
+
+ vis-network@10.0.2(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)(keycharm@0.4.0)(uuid@13.0.0)(vis-data@8.0.3(uuid@13.0.0)(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)))(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)):
+ dependencies:
+ '@egjs/hammerjs': 2.0.17
+ component-emitter: 2.0.0
+ keycharm: 0.4.0
+ uuid: 13.0.0
+ vis-data: 8.0.3(uuid@13.0.0)(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0))
+ vis-util: 6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)
+
+ vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0):
+ dependencies:
+ '@egjs/hammerjs': 2.0.17
+ component-emitter: 2.0.0
+
vite-node@1.6.1(@types/node@20.19.26)(lightningcss@1.30.2)(sass@1.97.3)(terser@5.46.0):
dependencies:
cac: 6.7.14