diff --git a/.github/workflows/tests-evault-core.yml b/.github/workflows/tests-evault-core.yml new file mode 100644 index 00000000..4d4d852e --- /dev/null +++ b/.github/workflows/tests-evault-core.yml @@ -0,0 +1,34 @@ +name: Tests [evault-core] + +on: + push: + branches: [main] + paths: + - 'infrastructure/evault-core/**' + pull_request: + branches: [main] + paths: + - 'infrastructure/w3id/**' + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Node.js 22 + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Install pnpm + run: npm install -g pnpm + + - name: Install dependencies + run: pnpm install + + - name: Run tests + run: pnpm -F=evault-core test + diff --git a/infrastructure/evault-core/docker-compose.yml b/infrastructure/evault-core/docker-compose.yml new file mode 100644 index 00000000..48f9d70d --- /dev/null +++ b/infrastructure/evault-core/docker-compose.yml @@ -0,0 +1,22 @@ +version: '3.8' + +services: + neo4j: + image: neo4j:5.15 + container_name: neo4j + ports: + - "7474:7474" + - "7687:7687" + environment: + - NEO4J_AUTH=neo4j/testpass + volumes: + - neo4j_data:/data + networks: + - graphnet + +volumes: + neo4j_data: + +networks: + graphnet: + driver: bridge diff --git a/infrastructure/evault-core/package.json b/infrastructure/evault-core/package.json index 3290dba7..a8feaa5c 100644 --- a/infrastructure/evault-core/package.json +++ b/infrastructure/evault-core/package.json @@ -1,12 +1,32 @@ { - "name": "evault-core", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC" + "name": "evault-core", + "version": "0.1.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "vitest --config vitest.config.ts" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@types/json-schema": "^7.0.15", + "@types/node": "^22.13.10", + "dotenv": "^16.5.0", + "testcontainers": "^10.24.2", + "tsx": "^4.19.3", + "typescript": "^5.8.3", + "uuid": "^11.1.0", + "vitest": "^3.0.9" + }, + "dependencies": { + "@testcontainers/neo4j": "^10.24.2", + "graphql": "^16.10.0", + "graphql-type-json": "^0.3.2", + "graphql-voyager": "^2.1.0", + "graphql-yoga": "^5.13.4", + "json-schema": "^0.4.0", + "neo4j-driver": "^5.28.1", + "w3id": "workspace:*" + } } diff --git a/infrastructure/evault-core/src/db/db.service.spec.ts b/infrastructure/evault-core/src/db/db.service.spec.ts new file mode 100644 index 00000000..4ae8109e --- /dev/null +++ b/infrastructure/evault-core/src/db/db.service.spec.ts @@ -0,0 +1,270 @@ +import neo4j, { Driver } from "neo4j-driver"; +import { DbService } from "./db.service"; // adjust if needed +import { it, describe, beforeAll, afterAll, expect } from "vitest"; +import { Neo4jContainer, StartedNeo4jContainer } from "@testcontainers/neo4j"; + +type Envelope = { + id: string; + ontology: string; + value: any; + valueType: string; +}; + +describe("DbService (integration)", () => { + let container: StartedNeo4jContainer; + let service: DbService; + let driver: Driver; + + beforeAll(async () => { + container = await new Neo4jContainer("neo4j:5.15").start(); + + const username = container.getUsername(); + const password = container.getPassword(); + const boltPort = container.getMappedPort(7687); + const uri = `bolt://localhost:${boltPort}`; + + driver = neo4j.driver(uri, neo4j.auth.basic(username, password)); + service = new DbService(driver); + }); + + afterAll(async () => { + await service.close(); + await driver.close(); + await container.stop(); + }); + + it("should store and retrieve a meta-envelope with various data types", async () => { + const input = { + ontology: "TestTypes", + payload: { + string: "hello world", + number: 42, + boolean: true, + date: new Date("2025-04-10T00:00:00Z"), + array: [1, 2, 3], + object: { nested: { value: "deep" } }, + }, + acl: ["@test-user"], + }; + + const result = await service.storeMetaEnvelope(input, input.acl); + const id = result.metaEnvelope.id; + + const fetched = await service.findMetaEnvelopeById(id); + expect(fetched).toBeDefined(); + expect(fetched.id).toBeDefined(); + expect(fetched.ontology).toBe("TestTypes"); + expect(fetched.acl).toEqual(["@test-user"]); + expect(fetched.envelopes).toHaveLength(6); + + // Verify parsed field matches original payload + expect(fetched.parsed).toEqual(input.payload); + + // Verify each data type is properly stored and retrieved + const envelopes = fetched.envelopes.reduce( + (acc: Record, e: Envelope) => { + acc[e.ontology] = e; + return acc; + }, + {}, + ); + + expect(envelopes.string.value).toBe("hello world"); + expect(envelopes.string.valueType).toBe("string"); + + expect(envelopes.number.value).toBe(42); + expect(envelopes.number.valueType).toBe("number"); + + expect(envelopes.boolean.value).toBe(true); + expect(envelopes.boolean.valueType).toBe("boolean"); + + expect(envelopes.date.value).toBeInstanceOf(Date); + expect(envelopes.date.value.toISOString()).toBe( + "2025-04-10T00:00:00.000Z", + ); + expect(envelopes.date.valueType).toBe("date"); + + expect(envelopes.array.value).toEqual([1, 2, 3]); + expect(envelopes.array.valueType).toBe("array"); + + expect(envelopes.object.value).toEqual({ nested: { value: "deep" } }); + expect(envelopes.object.valueType).toBe("object"); + }); + + it("should find meta-envelopes containing the search term in any envelope value", async () => { + const input = { + ontology: "SocialMediaPost", + payload: { + text: "This is a searchable tweet", + image: "https://example.com/image.jpg", + likes: ["user1", "user2"], + }, + acl: ["@search-test-user"], + }; + + const metaEnv = await service.storeMetaEnvelope(input, input.acl); + + const found = await service.findMetaEnvelopesBySearchTerm( + "SocialMediaPost", + "searchable", + ); + + expect(Array.isArray(found)).toBe(true); + const match = found.find((m) => m.id === metaEnv.metaEnvelope.id); + expect(match).toBeDefined(); + if (!match) throw new Error(); + expect(match.envelopes.length).toBeGreaterThan(0); + expect( + match.envelopes.some((e) => e.value.includes("searchable")), + ).toBe(true); + }); + + it("should return empty array if no values contain the search term", async () => { + const found = await service.findMetaEnvelopesBySearchTerm( + "SocialMediaPost", + "notfoundterm", + ); + expect(Array.isArray(found)).toBe(true); + expect(found.length).toBe(0); + }); + + it("should find meta-envelopes by ontology", async () => { + const results = + await service.findMetaEnvelopesByOntology("SocialMediaPost"); + expect(Array.isArray(results)).toBe(true); + expect(results.length).toBeGreaterThan(0); + }); + + it("should delete a meta-envelope and its envelopes", async () => { + const meta = { + ontology: "TempPost", + payload: { + value: "to be deleted", + }, + acl: ["@delete-user"], + }; + + const stored = await service.storeMetaEnvelope(meta, meta.acl); + await service.deleteMetaEnvelope(stored.metaEnvelope.id); + + const deleted = await service.findMetaEnvelopeById( + stored.metaEnvelope.id, + ); + expect(deleted).toBeNull(); + }); + + it("should update envelope value with proper type handling", async () => { + const meta = { + ontology: "UpdateTest", + payload: { + value: "original", + }, + acl: ["@updater"], + }; + + const stored = await service.storeMetaEnvelope(meta, meta.acl); + + const result = await service.findMetaEnvelopeById( + stored.metaEnvelope.id, + ); + const targetEnvelope = result.envelopes.find( + (e: Envelope) => e.ontology === "value", + ); + + // Update with a different type + const newValue = new Date("2025-04-10T00:00:00Z"); + await service.updateEnvelopeValue(targetEnvelope.id, newValue); + + const updated = await service.findMetaEnvelopeById( + stored.metaEnvelope.id, + ); + const updatedValue = updated.envelopes.find( + (e: Envelope) => e.id === targetEnvelope.id, + ); + expect(updatedValue.value).toBeInstanceOf(Date); + expect(updatedValue.value.toISOString()).toBe( + "2025-04-10T00:00:00.000Z", + ); + expect(updatedValue.valueType).toBe("date"); + }); + + it("should find meta-envelopes containing the search term in any value type", async () => { + const input = { + ontology: "SearchTest", + payload: { + string: "This is a searchable string", + array: ["searchable", "array", "element"], + object: { text: "searchable object" }, + number: 42, + date: new Date("2025-04-10T00:00:00Z"), + }, + acl: ["@search-test-user"], + }; + + const metaEnv = await service.storeMetaEnvelope(input, input.acl); + + // Test search in string + const foundInString = await service.findMetaEnvelopesBySearchTerm( + "SearchTest", + "searchable string", + ); + expect(foundInString.length).toBeGreaterThan(0); + expect(foundInString[0].id).toBe(metaEnv.metaEnvelope.id); + + // Test search in array + const foundInArray = await service.findMetaEnvelopesBySearchTerm( + "SearchTest", + "searchable", + ); + expect(foundInArray.length).toBeGreaterThan(0); + expect(foundInArray[0].id).toBe(metaEnv.metaEnvelope.id); + + // Test search in object + const foundInObject = await service.findMetaEnvelopesBySearchTerm( + "SearchTest", + "searchable object", + ); + expect(foundInObject.length).toBeGreaterThan(0); + expect(foundInObject[0].id).toBe(metaEnv.metaEnvelope.id); + }); + + it("should find meta-envelopes containing the search term with parsed payload", async () => { + const input = { + ontology: "SearchTestHeyyy", + payload: { + string: "This is a searchable string", + array: ["searchable", "array", "element"], + object: { text: "searchable object" }, + number: 42, + date: new Date("2025-04-10T00:00:00Z"), + }, + acl: ["@search-test-user"], + }; + + const metaEnv = await service.storeMetaEnvelope(input, input.acl); + + // Test search in string + const foundInString = await service.findMetaEnvelopesBySearchTerm( + "SearchTestHeyyy", + "searchable string", + ); + expect(foundInString.length).toBeGreaterThan(0); + expect(foundInString[0].id).toBe(metaEnv.metaEnvelope.id); + + // Test search in array + const foundInArray = await service.findMetaEnvelopesBySearchTerm( + "SearchTestHeyyy", + "searchable", + ); + expect(foundInArray.length).toBeGreaterThan(0); + expect(foundInArray[0].id).toBe(metaEnv.metaEnvelope.id); + + // Test search in object + const foundInObject = await service.findMetaEnvelopesBySearchTerm( + "SearchTestHeyyy", + "searchable object", + ); + expect(foundInObject.length).toBeGreaterThan(0); + expect(foundInObject[0].id).toBe(metaEnv.metaEnvelope.id); + }); +}); diff --git a/infrastructure/evault-core/src/db/db.service.ts b/infrastructure/evault-core/src/db/db.service.ts new file mode 100644 index 00000000..188533f0 --- /dev/null +++ b/infrastructure/evault-core/src/db/db.service.ts @@ -0,0 +1,307 @@ +import { Driver } from "neo4j-driver"; +import { W3IDBuilder } from "w3id"; +import { serializeValue, deserializeValue } from "./schema"; +import { + MetaEnvelope, + Envelope, + MetaEnvelopeResult, + StoreMetaEnvelopeResult, + SearchMetaEnvelopesResult, + GetAllEnvelopesResult, +} from "./types"; + +/** + * Service for managing meta-envelopes and their associated envelopes in Neo4j. + * Provides functionality for storing, retrieving, searching, and updating data + * with proper type handling and access control. + */ +export class DbService { + /** + * Creates a new instance of the DbService. + * @param driver - The Neo4j driver instance + */ + constructor(private driver: Driver) {} + + /** + * Executes a Cypher query with the given parameters. + * @param query - The Cypher query to execute + * @param params - The parameters for the query + * @returns The result of the query execution + */ + private async runQuery(query: string, params: Record) { + const session = this.driver.session(); + try { + return await session.run(query, params); + } finally { + await session.close(); + } + } + + /** + * Stores a new meta-envelope and its associated envelopes. + * @param meta - The meta-envelope data (without ID) + * @param acl - The access control list for the meta-envelope + * @returns The created meta-envelope and its envelopes + */ + async storeMetaEnvelope< + T extends Record = Record, + >( + meta: Omit, "id">, + acl: string[], + ): Promise> { + const w3id = await new W3IDBuilder().build(); + + const cypher: string[] = [ + `CREATE (m:MetaEnvelope { id: $metaId, ontology: $ontology, acl: $acl })`, + ]; + + const envelopeParams: Record = { + metaId: w3id.id, + ontology: meta.ontology, + acl: acl, + }; + + const createdEnvelopes: Envelope[] = []; + let counter = 0; + + for (const [key, value] of Object.entries(meta.payload)) { + const envW3id = await new W3IDBuilder().build(); + const envelopeId = envW3id.id; + const alias = `e${counter}`; + + const { value: storedValue, type: valueType } = + serializeValue(value); + + cypher.push(` + CREATE (${alias}:Envelope { + id: $${alias}_id, + ontology: $${alias}_ontology, + value: $${alias}_value, + valueType: $${alias}_type + }) + WITH m, ${alias} + MERGE (m)-[:LINKS_TO]->(${alias}) + `); + + envelopeParams[`${alias}_id`] = envelopeId; + envelopeParams[`${alias}_ontology`] = key; + envelopeParams[`${alias}_value`] = storedValue; + envelopeParams[`${alias}_type`] = valueType; + + createdEnvelopes.push({ + id: envelopeId, + ontology: key, + value: value as T[keyof T], + valueType, + }); + + counter++; + } + + await this.runQuery(cypher.join("\n"), envelopeParams); + + return { + metaEnvelope: { + id: w3id.id, + ontology: meta.ontology, + acl: acl, + }, + envelopes: createdEnvelopes, + }; + } + + /** + * Finds meta-envelopes containing the search term in any of their envelopes. + * Returns all envelopes from the matched meta-envelopes. + * @param ontology - The ontology to search within + * @param searchTerm - The term to search for + * @returns Array of matched meta-envelopes with their complete envelope sets + */ + async findMetaEnvelopesBySearchTerm< + T extends Record = Record, + >( + ontology: string, + searchTerm: string, + ): Promise> { + const result = await this.runQuery( + ` + MATCH (m:MetaEnvelope { ontology: $ontology })-[:LINKS_TO]->(e:Envelope) + WHERE + CASE e.valueType + WHEN 'string' THEN toLower(e.value) CONTAINS toLower($term) + WHEN 'array' THEN ANY(x IN e.value WHERE toLower(toString(x)) CONTAINS toLower($term)) + WHEN 'object' THEN toLower(toString(e.value)) CONTAINS toLower($term) + ELSE toLower(toString(e.value)) CONTAINS toLower($term) + END + WITH m + MATCH (m)-[:LINKS_TO]->(allEnvelopes:Envelope) + RETURN m.id AS id, m.ontology AS ontology, m.acl AS acl, collect(allEnvelopes) AS envelopes + `, + { ontology, term: searchTerm }, + ); + + return result.records.map((record): MetaEnvelopeResult => { + const envelopes = record + .get("envelopes") + .map((node: any): Envelope => { + const properties = node.properties; + return { + id: properties.id, + ontology: properties.ontology, + value: deserializeValue( + properties.value, + properties.valueType, + ) as T[keyof T], + valueType: properties.valueType, + }; + }); + + const parsed = envelopes.reduce( + (acc: T, envelope: Envelope) => { + (acc as any)[envelope.ontology] = envelope.value; + return acc; + }, + {} as T, + ); + + return { + id: record.get("id"), + ontology: record.get("ontology"), + acl: record.get("acl"), + envelopes, + parsed, + }; + }); + } + + /** + * Finds a meta-envelope by its ID. + * @param id - The ID of the meta-envelope to find + * @returns The meta-envelope with all its envelopes and parsed payload, or null if not found + */ + async findMetaEnvelopeById< + T extends Record = Record, + >(id: string): Promise | null> { + const result = await this.runQuery( + ` + MATCH (m:MetaEnvelope { id: $id })-[:LINKS_TO]->(e:Envelope) + RETURN m.id AS id, m.ontology AS ontology, m.acl AS acl, collect(e) AS envelopes + `, + { id }, + ); + + if (!result.records[0]) return null; + + const record = result.records[0]; + const envelopes = record + .get("envelopes") + .map((node: any): Envelope => { + const properties = node.properties; + return { + id: properties.id, + ontology: properties.ontology, + value: deserializeValue( + properties.value, + properties.valueType, + ) as T[keyof T], + valueType: properties.valueType, + }; + }); + + const parsed = envelopes.reduce( + (acc: T, envelope: Envelope) => { + (acc as any)[envelope.ontology] = envelope.value; + return acc; + }, + {} as T, + ); + + return { + id: record.get("id"), + ontology: record.get("ontology"), + acl: record.get("acl"), + envelopes, + parsed, + }; + } + + /** + * Finds all meta-envelope IDs for a given ontology. + * @param ontology - The ontology to search for + * @returns Array of meta-envelope IDs + */ + async findMetaEnvelopesByOntology(ontology: string): Promise { + const result = await this.runQuery( + ` + MATCH (m:MetaEnvelope { ontology: $ontology }) + RETURN m.id AS id + `, + { ontology }, + ); + + return result.records.map((r) => r.get("id")); + } + + /** + * Deletes a meta-envelope and all its associated envelopes. + * @param id - The ID of the meta-envelope to delete + */ + async deleteMetaEnvelope(id: string): Promise { + await this.runQuery( + ` + MATCH (m:MetaEnvelope { id: $id })-[:LINKS_TO]->(e:Envelope) + DETACH DELETE m, e + `, + { id }, + ); + } + + /** + * Updates the value of an envelope. + * @param envelopeId - The ID of the envelope to update + * @param newValue - The new value to set + */ + async updateEnvelopeValue( + envelopeId: string, + newValue: T, + ): Promise { + const { value: storedValue, type: valueType } = + serializeValue(newValue); + + await this.runQuery( + ` + MATCH (e:Envelope { id: $envelopeId }) + SET e.value = $newValue, e.valueType = $valueType + `, + { envelopeId, newValue: storedValue, valueType }, + ); + } + + /** + * Retrieves all envelopes in the system. + * @returns Array of all envelopes + */ + async getAllEnvelopes(): Promise> { + const result = await this.runQuery(`MATCH (e:Envelope) RETURN e`, {}); + return result.records.map((r): Envelope => { + const node = r.get("e"); + const properties = node.properties; + return { + id: properties.id, + ontology: properties.ontology, + value: deserializeValue( + properties.value, + properties.valueType, + ) as T, + valueType: properties.valueType, + }; + }); + } + + /** + * Closes the database connection. + */ + async close(): Promise { + await this.driver.close(); + } +} diff --git a/infrastructure/evault-core/src/db/schema.ts b/infrastructure/evault-core/src/db/schema.ts new file mode 100644 index 00000000..995da720 --- /dev/null +++ b/infrastructure/evault-core/src/db/schema.ts @@ -0,0 +1,84 @@ +import { JSONSchema7 } from "json-schema"; + +export type SchemaType = { + schema: JSONSchema7; + deserialize: (value: any) => any; +}; + +export const SchemaTypes: Record = { + date: { + schema: { + type: "string", + format: "date-time", + }, + deserialize: (value: string) => new Date(value), + }, + number: { + schema: { + type: "number", + }, + deserialize: (value: number) => value, + }, + string: { + schema: { + type: "string", + }, + deserialize: (value: string) => value, + }, + boolean: { + schema: { + type: "boolean", + }, + deserialize: (value: boolean) => value, + }, + array: { + schema: { + type: "array", + }, + deserialize: (value: any[]) => value, + }, + object: { + schema: { + type: "object", + }, + deserialize: (value: Record) => value, + }, +}; + +export function getSchemaType(value: any): SchemaType { + if (value instanceof Date) return SchemaTypes.date; + if (Array.isArray(value)) return SchemaTypes.array; + if (typeof value === "object" && value !== null) return SchemaTypes.object; + if (typeof value === "number") return SchemaTypes.number; + if (typeof value === "boolean") return SchemaTypes.boolean; + return SchemaTypes.string; +} + +export function serializeValue(value: any): { value: any; type: string } { + const type = getSchemaType(value); + let serializedValue = value; + + if (type === SchemaTypes.date) { + serializedValue = value.toISOString(); + } else if (type === SchemaTypes.object) { + serializedValue = JSON.stringify(value); + } + + return { + value: serializedValue, + type: + Object.keys(SchemaTypes).find((key) => SchemaTypes[key] === type) || + "string", + }; +} + +export function deserializeValue(value: any, type: string): any { + const schemaType = SchemaTypes[type]; + if (!schemaType) return value; + + if (type === "object") { + return JSON.parse(value); + } + + return schemaType.deserialize(value); +} diff --git a/infrastructure/evault-core/src/db/types.ts b/infrastructure/evault-core/src/db/types.ts new file mode 100644 index 00000000..1b79fd52 --- /dev/null +++ b/infrastructure/evault-core/src/db/types.ts @@ -0,0 +1,59 @@ +/** + * Represents a meta-envelope that contains multiple envelopes of data. + */ +export type MetaEnvelope = Record> = + { + ontology: string; + payload: T; + acl: string[]; + }; + +/** + * Represents an individual envelope containing a single piece of data. + */ +export type Envelope = { + id: string; + value: T; + ontology: string; + valueType: string; +}; + +/** + * Base result type for all database operations that return a meta-envelope. + * Includes the parsed payload structure reconstructed from the envelopes. + */ +export type MetaEnvelopeResult< + T extends Record = Record, +> = { + id: string; + ontology: string; + acl: string[]; + envelopes: Envelope[]; + parsed: T; +}; + +/** + * Result type for storing a new meta-envelope. + */ +export type StoreMetaEnvelopeResult< + T extends Record = Record, +> = { + metaEnvelope: { + id: string; + ontology: string; + acl: string[]; + }; + envelopes: Envelope[]; +}; + +/** + * Result type for searching meta-envelopes. + */ +export type SearchMetaEnvelopesResult< + T extends Record = Record, +> = MetaEnvelopeResult[]; + +/** + * Result type for retrieving all envelopes. + */ +export type GetAllEnvelopesResult = Envelope[]; diff --git a/infrastructure/evault-core/src/evault.ts b/infrastructure/evault-core/src/evault.ts new file mode 100644 index 00000000..7a930b6c --- /dev/null +++ b/infrastructure/evault-core/src/evault.ts @@ -0,0 +1,12 @@ +import neo4j from "neo4j-driver"; +import { DbService } from "./db/db.service"; +import { GraphQLServer } from "./protocol/graphql-server"; + +async function startEVault() { + const uri = `bolt://localhost:7687`; + const driver = neo4j.driver(uri, neo4j.auth.basic("neo4j", "testpass")); + const dbService = new DbService(driver); + new GraphQLServer(dbService); +} + +startEVault(); diff --git a/infrastructure/evault-core/src/protocol/graphql-server.ts b/infrastructure/evault-core/src/protocol/graphql-server.ts new file mode 100644 index 00000000..d0696cf5 --- /dev/null +++ b/infrastructure/evault-core/src/protocol/graphql-server.ts @@ -0,0 +1,138 @@ +import { createSchema, createYoga, YogaInitialContext } from "graphql-yoga"; +import { createServer } from "http"; +import { typeDefs } from "./typedefs"; +import { renderVoyagerPage } from "graphql-voyager/middleware"; +import { getJWTHeader } from "w3id"; +import { DbService } from "../db/db.service"; +import { VaultAccessGuard, VaultContext } from "./vault-access-guard"; +import { GraphQLSchema } from "graphql"; + +export class GraphQLServer { + private db: DbService; + private accessGuard: VaultAccessGuard; + private schema: GraphQLSchema = createSchema({ + typeDefs, + resolvers: {}, + }); + + constructor(db: DbService) { + this.db = db; + this.accessGuard = new VaultAccessGuard(db); + this.instantiateServer(); + } + + public getSchema(): GraphQLSchema { + return this.schema; + } + + private instantiateServer() { + const resolvers = { + JSON: require("graphql-type-json"), + + Query: { + getMetaEnvelopeById: this.accessGuard.middleware( + (_: any, { id }: { id: string }) => { + return this.db.findMetaEnvelopeById(id); + } + ), + findMetaEnvelopesByOntology: this.accessGuard.middleware( + (_: any, { ontology }: { ontology: string }) => { + return this.db.findMetaEnvelopesByOntology(ontology); + } + ), + searchMetaEnvelopes: this.accessGuard.middleware( + (_: any, { ontology, term }: { ontology: string; term: string }) => { + return this.db.findMetaEnvelopesBySearchTerm(ontology, term); + } + ), + getAllEnvelopes: this.accessGuard.middleware(() => { + return this.db.getAllEnvelopes(); + }), + }, + + Mutation: { + storeMetaEnvelope: this.accessGuard.middleware( + async ( + _: any, + { + input, + }: { + input: { + ontology: string; + payload: any; + acl: string[]; + }; + } + ) => { + const result = await this.db.storeMetaEnvelope( + { + ontology: input.ontology, + payload: input.payload, + acl: input.acl, + }, + input.acl + ); + return result; + } + ), + deleteMetaEnvelope: this.accessGuard.middleware( + async (_: any, { id }: { id: string }) => { + await this.db.deleteMetaEnvelope(id); + return true; + } + ), + updateEnvelopeValue: this.accessGuard.middleware( + async ( + _: any, + { envelopeId, newValue }: { envelopeId: string; newValue: any } + ) => { + await this.db.updateEnvelopeValue(envelopeId, newValue); + return true; + } + ), + }, + }; + + this.schema = createSchema({ + typeDefs, + resolvers, + }); + + const yoga = createYoga({ + schema: this.schema, + context: async ({ request }) => { + const authHeader = request.headers.get("authorization") ?? ""; + const token = authHeader.replace("Bearer ", ""); + + if (token) { + const id = getJWTHeader(token).kid?.split("#")[0]; + return { + currentUser: id ?? null, + }; + } + + return { + currentUser: null, + }; + }, + }); + + const server = createServer((req, res) => { + if (req.url === "/voyager") { + res.writeHead(200, { "Content-Type": "text/html" }); + res.end( + renderVoyagerPage({ + endpointUrl: "/graphql", + }) + ); + } else { + yoga(req, res); + } + }); + + server.listen(4000, () => { + console.log("🚀 GraphQL at http://localhost:4000/graphql"); + console.log("🛰️ Voyager at http://localhost:4000/voyager"); + }); + } +} diff --git a/infrastructure/evault-core/src/protocol/typedefs.ts b/infrastructure/evault-core/src/protocol/typedefs.ts new file mode 100644 index 00000000..2fb6fdde --- /dev/null +++ b/infrastructure/evault-core/src/protocol/typedefs.ts @@ -0,0 +1,42 @@ +// GraphQL Schema Definition +export const typeDefs = /* GraphQL */ ` + scalar JSON + + type Envelope { + id: String! + ontology: String! + value: JSON + valueType: String + } + + type MetaEnvelope { + id: String! + ontology: String! + envelopes: [Envelope!]! + parsed: JSON + } + + type StoreMetaEnvelopeResult { + metaEnvelope: MetaEnvelope! + envelopes: [Envelope!]! + } + + type Query { + getMetaEnvelopeById(id: String!): MetaEnvelope + findMetaEnvelopesByOntology(ontology: String!): [String!]! + searchMetaEnvelopes(ontology: String!, term: String!): [MetaEnvelope!]! + getAllEnvelopes: [Envelope!]! + } + + input MetaEnvelopeInput { + ontology: String! + payload: JSON! + acl: [String!]! + } + + type Mutation { + storeMetaEnvelope(input: MetaEnvelopeInput!): StoreMetaEnvelopeResult! + deleteMetaEnvelope(id: String!): Boolean! + updateEnvelopeValue(envelopeId: String!, newValue: JSON!): Boolean! + } +`; diff --git a/infrastructure/evault-core/src/protocol/vault-access-guard.ts b/infrastructure/evault-core/src/protocol/vault-access-guard.ts new file mode 100644 index 00000000..8c77589f --- /dev/null +++ b/infrastructure/evault-core/src/protocol/vault-access-guard.ts @@ -0,0 +1,116 @@ +import { YogaInitialContext } from "graphql-yoga"; +import { DbService } from "../db/db.service"; + +export type VaultContext = YogaInitialContext & { + currentUser: string | null; +}; + +export class VaultAccessGuard { + constructor(private db: DbService) {} + + /** + * Checks if the current user has access to a meta envelope based on its ACL + * @param metaEnvelopeId - The ID of the meta envelope to check access for + * @param context - The GraphQL context containing the current user + * @returns Promise - Whether the user has access + */ + private async checkAccess( + metaEnvelopeId: string, + context: VaultContext, + ): Promise { + if (!context.currentUser) { + return false; + } + + const metaEnvelope = await this.db.findMetaEnvelopeById(metaEnvelopeId); + if (!metaEnvelope) { + return false; + } + + // If ACL contains "*", anyone can access + if (metaEnvelope.acl.includes("*")) { + return true; + } + + // Check if the current user's ID is in the ACL + return metaEnvelope.acl.includes(context.currentUser); + } + + /** + * Filters out ACL from meta envelope responses + * @param metaEnvelope - The meta envelope to filter + * @returns The filtered meta envelope without ACL + */ + private filterACL(metaEnvelope: any) { + if (!metaEnvelope) return null; + const { acl, ...filtered } = metaEnvelope; + return filtered; + } + + /** + * Filters a list of meta envelopes to only include those the user has access to + * @param envelopes - List of meta envelopes to filter + * @param context - The GraphQL context containing the current user + * @returns Promise - Filtered list of meta envelopes + */ + private async filterEnvelopesByAccess( + envelopes: any[], + context: VaultContext, + ): Promise { + if (!context.currentUser) { + return []; + } + + const filteredEnvelopes = []; + for (const envelope of envelopes) { + const hasAccess = await this.checkAccess(envelope.id, context); + if (hasAccess) { + filteredEnvelopes.push(this.filterACL(envelope)); + } + } + return filteredEnvelopes; + } + + /** + * Middleware function to check access before executing a resolver + * @param resolver - The resolver function to wrap + * @returns A wrapped resolver that checks access before executing + */ + public middleware( + resolver: ( + parent: T, + args: Args, + context: VaultContext, + ) => Promise, + ) { + return async (parent: T, args: Args, context: VaultContext) => { + // For operations that don't require a specific meta envelope ID (bulk queries) + if (!args.id && !args.envelopeId) { + const result = await resolver(parent, args, context); + + // If the result is an array of meta envelopes, filter based on access + if (Array.isArray(result)) { + return this.filterEnvelopesByAccess(result, context); + } + + // If the result is a single meta envelope, filter ACL + return this.filterACL(result); + } + + // For operations that target a specific meta envelope + const metaEnvelopeId = args.id || args.envelopeId; + if (!metaEnvelopeId) { + const result = await resolver(parent, args, context); + return this.filterACL(result); + } + + const hasAccess = await this.checkAccess(metaEnvelopeId, context); + if (!hasAccess) { + throw new Error("Access denied"); + } + + const result = await resolver(parent, args, context); + return this.filterACL(result); + }; + } +} diff --git a/infrastructure/evault-core/src/types/w3id.ts b/infrastructure/evault-core/src/types/w3id.ts new file mode 100644 index 00000000..c11bde21 --- /dev/null +++ b/infrastructure/evault-core/src/types/w3id.ts @@ -0,0 +1,15 @@ +export interface StorageSpec { + get(key: string): Promise; + set(key: string, value: string): Promise; + delete(key: string): Promise; + list(prefix: string): Promise; + create(data: T): Promise; + findOne(query: Partial): Promise; + findMany(query: Partial): Promise; +} + +export interface Signer { + sign(message: string): Promise; + pubKey: string; + alg: string; +} diff --git a/infrastructure/evault-core/tests/evault.spec.ts b/infrastructure/evault-core/tests/evault.spec.ts new file mode 100644 index 00000000..b78b2726 --- /dev/null +++ b/infrastructure/evault-core/tests/evault.spec.ts @@ -0,0 +1,221 @@ +// ✅ Full aligned test suite for eVault +import { describe, it, expect, beforeAll, afterAll } from "vitest"; +import { createYoga } from "graphql-yoga"; +import { createServer } from "http"; +import neo4j from "neo4j-driver"; +import { DbService } from "../src/db/db.service"; +import { GraphQLServer } from "../src/protocol/graphql-server"; +import { W3IDBuilder } from "w3id"; +import { VaultContext } from "../src/protocol/vault-access-guard"; +import { MockStorage } from "./utils/mock-storage"; +import { createMockSigner } from "./utils/mock-signer"; +import { Neo4jContainer } from "@testcontainers/neo4j"; +import { createServer as createNetServer } from "net"; + +async function getFreePort() { + return new Promise((resolve, reject) => { + const server = createNetServer(); + server.listen(0, () => { + const address = server.address(); + if (address && typeof address === "object") { + server.close(() => resolve(address.port)); + } else { + server.close(() => reject(new Error("No port found"))); + } + }); + }); +} + +describe("eVault E2E", () => { + let server; + let dbService; + let driver; + let w3id; + let testEnvelopeId; + + const testOntology = "SocialMediaPost"; + const testPayload = { + text: "gm world", + dateCreated: new Date().toISOString(), + }; + + beforeAll(async () => { + const container = await new Neo4jContainer("neo4j:5.15").start(); + const uri = `bolt://localhost:${container.getMappedPort(7687)}`; + driver = neo4j.driver( + uri, + neo4j.auth.basic(container.getUsername(), container.getPassword()), + ); + dbService = new DbService(driver); + + const signer = createMockSigner(); + const repo = new MockStorage(); + w3id = await new W3IDBuilder() + .withSigner(signer) + .withRepository(repo) + .withNextKeyHash("x") + .build(); + + const yoga = createYoga({ + schema: new GraphQLServer(dbService).getSchema(), + context: async ({ request }) => { + const authHeader = request.headers.get("authorization") ?? ""; + const token = authHeader.replace("Bearer ", ""); + return { + currentUser: token ? w3id.id : null, + } satisfies VaultContext; + }, + }); + + const httpServer = createServer(yoga); + const port = await getFreePort(); + await new Promise((resolve) => httpServer.listen(port, resolve)); + server = httpServer; + }); + + afterAll(async () => { + await server.close(); + await driver.close(); + }); + + const executeGraphQL = async (query, variables = {}, token) => { + const res = await fetch("http://localhost:4000/graphql", { + method: "POST", + headers: { + "Content-Type": "application/json", + ...(token ? { Authorization: `Bearer ${token}` } : {}), + }, + body: JSON.stringify({ query, variables }), + }); + return res.json(); + }; + + it("should store and retrieve a meta envelope", async () => { + const token = await w3id.signJWT({ sub: w3id.id }); + + const store = await executeGraphQL( + `mutation Store($input: MetaEnvelopeInput!) { + storeMetaEnvelope(input: $input) { + metaEnvelope { id ontology parsed } + envelopes { id ontology value valueType } + } + }`, + { + input: { + ontology: testOntology, + payload: testPayload, + acl: ["*"], + }, + }, + token, + ); + + expect(store.errors).toBeUndefined(); + testEnvelopeId = store.data.storeMetaEnvelope.metaEnvelope.id; + + const read = await executeGraphQL( + `query Read($id: String!) { + getMetaEnvelopeById(id: $id) { + id ontology parsed envelopes { id ontology value } + } + }`, + { id: testEnvelopeId }, + token, + ); + + expect(read.errors).toBeUndefined(); + expect(read.data.getMetaEnvelopeById.ontology).toBe(testOntology); + expect(read.data.getMetaEnvelopeById.parsed.text).toBe("gm world"); + }); + + it("should reject unauthorized access", async () => { + const otherSigner = createMockSigner(); + const otherRepo = new MockStorage(); + const other = await new W3IDBuilder() + .withSigner(otherSigner) + .withRepository(otherRepo) + .withNextKeyHash("z") + .build(); + const otherToken = await other.signJWT({ sub: other.id }); + + const result = await executeGraphQL( + `query Read($id: String!) { + getMetaEnvelopeById(id: $id) { id } + }`, + { id: testEnvelopeId }, + otherToken, + ); + + expect(result.data.getMetaEnvelopeById).toBeNull(); + }); + + it("should allow wildcard ACL read", async () => { + const token = await w3id.signJWT({ sub: w3id.id }); + + const store = await executeGraphQL( + `mutation Store($input: MetaEnvelopeInput!) { + storeMetaEnvelope(input: $input) { + metaEnvelope { id } + } + }`, + { + input: { + ontology: testOntology, + payload: testPayload, + acl: ["*"], + }, + }, + token, + ); + + const id = store.data.storeMetaEnvelope.metaEnvelope.id; + + const readerSigner = createMockSigner(); + const reader = await new W3IDBuilder() + .withSigner(readerSigner) + .withRepository(new MockStorage()) + .withNextKeyHash("r") + .build(); + const readerToken = await reader.signJWT({ sub: reader.id }); + + const result = await executeGraphQL( + `query Read($id: String!) { + getMetaEnvelopeById(id: $id) { id ontology parsed } + }`, + { id }, + readerToken, + ); + + expect(result.errors).toBeUndefined(); + expect(result.data.getMetaEnvelopeById.id).toBe(id); + }); + + it("should search meta envelopes by term", async () => { + const token = await w3id.signJWT({ sub: w3id.id }); + const term = "searchable"; + await executeGraphQL( + `mutation Store($input: MetaEnvelopeInput!) { + storeMetaEnvelope(input: $input) { metaEnvelope { id } } + }`, + { + input: { + ontology: "search-test", + payload: { note: term }, + acl: ["*"], + }, + }, + token, + ); + + const result = await executeGraphQL( + `query Search($ontology: String!, $term: String!) { + searchMetaEnvelopes(ontology: $ontology, term: $term) { id parsed } + }`, + { ontology: "search-test", term }, + token, + ); + + expect(result.errors).toBeUndefined(); + expect(result.data.searchMetaEnvelopes[0].parsed.note).toBe(term); + }); +}); diff --git a/infrastructure/evault-core/tests/utils/mock-signer.ts b/infrastructure/evault-core/tests/utils/mock-signer.ts new file mode 100644 index 00000000..995827b4 --- /dev/null +++ b/infrastructure/evault-core/tests/utils/mock-signer.ts @@ -0,0 +1,12 @@ +import { Signer } from "../../src/types/w3id"; + +export function createMockSigner(alg: string = "ed25519"): Signer { + return { + sign: async (message: string): Promise => { + // Mock signature - in a real implementation this would be a proper signature + return Buffer.from(message).toString("base64url"); + }, + pubKey: "mock-public-key", + alg, + }; +} diff --git a/infrastructure/evault-core/tests/utils/mock-storage.ts b/infrastructure/evault-core/tests/utils/mock-storage.ts new file mode 100644 index 00000000..c380fb6d --- /dev/null +++ b/infrastructure/evault-core/tests/utils/mock-storage.ts @@ -0,0 +1,60 @@ +import { StorageSpec } from "../../src/types/w3id"; + +export class MockStorage implements StorageSpec { + private store: Map = new Map(); + private dataStore: Map = new Map(); + + async get(key: string): Promise { + return this.store.get(key) ?? null; + } + + async set(key: string, value: string): Promise { + this.store.set(key, value); + } + + async delete(key: string): Promise { + this.store.delete(key); + } + + async list(prefix: string): Promise { + return Array.from(this.store.keys()).filter((key) => + key.startsWith(prefix) + ); + } + + async create(data: T): Promise { + const id = Math.random().toString(36).substring(7); + this.dataStore.set(id, data); + return data as unknown as U; + } + + async findOne(query: Partial): Promise { + for (const [_, data] of this.dataStore) { + if (this.matchesQuery(data, query)) { + return data as unknown as U; + } + } + return null; + } + + async findMany(query: Partial): Promise { + const results: U[] = []; + for (const [_, data] of this.dataStore) { + if (this.matchesQuery(data, query)) { + results.push(data as unknown as U); + } + } + return results; + } + + private matchesQuery(data: T, query: Partial): boolean { + return Object.entries(query).every(([key, value]) => { + return (data as any)[key] === value; + }); + } + + clear(): void { + this.store.clear(); + this.dataStore.clear(); + } +} diff --git a/infrastructure/evault-core/tsconfig.json b/infrastructure/evault-core/tsconfig.json new file mode 100644 index 00000000..90d4ef20 --- /dev/null +++ b/infrastructure/evault-core/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2017", + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "declaration": true, + "declarationDir": "./dist/types", + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "Node", + "skipLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/infrastructure/evault-core/vitest.config.ts b/infrastructure/evault-core/vitest.config.ts new file mode 100644 index 00000000..0fb5c2c2 --- /dev/null +++ b/infrastructure/evault-core/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globals: true, + environment: "node", + testTimeout: 60000, + hookTimeout: 60000, + watch: false, + }, +}); diff --git a/infrastructure/w3id/src/index.ts b/infrastructure/w3id/src/index.ts index 5e7cb997..050b81ea 100644 --- a/infrastructure/w3id/src/index.ts +++ b/infrastructure/w3id/src/index.ts @@ -1,8 +1,9 @@ +import { v4 as uuidv4 } from "uuid"; import { IDLogManager } from "./logs/log-manager"; -import type { LogEvent, Signer } from "./logs/log.types"; +import type { JWTHeader, JWTPayload, LogEvent, Signer } from "./logs/log.types"; import type { StorageSpec } from "./logs/storage/storage-spec"; +import { signJWT } from "./utils/jwt"; import { generateRandomAlphaNum } from "./utils/rand"; -import { v4 as uuidv4 } from "uuid"; import { generateUuid } from "./utils/uuid"; export class W3ID { @@ -10,6 +11,22 @@ export class W3ID { public id: string, public logs?: IDLogManager, ) {} + + /** + * Signs a JWT with the W3ID's signer + * @param payload - The JWT payload + * @param header - Optional JWT header (defaults to using the signer's alg and W3ID's id as kid) + * @returns The signed JWT + */ + public async signJWT( + payload: JWTPayload, + header?: JWTHeader, + ): Promise { + if (!this.logs?.signer) { + throw new Error("W3ID must have a signer to sign JWTs"); + } + return signJWT(this.logs.signer, payload, `@${this.id}#0`, header); + } } export class W3IDBuilder { @@ -119,3 +136,5 @@ export class W3IDBuilder { return new W3ID(id, logs); } } + +export * from "./utils/jwt"; diff --git a/infrastructure/w3id/src/logs/log-manager.ts b/infrastructure/w3id/src/logs/log-manager.ts index 97a7d90f..1c5c2b75 100644 --- a/infrastructure/w3id/src/logs/log-manager.ts +++ b/infrastructure/w3id/src/logs/log-manager.ts @@ -9,14 +9,14 @@ import { import { isSubsetOf } from "../utils/array"; import { hash } from "../utils/hash"; import { - isGenesisOptions, - isRotationOptions, - type Signer, type CreateLogEventOptions, type GenesisLogOptions, type LogEvent, type RotationLogOptions, + type Signer, type VerifierCallback, + isGenesisOptions, + isRotationOptions, } from "./log.types"; import type { StorageSpec } from "./storage/storage-spec"; diff --git a/infrastructure/w3id/src/logs/log.types.ts b/infrastructure/w3id/src/logs/log.types.ts index a5c1636d..3f5b871f 100644 --- a/infrastructure/w3id/src/logs/log.types.ts +++ b/infrastructure/w3id/src/logs/log.types.ts @@ -14,9 +14,27 @@ export type VerifierCallback = ( pubKey: string, ) => Promise; +export type JWTHeader = { + alg: string; + typ: "JWT"; + kid?: string; +}; + +export type JWTPayload = { + [key: string]: unknown; + iat?: number; + exp?: number; + nbf?: number; + iss?: string; + sub?: string; + aud?: string; + jti?: string; +}; + export type Signer = { sign: (message: string) => Promise | string; pubKey: string; + alg: string; }; export type RotationLogOptions = { diff --git a/infrastructure/w3id/src/utils/jwt.ts b/infrastructure/w3id/src/utils/jwt.ts new file mode 100644 index 00000000..c163f937 --- /dev/null +++ b/infrastructure/w3id/src/utils/jwt.ts @@ -0,0 +1,99 @@ +import type { JWTHeader, JWTPayload, Signer } from "../logs/log.types"; + +/** + * Encodes a string to base64url format + */ +function base64urlEncode(str: string): string { + return Buffer.from(str) + .toString("base64") + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=/g, ""); +} + +/** + * Decodes a base64url string + */ +function base64urlDecode(str: string): string { + return Buffer.from( + str.replace(/-/g, "+").replace(/_/g, "/"), + "base64", + ).toString(); +} + +/** + * Creates a JWT from the given header and payload + * @param header - The JWT header + * @param payload - The JWT payload + * @returns The unsigned JWT + */ +export function createJWT(header: JWTHeader, payload: JWTPayload): string { + const encodedHeader = base64urlEncode(JSON.stringify(header)); + const encodedPayload = base64urlEncode(JSON.stringify(payload)); + return `${encodedHeader}.${encodedPayload}`; +} + +/** + * Signs a JWT using the provided signer + * @param signer - The signer to use + * @param payload - The JWT payload + * @param kid - The key ID to use in the JWT header + * @param header - Optional JWT header (defaults to using the signer's alg and provided kid) + * @returns The signed JWT + */ +export async function signJWT( + signer: Signer, + payload: JWTPayload, + kid: string, + header?: JWTHeader, +): Promise { + const jwtHeader = header || { + alg: signer.alg, + typ: "JWT", + kid, + }; + const jwt = createJWT(jwtHeader, payload); + const signature = await signer.sign(jwt); + return `${jwt}.${signature}`; +} + +/** + * Verifies a JWT signature + * @param jwt - The JWT to verify + * @param signature - The signature to verify against + * @param verifier - The verification function + * @param pubKey - The public key to verify with + * @returns True if the signature is valid, false otherwise + */ +export async function verifyJWT( + jwt: string, + signature: string, + verifier: ( + message: string, + signature: string, + pubKey: string, + ) => Promise, + pubKey: string, +): Promise { + return verifier(jwt, signature, pubKey); +} + +/** + * Extracts the header from a JWT + * @param jwt - The JWT to extract from + * @returns The JWT header + */ +export function getJWTHeader(jwt: string): JWTHeader { + const [header] = jwt.split("."); + return JSON.parse(base64urlDecode(header)); +} + +/** + * Extracts the payload from a JWT + * @param jwt - The JWT to extract from + * @returns The JWT payload + */ +export function getJWTPayload(jwt: string): JWTPayload { + const [, payload] = jwt.split("."); + return JSON.parse(base64urlDecode(payload)); +} diff --git a/infrastructure/w3id/tests/utils/crypto.ts b/infrastructure/w3id/tests/utils/crypto.ts index 6c9de1fb..bd4f249b 100644 --- a/infrastructure/w3id/tests/utils/crypto.ts +++ b/infrastructure/w3id/tests/utils/crypto.ts @@ -27,6 +27,7 @@ export const verifierCallback: VerifierCallback = async ( export function createSigner(keyPair: nacl.SignKeyPair): Signer { const publicKey = uint8ArrayToHex(keyPair.publicKey); const signer: Signer = { + alg: "ed25519", pubKey: publicKey, sign: (str: string) => { const buffer = stringToUint8Array(str); diff --git a/infrastructure/w3id/tests/utils/jwt.test.ts b/infrastructure/w3id/tests/utils/jwt.test.ts new file mode 100644 index 00000000..87541fe9 --- /dev/null +++ b/infrastructure/w3id/tests/utils/jwt.test.ts @@ -0,0 +1,162 @@ +import { describe, it, expect } from "vitest"; +import { + signJWT, + createJWT, + getJWTHeader, + getJWTPayload, + verifyJWT, +} from "../../src/utils/jwt"; +import type { JWTPayload, JWTHeader, Signer } from "../../src/logs/log.types"; + +describe("JWT Utils", () => { + const mockSigner: Signer = { + sign: (message: string) => Buffer.from(message).toString("base64url"), + pubKey: "mock-public-key", + alg: "ES256", + }; + + const mockPayload = { + sub: "test-subject", + iat: Math.floor(Date.now() / 1000), + }; + + describe("createJWT", () => { + it("should create a valid JWT string", () => { + const header: JWTHeader = { + alg: "ES256", + typ: "JWT", + kid: "test-key-1", + }; + const payload: JWTPayload = { + sub: "user123", + iat: 1234567890, + exp: 1234567890 + 3600, + }; + + const jwt = createJWT(header, payload); + const [headerPart, payloadPart] = jwt.split("."); + + expect(headerPart).toBeDefined(); + expect(payloadPart).toBeDefined(); + expect(jwt).not.toContain("="); // No padding + expect(jwt).not.toContain("+"); // No plus signs + expect(jwt).not.toContain("/"); // No slashes + }); + }); + + describe("signJWT", () => { + it("should create a valid JWT with the correct structure", async () => { + const kid = "test-kid"; + const jwt = await signJWT(mockSigner, mockPayload, kid); + + expect(jwt).toBeDefined(); + expect(jwt.split(".")).toHaveLength(3); + + const [header, payload, signature] = jwt.split("."); + expect(header).toBeDefined(); + expect(payload).toBeDefined(); + expect(signature).toBeDefined(); + }); + + it("should include kid in the header when provided", async () => { + const kid = "test-kid"; + const jwt = await signJWT(mockSigner, mockPayload, kid); + const header = getJWTHeader(jwt); + + expect(header.kid).toBe(kid); + expect(header.alg).toBe(mockSigner.alg); + }); + + it("should use custom header if provided", async () => { + const customHeader: JWTHeader = { + alg: "RS256", + typ: "JWT", + kid: "custom-key", + }; + + const signedJWT = await signJWT( + mockSigner, + mockPayload, + "test-key-1", + customHeader + ); + const header = getJWTHeader(signedJWT); + + expect(header).toEqual(customHeader); + }); + }); + + describe("getJWTHeader", () => { + it("should correctly extract and parse the header", async () => { + const kid = "test-kid"; + const jwt = await signJWT(mockSigner, mockPayload, kid); + const header = getJWTHeader(jwt); + + expect(header).toEqual({ + alg: mockSigner.alg, + typ: "JWT", + kid, + }); + }); + }); + + describe("getJWTPayload", () => { + it("should correctly extract and parse the payload", async () => { + const jwt = await signJWT(mockSigner, mockPayload, "test-kid"); + const payload = getJWTPayload(jwt); + + expect(payload).toEqual(mockPayload); + }); + }); + + describe("verifyJWT", () => { + it("should verify a valid JWT", async () => { + const jwt = await signJWT(mockSigner, mockPayload, "test-kid"); + const [headerPayload, signature] = jwt.split("."); + + const mockVerifier = async ( + message: string, + sig: string, + pubKey: string + ) => { + expect(message).toBe(headerPayload); + expect(sig).toBe(signature); + expect(pubKey).toBe(mockSigner.pubKey); + return true; + }; + + const isValid = await verifyJWT( + headerPayload, + signature, + mockVerifier, + mockSigner.pubKey + ); + expect(isValid).toBe(true); + }); + + it("should reject a JWT with invalid signature", async () => { + const jwt = await signJWT(mockSigner, mockPayload, "test-kid"); + const [headerPayload, signature] = jwt.split("."); + const invalidSignature = signature.slice(0, -1) + "x"; // Tamper with the signature + + const mockVerifier = async ( + message: string, + sig: string, + pubKey: string + ) => { + expect(message).toBe(headerPayload); + expect(sig).toBe(invalidSignature); + expect(pubKey).toBe(mockSigner.pubKey); + return false; + }; + + const isValid = await verifyJWT( + headerPayload, + invalidSignature, + mockVerifier, + mockSigner.pubKey + ); + expect(isValid).toBe(false); + }); + }); +}); diff --git a/infrastructure/w3id/tests/w3id.test.ts b/infrastructure/w3id/tests/w3id.test.ts index 9266674c..0f179bf4 100644 --- a/infrastructure/w3id/tests/w3id.test.ts +++ b/infrastructure/w3id/tests/w3id.test.ts @@ -8,6 +8,8 @@ import { IDLogManager } from "../src/logs/log-manager"; import { hash } from "../src/utils/hash"; import { uint8ArrayToHex } from "../src/utils/codec"; import { LogEvent } from "../src/logs/log.types"; +import { getJWTHeader, getJWTPayload } from "../src/utils/jwt"; +import { JWTHeader } from "../src/logs/log.types"; const keyPair = nacl.sign.keyPair(); @@ -79,3 +81,77 @@ describe("W3IDBuilder", () => { expect(result).toBe(true); }); }); + +describe("W3ID JWT Signing", () => { + test("should sign JWT with W3ID's ID as kid", async () => { + const id = await new W3IDBuilder() + .withRepository(InMemoryStorage.build()) + .withSigner(createSigner(keyPair)) + .withNextKeyHash(falso.randText()) + .build(); + + const payload = { + sub: "test-subject", + iat: Math.floor(Date.now() / 1000), + }; + + const signedJWT = await id.signJWT(payload); + const header = getJWTHeader(signedJWT); + const extractedPayload = getJWTPayload(signedJWT); + + expect(header.kid).toBe(`@${id.id}#0`); + expect(header.alg).toBe("ed25519"); + expect(header.typ).toBe("JWT"); + expect(extractedPayload).toEqual(payload); + console.log(signedJWT); + }); + + test("should throw error when signing without a signer", async () => { + const id = await new W3IDBuilder().build(); + const payload = { sub: "test-subject" }; + + await expect(id.signJWT(payload)).rejects.toThrow( + "W3ID must have a signer to sign JWTs", + ); + }); + + test("should use custom header when provided", async () => { + const id = await new W3IDBuilder() + .withRepository(InMemoryStorage.build()) + .withSigner(createSigner(keyPair)) + .withNextKeyHash(falso.randText()) + .build(); + + const payload = { sub: "test-subject" }; + const customHeader: JWTHeader = { + alg: "ed25519", + typ: "JWT", + kid: "custom-key", + }; + + const signedJWT = await id.signJWT(payload, customHeader); + const header = getJWTHeader(signedJWT); + + expect(header).toEqual(customHeader); + }); + + test("should include all payload fields in signed JWT", async () => { + const id = await new W3IDBuilder() + .withRepository(InMemoryStorage.build()) + .withSigner(createSigner(keyPair)) + .withNextKeyHash(falso.randText()) + .build(); + + const payload = { + sub: "test-subject", + iat: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + 3600, + custom: "value", + }; + + const signedJWT = await id.signJWT(payload); + const extractedPayload = getJWTPayload(signedJWT); + + expect(extractedPayload).toEqual(payload); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ec4c707..4e51bfba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,7 +68,7 @@ importers: version: 8.6.7(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2) '@storybook/sveltekit': specifier: ^8.6.7 - version: 8.6.7(@babel/core@7.26.10)(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(postcss@8.5.3)(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + version: 8.6.7(@babel/core@7.26.10)(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(postcss@8.5.3)(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@storybook/test': specifier: ^8.6.7 version: 8.6.7(storybook@8.6.7(prettier@3.5.3)) @@ -77,13 +77,13 @@ importers: version: 0.2.2 '@sveltejs/adapter-static': specifier: ^3.0.6 - version: 3.0.8(@sveltejs/kit@2.20.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))) + version: 3.0.8(@sveltejs/kit@2.20.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))) '@sveltejs/kit': specifier: ^2.9.0 - version: 2.20.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + version: 2.20.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.0 - version: 5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + version: 5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@tailwindcss/forms': specifier: ^0.5.10 version: 0.5.10(tailwindcss@4.0.15) @@ -92,7 +92,7 @@ importers: version: 0.5.16(tailwindcss@4.0.15) '@tailwindcss/vite': specifier: ^4.0.14 - version: 4.0.15(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + version: 4.0.15(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@tauri-apps/cli': specifier: ^2 version: 2.3.1 @@ -101,7 +101,7 @@ importers: version: 22.13.10 '@vitest/browser': specifier: ^3.0.9 - version: 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.6.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))(vitest@3.0.9) + version: 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.6.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))(vitest@3.0.9) '@vitest/coverage-v8': specifier: ^3.0.9 version: 3.0.9(@vitest/browser@3.0.9)(vitest@3.0.9) @@ -137,12 +137,62 @@ importers: version: 5.6.3 vite: specifier: ^6.0.3 - version: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + version: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3)) - - infrastructure/evault-core: {} + version: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(tsx@4.19.3)(yaml@2.7.1) + + infrastructure/evault-core: + dependencies: + '@testcontainers/neo4j': + specifier: ^10.24.2 + version: 10.24.2 + graphql: + specifier: ^16.10.0 + version: 16.10.0 + graphql-type-json: + specifier: ^0.3.2 + version: 0.3.2(graphql@16.10.0) + graphql-voyager: + specifier: ^2.1.0 + version: 2.1.0(@types/react@19.0.12)(graphql@16.10.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + graphql-yoga: + specifier: ^5.13.4 + version: 5.13.4(graphql@16.10.0) + json-schema: + specifier: ^0.4.0 + version: 0.4.0 + neo4j-driver: + specifier: ^5.28.1 + version: 5.28.1 + w3id: + specifier: workspace:* + version: link:../w3id + devDependencies: + '@types/json-schema': + specifier: ^7.0.15 + version: 7.0.15 + '@types/node': + specifier: ^22.13.10 + version: 22.13.10 + dotenv: + specifier: ^16.5.0 + version: 16.5.0 + testcontainers: + specifier: ^10.24.2 + version: 10.24.2 + tsx: + specifier: ^4.19.3 + version: 4.19.3 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + uuid: + specifier: ^11.1.0 + version: 11.1.0 + vitest: + specifier: ^3.0.9 + version: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.3))(tsx@4.19.3)(yaml@2.7.1) infrastructure/w3id: dependencies: @@ -170,7 +220,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2)) + version: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2))(tsx@4.19.3)(yaml@2.7.1) packages/eslint-config: devDependencies: @@ -274,6 +324,10 @@ packages: resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.26.9': resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} @@ -286,6 +340,9 @@ packages: resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} engines: {node: '>=6.9.0'} + '@balena/dockerignore@1.0.2': + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -358,6 +415,72 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.13.3': + resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/styled@11.13.0': + resolution: {integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@envelop/core@5.2.3': + resolution: {integrity: sha512-KfoGlYD/XXQSc3BkM1/k15+JQbkQ4ateHazeZoWl9P71FsLTDXSjGy6j7QqfhpIDSbxNISqhPMfZHYSbDFOofQ==} + engines: {node: '>=18.0.0'} + + '@envelop/instrumentation@1.0.0': + resolution: {integrity: sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==} + engines: {node: '>=18.0.0'} + + '@envelop/types@5.2.1': + resolution: {integrity: sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==} + engines: {node: '>=18.0.0'} + '@esbuild/aix-ppc64@0.25.1': resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} engines: {node: '>=18'} @@ -550,6 +673,78 @@ packages: resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@fastify/busboy@3.1.1': + resolution: {integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==} + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@graphql-tools/executor@1.4.7': + resolution: {integrity: sha512-U0nK9jzJRP9/9Izf1+0Gggd6K6RNRsheFo1gC/VWzfnsr0qjcOSS9qTjY0OTC5iTPt4tQ+W5Zpw/uc7mebI6aA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/merge@9.0.24': + resolution: {integrity: sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/schema@10.0.23': + resolution: {integrity: sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/utils@10.8.6': + resolution: {integrity: sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-yoga/logger@2.0.1': + resolution: {integrity: sha512-Nv0BoDGLMg9QBKy9cIswQ3/6aKaKjlTh87x3GiBg2Z4RrjyrM48DvOOK0pJh1C1At+b0mUIM67cwZcFTDLN4sA==} + engines: {node: '>=18.0.0'} + + '@graphql-yoga/subscription@5.0.5': + resolution: {integrity: sha512-oCMWOqFs6QV96/NZRt/ZhTQvzjkGB4YohBOpKM4jH/lDT4qb7Lex/aGCxpi/JD9njw3zBBtMqxbaC22+tFHVvw==} + engines: {node: '>=18.0.0'} + + '@graphql-yoga/typed-event-target@3.0.2': + resolution: {integrity: sha512-ZpJxMqB+Qfe3rp6uszCQoag4nSw42icURnBRfFYSOmTgEeOe4rD0vYlbA8spvCu2TlCesNTlEN9BLWtQqLxabA==} + engines: {node: '>=18.0.0'} + + '@grpc/grpc-js@1.13.3': + resolution: {integrity: sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.14': + resolution: {integrity: sha512-oS0FyK8eGNBJC6aB/qsS4LOxCYQlBniNzp6W8IdjlRVRGs0FOK9dS84OV+kXGaZf8Ozeos8fbUMJUGGzSpOCzQ==} + engines: {node: '>=6'} + hasBin: true + '@hugeicons/core-free-icons@1.0.13': resolution: {integrity: sha512-H0TwkJmvYXdAeUYvNXdQ4b94Xv6vIxZu2aQK+8fnm6Gho74yDrLH9pNqLk931OY8pVvLxPgEOZEDtBO2aZacng==} @@ -644,6 +839,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@mdx-js/react@3.1.0': resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} peerDependencies: @@ -654,6 +852,132 @@ packages: resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} engines: {node: '>=18'} + '@mui/base@5.0.0-beta.40': + resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} + engines: {node: '>=12.0.0'} + deprecated: This package has been replaced by @base-ui-components/react + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/core-downloads-tracker@5.17.1': + resolution: {integrity: sha512-OcZj+cs6EfUD39IoPBOgN61zf1XFVY+imsGoBDwXeSq2UHJZE3N59zzBOVjclck91Ne3e9gudONOeILvHCIhUA==} + + '@mui/icons-material@5.16.7': + resolution: {integrity: sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/lab@5.0.0-alpha.169': + resolution: {integrity: sha512-h6xe1K6ISKUbyxTDgdvql4qoDP6+q8ad5fg9nXQxGLUrIeT2jVrBuT/jRECSTufbnhzP+V5kulvYxaMfM8rEdA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material': '>=5.15.0' + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/material@5.16.7': + resolution: {integrity: sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/private-theming@5.17.1': + resolution: {integrity: sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/styled-engine@5.16.14': + resolution: {integrity: sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + + '@mui/system@5.17.1': + resolution: {integrity: sha512-aJrmGfQpyF0U4D4xYwA6ueVtQcEMebET43CUmKMP7e7iFh3sMIF3sBR0l8Urb4pqx1CBjHAaWgB0ojpND4Q3Jg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/types@7.2.24': + resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/types@7.4.1': + resolution: {integrity: sha512-gUL8IIAI52CRXP/MixT1tJKt3SI6tVv4U/9soFsTtAsHzaJQptZ42ffdHZV3niX1ei0aUgMvOxBBN0KYqdG39g==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@5.17.1': + resolution: {integrity: sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@next/eslint-plugin-next@15.2.2': resolution: {integrity: sha512-1+BzokFuFQIfLaRxUKf2u5In4xhPV7tUgKcK53ywvFl6+LXHWHpFkcV7VNeKlyQKUotwiq4fy/aDNF9EiUp4RQ==} @@ -688,6 +1012,42 @@ packages: '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@repeaterjs/repeater@3.0.6': + resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} + '@rollup/rollup-android-arm-eabi@4.36.0': resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} cpu: [arm] @@ -1170,6 +1530,9 @@ packages: '@tauri-apps/plugin-opener@2.2.6': resolution: {integrity: sha512-bSdkuP71ZQRepPOn8BOEdBKYJQvl6+jb160QtJX/i2H9BF6ZySY/kYljh76N2Ne5fJMQRge7rlKoStYQY5Jq1w==} + '@testcontainers/neo4j@10.24.2': + resolution: {integrity: sha512-Bdhg0HPJYpvnp0PxqubbAITrf87pI5I3KxDAhjMzGdELFHgZltRK4NUNRaHs6R3q0V4vnyHD4Hooci9XA2tVgQ==} + '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} @@ -1200,6 +1563,12 @@ packages: '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/docker-modem@3.0.6': + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + + '@types/dockerode@3.3.38': + resolution: {integrity: sha512-nnrcfUe2iR+RyOuz0B4bZgQwD9djQa9ADEjp7OAgBs10pYT0KSCtplJjcmBDJz0qaReX5T7GbE5i4VplvzUHvA==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -1209,15 +1578,38 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/node@18.19.86': + resolution: {integrity: sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ==} + '@types/node@22.13.10': resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} + '@types/react-transition-group@4.4.12': + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' + '@types/react@19.0.12': resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==} + '@types/ssh2-streams@0.1.12': + resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} + + '@types/ssh2@0.5.52': + resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} + + '@types/ssh2@1.15.5': + resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==} + '@types/statuses@2.0.5': resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} @@ -1345,6 +1737,34 @@ packages: '@vitest/utils@3.0.9': resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} + '@whatwg-node/disposablestack@0.0.6': + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/events@0.1.2': + resolution: {integrity: sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/fetch@0.10.6': + resolution: {integrity: sha512-6uzhO2aQ757p3bSHcemA8C4pqEXuyBqyGAM7cYpO0c6/igRMV9As9XL0W12h5EPYMclgr7FgjmbVQBoWEdJ/yA==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.7.18': + resolution: {integrity: sha512-IxKdVWfZYasGiyxBcsROxq6FmDQu3MNNiOYJ/yqLKhe+Qq27IIWsK7ItbjS2M9L5aM5JxjWkIS7JDh7wnsn+CQ==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/promise-helpers@1.3.1': + resolution: {integrity: sha512-D+OwTEunoQhVHVToD80dPhfz9xgPLqJyEA3F5jCRM14A2u8tBBQVdZekqfqx6ZAfZ+POT4Hb0dn601UKMsvADw==} + engines: {node: '>=16.0.0'} + + '@whatwg-node/server@0.10.5': + resolution: {integrity: sha512-ydxzH1iox9AzLe+uaX9jjyVFkQO+h15j+JClropw0P4Vz+ES4+xTZVu5leUsWW8AYTVZBFkiC0iHl/PwFZ+Q1Q==} + engines: {node: '>=18.0.0'} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1386,6 +1806,14 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1427,6 +1855,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1439,6 +1870,12 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + autoprefixer@10.4.21: resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} @@ -1454,13 +1891,59 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + + bare-fs@4.1.2: + resolution: {integrity: sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.1: + resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + better-opn@3.0.2: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} engines: {node: '>=12.0.0'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1483,6 +1966,20 @@ packages: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} engines: {node: '>=8.0.0'} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} + engines: {node: '>=10.0.0'} + + byline@5.0.0: + resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} + engines: {node: '>=0.10.0'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1530,6 +2027,9 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chromatic@11.27.0: resolution: {integrity: sha512-jQ2ufjS+ePpg+NtcPI9B2eOi+pAzlRd2nhd1LgNMsVCC9Bzf5t8mJtyd8v2AUuJS0LdX0QVBgkOnlNv9xviHzA==} hasBin: true @@ -1561,9 +2061,20 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + commonmark@0.30.0: + resolution: {integrity: sha512-j1yoUo4gxPND1JWV9xj5ELih0yMv1iCWDG6eEQIPLSWLxzCXiFoyS7kvB+WwU+tZMf4snwJMMtaubV0laFpiBA==} + hasBin: true + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1575,6 +2086,30 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + cross-inspect@1.0.1: + resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==} + engines: {node: '>=16.0.0'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1659,6 +2194,18 @@ packages: devalue@5.1.1: resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + docker-compose@0.24.8: + resolution: {integrity: sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==} + engines: {node: '>= 6.0.0'} + + docker-modem@5.0.6: + resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==} + engines: {node: '>= 8.0'} + + dockerode@4.0.5: + resolution: {integrity: sha512-ZPmKSr1k1571Mrh7oIBS/j0AqAccoecY2yH420ni5j1KyNMgnoTh4Nu4FWunh0HZIJmRSmSysJjBIpa/zyWUEA==} + engines: {node: '>= 8.0'} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -1673,6 +2220,9 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} @@ -1694,6 +2244,14 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + engines: {node: '>=12'} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1710,6 +2268,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enhanced-resolve@5.18.1: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} @@ -1718,9 +2279,15 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + entities@2.0.3: + resolution: {integrity: sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==} + entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + es-abstract@1.23.9: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} @@ -1892,6 +2459,14 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + expect-type@1.2.0: resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} engines: {node: '>=12.0.0'} @@ -1899,6 +2474,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -1940,6 +2518,9 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -1969,6 +2550,9 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2007,6 +2591,10 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -2015,6 +2603,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2061,6 +2652,24 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphql-type-json@0.3.2: + resolution: {integrity: sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==} + peerDependencies: + graphql: '>=0.8.0' + + graphql-voyager@2.1.0: + resolution: {integrity: sha512-CmYqMMK9aNpi7lMf1/9HvIj0Vyc01EokngZPPZgazH8DWWpVOWYt2OQfkzZVWm7ZgyMqMeKOyhNtjVZbOUNB8A==} + engines: {node: '>=20.0.0'} + peerDependencies: + graphql: '>=16.5.0' + react: '>=18.0.0' + + graphql-yoga@5.13.4: + resolution: {integrity: sha512-q5l3HEvgXnZCKG6K38fz3XNBX41GkHkIYspJbdVl9QVsm5Ah0EFUkY303tEOx8IucyB0h2hb8OfbYXEcoNCLMw==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^15.2.0 || ^16.0.0 + graphql@16.10.0: resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -2095,12 +2704,18 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} htmlparser2-svelte@4.1.0: resolution: {integrity: sha512-+4f4RBFz7Rj2Hp0ZbFbXC+Kzbd6S9PgjiuFtdT76VMNgKogrEZy0pG2UrPycPbrZzVEIM5lAT3lAdkSTCHLPjg==} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} @@ -2143,6 +2758,9 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -2226,6 +2844,10 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -2254,6 +2876,9 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2306,9 +2931,15 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2335,6 +2966,10 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2403,6 +3038,9 @@ packages: resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} @@ -2410,6 +3048,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -2422,6 +3063,9 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2459,6 +3103,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + memoizerific@1.11.3: resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} @@ -2481,6 +3128,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -2492,10 +3143,18 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -2524,6 +3183,9 @@ packages: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} + nan@2.22.2: + resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2532,12 +3194,25 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + neo4j-driver-bolt-connection@5.28.1: + resolution: {integrity: sha512-nY8GBhjOW7J0rDtpiyJn6kFdk2OiNVZZhZrO8//mwNXnf5VQJ6HqZQTDthH/9pEaX0Jvbastz1xU7ZL8xzqY0w==} + + neo4j-driver-core@5.28.1: + resolution: {integrity: sha512-14vN8TlxC0JvJYfjWic5PwjsZ38loQLOKFTXwk4fWLTbCk6VhrhubB2Jsy9Rz+gM6PtTor4+6ClBEFDp1q/c8g==} + + neo4j-driver@5.28.1: + resolution: {integrity: sha512-jbyBwyM0a3RLGcP43q3hIxPUPxA+1bE04RovOKdNAS42EtBMVCKcPSeOvWiHxgXp1ZFd0a8XqK+7LtguInOLUg==} + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} @@ -2607,6 +3282,10 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} @@ -2632,6 +3311,10 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -2688,6 +3371,9 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -2703,9 +3389,23 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + properties-reader@2.3.0: + resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} + engines: {node: '>=14'} + + protobufjs@7.5.0: + resolution: {integrity: sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==} + engines: {node: '>=12.0.0'} + psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2733,10 +3433,36 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-is@19.1.0: + resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + react@19.0.0: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -2775,10 +3501,22 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2801,6 +3539,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -2809,6 +3550,12 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -2817,6 +3564,9 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} @@ -2877,6 +3627,9 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -2896,10 +3649,24 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + + ssh-remote-port-forward@1.0.4: + resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} + + ssh2@1.16.0: + resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==} + engines: {node: '>=10.16.0'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -2923,6 +3690,9 @@ packages: prettier: optional: true + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -2938,6 +3708,9 @@ packages: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} + string.prototype.repeat@0.2.0: + resolution: {integrity: sha512-1BH+X+1hSthZFW+X+JaUkjkkUPwIlLEMJBLANN3hOob3RhEk5snLWNECDnYbgn/m5c5JV7Ersu1Yubaf+05cIA==} + string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} @@ -2953,6 +3726,12 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2969,6 +3748,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3039,6 +3821,9 @@ packages: resolution: {integrity: sha512-sWJRa4qOfRdSORSVw9GhfDEwsbsYsegnDzBevUCF6k/Eis/QqCu9lJ6I0+d/E2wOWCjOhlcJ3+jl/Iur+5mmCw==} engines: {node: '>=10.0.0'} + svg-pan-zoom@3.6.1: + resolution: {integrity: sha512-JaKkGHHfGvRrcMPdJWkssLBeWqM+Isg/a09H7kgNNajT1cX5AztDTNs+C8UzpCxjCTRrG34WbquwaovZbmSk9g==} + tailwind-merge@3.0.2: resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} @@ -3049,10 +3834,29 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + test-exclude@7.0.1: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} + testcontainers@10.24.2: + resolution: {integrity: sha512-Don3EXEQuSw14+nFG9pj48fL9ck/jXDfR9Rb0K3acOyn/gg97+gsnfZaLzpdejl9GcPJVKxACNRe3SYVC2uWqg==} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -3081,6 +3885,10 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3106,6 +3914,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.19.3: + resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + engines: {node: '>=18.0.0'} + hasBin: true + turbo-darwin-64@2.4.4: resolution: {integrity: sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g==} cpu: [x64] @@ -3143,6 +3956,9 @@ packages: tween-functions@1.2.0: resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} @@ -3199,13 +4015,25 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} @@ -3230,12 +4058,19 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true @@ -3399,6 +4234,15 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -3418,6 +4262,10 @@ packages: zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + snapshots: '@adobe/css-tools@4.4.2': {} @@ -3464,7 +4312,6 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - optional: true '@babel/helper-compilation-targets@7.26.5': dependencies: @@ -3481,7 +4328,6 @@ snapshots: '@babel/types': 7.26.10 transitivePeerDependencies: - supports-color - optional: true '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': dependencies: @@ -3514,12 +4360,15 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.0': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 '@babel/parser': 7.26.10 '@babel/types': 7.26.10 - optional: true '@babel/traverse@7.26.10': dependencies: @@ -3532,13 +4381,14 @@ snapshots: globals: 11.12.0 transitivePeerDependencies: - supports-color - optional: true '@babel/types@7.26.10': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@balena/dockerignore@1.0.2': {} + '@bcoe/v8-coverage@1.0.2': {} '@biomejs/biome@1.9.4': @@ -3602,6 +4452,106 @@ snapshots: - '@chromatic-com/playwright' - react + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.26.10 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.3.1': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.10 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.12 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.10 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.13.3(@types/react@19.0.12)(react@19.0.0) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) + '@emotion/utils': 1.4.2 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.12 + transitivePeerDependencies: + - supports-color + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.0.0)': + dependencies: + react: 19.0.0 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@envelop/core@5.2.3': + dependencies: + '@envelop/instrumentation': 1.0.0 + '@envelop/types': 5.2.1 + '@whatwg-node/promise-helpers': 1.3.1 + tslib: 2.8.1 + + '@envelop/instrumentation@1.0.0': + dependencies: + '@whatwg-node/promise-helpers': 1.3.1 + tslib: 2.8.1 + + '@envelop/types@5.2.1': + dependencies: + '@whatwg-node/promise-helpers': 1.3.1 + tslib: 2.8.1 + '@esbuild/aix-ppc64@0.25.1': optional: true @@ -3735,6 +4685,91 @@ snapshots: '@eslint/core': 0.12.0 levn: 0.4.1 + '@fastify/busboy@2.1.1': {} + + '@fastify/busboy@3.1.1': {} + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@floating-ui/utils@0.2.9': {} + + '@graphql-tools/executor@1.4.7(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.8.6(graphql@16.10.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.1 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/merge@9.0.24(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.8.6(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/schema@10.0.23(graphql@16.10.0)': + dependencies: + '@graphql-tools/merge': 9.0.24(graphql@16.10.0) + '@graphql-tools/utils': 10.8.6(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/utils@10.8.6(graphql@16.10.0)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@whatwg-node/promise-helpers': 1.3.1 + cross-inspect: 1.0.1 + dset: 3.1.4 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.10.0)': + dependencies: + graphql: 16.10.0 + + '@graphql-yoga/logger@2.0.1': + dependencies: + tslib: 2.8.1 + + '@graphql-yoga/subscription@5.0.5': + dependencies: + '@graphql-yoga/typed-event-target': 3.0.2 + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/events': 0.1.2 + tslib: 2.8.1 + + '@graphql-yoga/typed-event-target@3.0.2': + dependencies: + '@repeaterjs/repeater': 3.0.6 + tslib: 2.8.1 + + '@grpc/grpc-js@1.13.3': + dependencies: + '@grpc/proto-loader': 0.7.14 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.14': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.0 + yargs: 17.7.2 + '@hugeicons/core-free-icons@1.0.13': {} '@hugeicons/svelte@1.0.2(svelte@5.23.2)': @@ -3818,6 +4853,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@js-sdsl/ordered-map@4.4.2': {} + '@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0)': dependencies: '@types/mdx': 2.0.13 @@ -3833,6 +4870,126 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 + '@mui/base@5.0.0-beta.40(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.10 + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mui/types': 7.4.1(@types/react@19.0.12) + '@mui/utils': 5.17.1(@types/react@19.0.12)(react@19.0.0) + '@popperjs/core': 2.11.8 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.12 + + '@mui/core-downloads-tracker@5.17.1': {} + + '@mui/icons-material@5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.12)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.10 + '@mui/material': 5.16.7(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.12 + + '@mui/lab@5.0.0-alpha.169(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.10 + '@mui/base': 5.0.0-beta.40(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mui/material': 5.16.7(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mui/system': 5.17.1(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0) + '@mui/types': 7.4.1(@types/react@19.0.12) + '@mui/utils': 5.17.1(@types/react@19.0.12)(react@19.0.0) + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@19.0.12)(react@19.0.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0) + '@types/react': 19.0.12 + + '@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.10 + '@mui/core-downloads-tracker': 5.17.1 + '@mui/system': 5.17.1(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0) + '@mui/types': 7.4.1(@types/react@19.0.12) + '@mui/utils': 5.17.1(@types/react@19.0.12)(react@19.0.0) + '@popperjs/core': 2.11.8 + '@types/react-transition-group': 4.4.12(@types/react@19.0.12) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-is: 18.3.1 + react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@19.0.12)(react@19.0.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0) + '@types/react': 19.0.12 + + '@mui/private-theming@5.17.1(@types/react@19.0.12)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.10 + '@mui/utils': 5.17.1(@types/react@19.0.12)(react@19.0.0) + prop-types: 15.8.1 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.12 + + '@mui/styled-engine@5.16.14(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.10 + '@emotion/cache': 11.14.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.0.0 + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@19.0.12)(react@19.0.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0) + + '@mui/system@5.17.1(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.10 + '@mui/private-theming': 5.17.1(@types/react@19.0.12)(react@19.0.0) + '@mui/styled-engine': 5.16.14(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(react@19.0.0) + '@mui/types': 7.2.24(@types/react@19.0.12) + '@mui/utils': 5.17.1(@types/react@19.0.12)(react@19.0.0) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.0.0 + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@19.0.12)(react@19.0.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0) + '@types/react': 19.0.12 + + '@mui/types@7.2.24(@types/react@19.0.12)': + optionalDependencies: + '@types/react': 19.0.12 + + '@mui/types@7.4.1(@types/react@19.0.12)': + dependencies: + '@babel/runtime': 7.27.0 + optionalDependencies: + '@types/react': 19.0.12 + + '@mui/utils@5.17.1(@types/react@19.0.12)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.10 + '@mui/types': 7.2.24(@types/react@19.0.12) + '@types/prop-types': 15.7.14 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.0.0 + react-is: 19.1.0 + optionalDependencies: + '@types/react': 19.0.12 + '@next/eslint-plugin-next@15.2.2': dependencies: fast-glob: 3.3.1 @@ -3868,6 +5025,33 @@ snapshots: '@polka/url@1.0.0-next.28': {} + '@popperjs/core@2.11.8': {} + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@repeaterjs/repeater@3.0.6': {} + '@rollup/rollup-android-arm-eabi@4.36.0': optional: true @@ -4021,13 +5205,13 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@storybook/builder-vite@8.6.7(storybook@8.6.7(prettier@3.5.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': + '@storybook/builder-vite@8.6.7(storybook@8.6.7(prettier@3.5.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@storybook/csf-plugin': 8.6.7(storybook@8.6.7(prettier@3.5.3)) browser-assert: 1.2.1 storybook: 8.6.7(prettier@3.5.3) ts-dedent: 2.2.0 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) '@storybook/components@8.6.7(storybook@8.6.7(prettier@3.5.3))': dependencies: @@ -4074,9 +5258,9 @@ snapshots: storybook: 8.6.7(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: - '@vitest/browser': 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.6.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))(vitest@3.0.9) + '@vitest/browser': 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.6.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))(vitest@3.0.9) '@vitest/runner': 3.0.9 - vitest: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3)) + vitest: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - react - react-dom @@ -4114,11 +5298,11 @@ snapshots: react-dom: 19.0.0(react@19.0.0) storybook: 8.6.7(prettier@3.5.3) - '@storybook/svelte-vite@8.6.7(@babel/core@7.26.10)(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(postcss@8.5.3)(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': + '@storybook/svelte-vite@8.6.7(@babel/core@7.26.10)(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(postcss@8.5.3)(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))': dependencies: - '@storybook/builder-vite': 8.6.7(storybook@8.6.7(prettier@3.5.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@storybook/builder-vite': 8.6.7(storybook@8.6.7(prettier@3.5.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@storybook/svelte': 8.6.7(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2) - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) magic-string: 0.30.17 storybook: 8.6.7(prettier@3.5.3) svelte: 5.23.2 @@ -4127,7 +5311,7 @@ snapshots: sveltedoc-parser: 4.2.1 ts-dedent: 2.2.0 typescript: 5.8.2 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - '@babel/core' - coffeescript @@ -4156,15 +5340,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/sveltekit@8.6.7(@babel/core@7.26.10)(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(postcss@8.5.3)(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': + '@storybook/sveltekit@8.6.7(@babel/core@7.26.10)(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(postcss@8.5.3)(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@storybook/addon-actions': 8.6.7(storybook@8.6.7(prettier@3.5.3)) - '@storybook/builder-vite': 8.6.7(storybook@8.6.7(prettier@3.5.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@storybook/builder-vite': 8.6.7(storybook@8.6.7(prettier@3.5.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@storybook/svelte': 8.6.7(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2) - '@storybook/svelte-vite': 8.6.7(@babel/core@7.26.10)(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(postcss@8.5.3)(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@storybook/svelte-vite': 8.6.7(@babel/core@7.26.10)(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(postcss@8.5.3)(storybook@8.6.7(prettier@3.5.3))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) storybook: 8.6.7(prettier@3.5.3) svelte: 5.23.2 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - '@babel/core' - '@sveltejs/vite-plugin-svelte' @@ -4214,13 +5398,13 @@ snapshots: dependencies: acorn: 8.14.1 - '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.20.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))': + '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.20.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))': dependencies: - '@sveltejs/kit': 2.20.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@sveltejs/kit': 2.20.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) - '@sveltejs/kit@2.20.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': + '@sveltejs/kit@2.20.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -4233,27 +5417,27 @@ snapshots: set-cookie-parser: 2.7.1 sirv: 3.0.1 svelte: 5.23.2 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) debug: 4.4.0 svelte: 5.23.2 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)))(svelte@5.23.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.23.2 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) - vitefu: 1.0.6(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) + vitefu: 1.0.6(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) transitivePeerDependencies: - supports-color @@ -4327,13 +5511,13 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.0.15 - '@tailwindcss/vite@4.0.15(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': + '@tailwindcss/vite@4.0.15(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@tailwindcss/node': 4.0.15 '@tailwindcss/oxide': 4.0.15 lightningcss: 1.29.2 tailwindcss: 4.0.15 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) '@tauri-apps/api@2.3.0': {} @@ -4384,6 +5568,13 @@ snapshots: dependencies: '@tauri-apps/api': 2.3.0 + '@testcontainers/neo4j@10.24.2': + dependencies: + testcontainers: 10.24.2 + transitivePeerDependencies: + - bare-buffer + - supports-color + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.26.2 @@ -4432,22 +5623,58 @@ snapshots: '@types/cookie@0.6.0': {} + '@types/docker-modem@3.0.6': + dependencies: + '@types/node': 22.13.10 + '@types/ssh2': 1.15.5 + + '@types/dockerode@3.3.38': + dependencies: + '@types/docker-modem': 3.0.6 + '@types/node': 22.13.10 + '@types/ssh2': 1.15.5 + '@types/estree@1.0.6': {} '@types/json-schema@7.0.15': {} '@types/mdx@2.0.13': {} + '@types/node@18.19.86': + dependencies: + undici-types: 5.26.5 + '@types/node@22.13.10': dependencies: undici-types: 6.20.0 + '@types/parse-json@4.0.2': {} + + '@types/prop-types@15.7.14': {} + '@types/pug@2.0.10': {} + '@types/react-transition-group@4.4.12(@types/react@19.0.12)': + dependencies: + '@types/react': 19.0.12 + '@types/react@19.0.12': dependencies: csstype: 3.1.3 + '@types/ssh2-streams@0.1.12': + dependencies: + '@types/node': 22.13.10 + + '@types/ssh2@0.5.52': + dependencies: + '@types/node': 22.13.10 + '@types/ssh2-streams': 0.1.12 + + '@types/ssh2@1.15.5': + dependencies: + '@types/node': 18.19.86 + '@types/statuses@2.0.5': {} '@types/tough-cookie@4.0.5': {} @@ -4531,17 +5758,17 @@ snapshots: '@typescript-eslint/types': 8.26.1 eslint-visitor-keys: 4.2.0 - '@vitest/browser@3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.6.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))(vitest@3.0.9)': + '@vitest/browser@3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.6.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))(vitest@3.0.9)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@vitest/utils': 3.0.9 magic-string: 0.30.17 msw: 2.7.3(@types/node@22.13.10)(typescript@5.6.3) sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3)) + vitest: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(tsx@4.19.3)(yaml@2.7.1) ws: 8.18.1 optionalDependencies: playwright: 1.51.1 @@ -4552,17 +5779,39 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))(vitest@3.0.9)': + '@vitest/browser@3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))(vitest@3.0.9)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@vitest/utils': 3.0.9 magic-string: 0.30.17 msw: 2.7.3(@types/node@22.13.10)(typescript@5.8.2) sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2)) + vitest: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2))(tsx@4.19.3)(yaml@2.7.1) + ws: 8.18.1 + optionalDependencies: + playwright: 1.51.1 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - typescript + - utf-8-validate + - vite + optional: true + + '@vitest/browser@3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.8.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))(vitest@3.0.9)': + dependencies: + '@testing-library/dom': 10.4.0 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) + '@vitest/utils': 3.0.9 + magic-string: 0.30.17 + msw: 2.7.3(@types/node@22.13.10)(typescript@5.8.3) + sirv: 3.0.1 + tinyrainbow: 2.0.0 + vitest: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.3))(tsx@4.19.3)(yaml@2.7.1) ws: 8.18.1 optionalDependencies: playwright: 1.51.1 @@ -4588,9 +5837,9 @@ snapshots: std-env: 3.8.1 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3)) + vitest: 3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(tsx@4.19.3)(yaml@2.7.1) optionalDependencies: - '@vitest/browser': 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.6.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))(vitest@3.0.9) + '@vitest/browser': 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.6.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))(vitest@3.0.9) transitivePeerDependencies: - supports-color @@ -4608,23 +5857,32 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': + '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.7.3(@types/node@22.13.10)(typescript@5.6.3) - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) - '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': + '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.7.3(@types/node@22.13.10)(typescript@5.8.2) - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) + + '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))': + dependencies: + '@vitest/spy': 3.0.9 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + msw: 2.7.3(@types/node@22.13.10)(typescript@5.8.3) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) '@vitest/pretty-format@2.0.5': dependencies: @@ -4676,6 +5934,43 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 + '@whatwg-node/disposablestack@0.0.6': + dependencies: + '@whatwg-node/promise-helpers': 1.3.1 + tslib: 2.8.1 + + '@whatwg-node/events@0.1.2': + dependencies: + tslib: 2.8.1 + + '@whatwg-node/fetch@0.10.6': + dependencies: + '@whatwg-node/node-fetch': 0.7.18 + urlpattern-polyfill: 10.0.0 + + '@whatwg-node/node-fetch@0.7.18': + dependencies: + '@fastify/busboy': 3.1.1 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.1 + tslib: 2.8.1 + + '@whatwg-node/promise-helpers@1.3.1': + dependencies: + tslib: 2.8.1 + + '@whatwg-node/server@0.10.5': + dependencies: + '@envelop/instrumentation': 1.0.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.6 + '@whatwg-node/promise-helpers': 1.3.1 + tslib: 2.8.1 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -4707,6 +6002,26 @@ snapshots: ansi-styles@6.2.1: {} + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + argparse@2.0.1: {} aria-query@5.1.3: @@ -4774,6 +6089,10 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + assertion-error@2.0.1: {} ast-types@0.16.1: @@ -4782,6 +6101,10 @@ snapshots: async-function@1.0.0: {} + async-lock@1.4.1: {} + + async@3.2.6: {} + autoprefixer@10.4.21(postcss@8.5.3): dependencies: browserslist: 4.24.4 @@ -4798,12 +6121,57 @@ snapshots: axobject-query@4.1.0: {} + b4a@1.6.7: {} + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.26.10 + cosmiconfig: 7.1.0 + resolve: 1.22.10 + balanced-match@1.0.2: {} + bare-events@2.5.4: + optional: true + + bare-fs@4.1.2: + dependencies: + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + optional: true + + bare-os@3.6.1: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.1 + optional: true + + bare-stream@2.6.5(bare-events@2.5.4): + dependencies: + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 + optional: true + + base64-js@1.5.1: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + better-opn@3.0.2: dependencies: open: 8.4.2 + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -4828,6 +6196,21 @@ snapshots: buffer-crc32@1.0.0: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buildcheck@0.0.6: + optional: true + + byline@5.0.0: {} + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -4877,6 +6260,8 @@ snapshots: dependencies: readdirp: 4.1.2 + chownr@1.1.4: {} + chromatic@11.27.0: {} cli-width@4.1.0: {} @@ -4895,8 +6280,25 @@ snapshots: color-name@1.1.4: {} + commonmark@0.30.0: + dependencies: + entities: 2.0.3 + mdurl: 1.0.1 + minimist: 1.2.8 + string.prototype.repeat: 0.2.0 + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + concat-map@0.0.1: {} + convert-source-map@1.9.0: {} + convert-source-map@2.0.0: optional: true @@ -4904,6 +6306,33 @@ snapshots: cookie@0.7.2: {} + core-util-is@1.0.3: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cpu-features@0.0.10: + dependencies: + buildcheck: 0.0.6 + nan: 2.22.2 + optional: true + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + + cross-inspect@1.0.1: + dependencies: + tslib: 2.8.1 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -4991,6 +6420,31 @@ snapshots: devalue@5.1.1: {} + docker-compose@0.24.8: + dependencies: + yaml: 2.7.1 + + docker-modem@5.0.6: + dependencies: + debug: 4.4.0 + readable-stream: 3.6.2 + split-ca: 1.0.1 + ssh2: 1.16.0 + transitivePeerDependencies: + - supports-color + + dockerode@4.0.5: + dependencies: + '@balena/dockerignore': 1.0.2 + '@grpc/grpc-js': 1.13.3 + '@grpc/proto-loader': 0.7.14 + docker-modem: 5.0.6 + protobufjs: 7.5.0 + tar-fs: 2.1.2 + uuid: 10.0.0 + transitivePeerDependencies: + - supports-color + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -5003,6 +6457,11 @@ snapshots: dom-accessibility-api@0.6.3: {} + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.26.10 + csstype: 3.1.3 + dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0 @@ -5027,6 +6486,10 @@ snapshots: dotenv@16.0.3: {} + dotenv@16.5.0: {} + + dset@3.1.4: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5041,6 +6504,10 @@ snapshots: emoji-regex@9.2.2: {} + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 @@ -5051,8 +6518,14 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + entities@2.0.3: {} + entities@2.2.0: {} + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 @@ -5279,7 +6752,7 @@ snapshots: eslint-scope: 7.2.2 eslint-utils: 3.0.0(eslint@8.4.1) eslint-visitor-keys: 3.4.3 - espree: 9.2.0 + espree: 9.6.1 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -5392,10 +6865,16 @@ snapshots: esutils@2.0.3: {} + event-target-shim@5.0.1: {} + + events@3.3.0: {} + expect-type@1.2.0: {} fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5436,6 +6915,8 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-root@1.1.0: {} + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -5467,6 +6948,8 @@ snapshots: fraction.js@4.3.7: {} + fs-constants@1.0.0: {} + fs.realpath@1.0.0: {} fsevents@2.3.2: @@ -5508,6 +6991,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-port@7.1.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -5519,6 +7004,10 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -5545,8 +7034,7 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@11.12.0: - optional: true + globals@11.12.0: {} globals@13.24.0: dependencies: @@ -5567,6 +7055,43 @@ snapshots: graphemer@1.4.0: {} + graphql-type-json@0.3.2(graphql@16.10.0): + dependencies: + graphql: 16.10.0 + + graphql-voyager@2.1.0(@types/react@19.0.12)(graphql@16.10.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@emotion/react': 11.13.3(@types/react@19.0.12)(react@19.0.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0) + '@mui/icons-material': 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.12)(react@19.0.0) + '@mui/lab': 5.0.0-alpha.169(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mui/material': 5.16.7(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + commonmark: 0.30.0 + graphql: 16.10.0 + react: 19.0.0 + svg-pan-zoom: 3.6.1 + transitivePeerDependencies: + - '@types/react' + - react-dom + - supports-color + + graphql-yoga@5.13.4(graphql@16.10.0): + dependencies: + '@envelop/core': 5.2.3 + '@envelop/instrumentation': 1.0.0 + '@graphql-tools/executor': 1.4.7(graphql@16.10.0) + '@graphql-tools/schema': 10.0.23(graphql@16.10.0) + '@graphql-tools/utils': 10.8.6(graphql@16.10.0) + '@graphql-yoga/logger': 2.0.1 + '@graphql-yoga/subscription': 5.0.5 + '@whatwg-node/fetch': 0.10.6 + '@whatwg-node/promise-helpers': 1.3.1 + '@whatwg-node/server': 0.10.5 + dset: 3.1.4 + graphql: 16.10.0 + lru-cache: 10.4.3 + tslib: 2.8.1 + graphql@16.10.0: {} has-bigints@1.1.0: {} @@ -5593,6 +7118,10 @@ snapshots: headers-polyfill@4.0.3: {} + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + html-escaper@2.0.2: {} htmlparser2-svelte@4.1.0: @@ -5602,6 +7131,8 @@ snapshots: domutils: 2.8.0 entities: 2.2.0 + ieee754@1.2.1: {} + ignore@4.0.6: {} ignore@5.3.2: {} @@ -5641,6 +7172,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -5724,6 +7257,8 @@ snapshots: dependencies: call-bound: 1.0.4 + is-stream@2.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -5754,6 +7289,8 @@ snapshots: dependencies: is-docker: 2.2.1 + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} @@ -5804,13 +7341,16 @@ snapshots: jsdoc-type-pratt-parser@4.1.0: {} - jsesc@3.1.0: - optional: true + jsesc@3.1.0: {} json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: @@ -5837,6 +7377,10 @@ snapshots: kleur@4.1.5: {} + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -5887,12 +7431,16 @@ snapshots: lightningcss-win32-arm64-msvc: 1.29.2 lightningcss-win32-x64-msvc: 1.29.2 + lines-and-columns@1.2.4: {} + locate-character@3.0.0: {} locate-path@6.0.0: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.castarray@4.4.0: {} lodash.isplainobject@4.0.6: {} @@ -5901,6 +7449,8 @@ snapshots: lodash@4.17.21: {} + long@5.3.2: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -5938,6 +7488,8 @@ snapshots: math-intrinsics@1.1.0: {} + mdurl@1.0.1: {} + memoizerific@1.11.3: dependencies: map-or-similar: 1.5.0 @@ -5957,6 +7509,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -5965,10 +7521,14 @@ snapshots: minipass@7.1.2: {} + mkdirp-classic@0.5.3: {} + mkdirp@0.5.6: dependencies: minimist: 1.2.8 + mkdirp@1.0.4: {} + mri@1.2.0: {} mrmime@2.0.1: {} @@ -6026,14 +7586,57 @@ snapshots: - '@types/node' optional: true + msw@2.7.3(@types/node@22.13.10)(typescript@5.8.3): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.1.8(@types/node@22.13.10) + '@mswjs/interceptors': 0.37.6 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 + graphql: 16.10.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + strict-event-emitter: 0.5.1 + type-fest: 4.37.0 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/node' + optional: true + multiformats@13.3.2: {} mute-stream@2.0.0: {} + nan@2.22.2: + optional: true + nanoid@3.3.11: {} natural-compare@1.4.0: {} + neo4j-driver-bolt-connection@5.28.1: + dependencies: + buffer: 6.0.3 + neo4j-driver-core: 5.28.1 + string_decoder: 1.3.0 + + neo4j-driver-core@5.28.1: {} + + neo4j-driver@5.28.1: + dependencies: + neo4j-driver-bolt-connection: 5.28.1 + neo4j-driver-core: 5.28.1 + rxjs: 7.8.2 + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -6041,6 +7644,8 @@ snapshots: node-releases@2.0.19: {} + normalize-path@3.0.0: {} + normalize-range@0.1.2: {} object-assign@4.1.1: {} @@ -6124,6 +7729,13 @@ snapshots: dependencies: callsites: 3.1.0 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + pascal-case@3.1.2: dependencies: no-case: 3.0.4 @@ -6144,6 +7756,8 @@ snapshots: path-to-regexp@6.3.0: {} + path-type@4.0.0: {} + pathe@2.0.3: {} pathval@2.0.0: {} @@ -6189,6 +7803,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + process-nextick-args@2.0.1: {} + process@0.11.10: {} progress@2.0.3: {} @@ -6204,10 +7820,40 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + properties-reader@2.3.0: + dependencies: + mkdirp: 1.0.4 + + protobufjs@7.5.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.13.10 + long: 5.3.2 + psl@1.15.0: dependencies: punycode: 2.3.1 + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + punycode@2.3.1: {} querystringify@2.2.0: {} @@ -6228,8 +7874,49 @@ snapshots: react-is@17.0.2: {} + react-is@18.3.1: {} + + react-is@19.1.0: {} + + react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@babel/runtime': 7.26.10 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react@19.0.0: {} + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + readdirp@4.1.2: {} recast@0.23.11: @@ -6275,12 +7962,22 @@ snapshots: resolve-from@4.0.0: {} + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.5: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + retry@0.12.0: {} + reusify@1.1.0: {} rimraf@2.7.1: @@ -6320,6 +8017,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + sade@1.8.1: dependencies: mri: 1.2.0 @@ -6332,6 +8033,10 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -6343,6 +8048,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safer-buffer@2.1.2: {} + sander@0.5.1: dependencies: es6-promise: 3.3.1 @@ -6418,6 +8125,8 @@ snapshots: siginfo@2.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} sirv@3.0.1: @@ -6437,8 +8146,25 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.5.7: {} + source-map@0.6.1: {} + split-ca@1.0.1: {} + + ssh-remote-port-forward@1.0.4: + dependencies: + '@types/ssh2': 0.5.52 + ssh2: 1.16.0 + + ssh2@1.16.0: + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.10 + nan: 2.22.2 + stackback@0.0.2: {} statuses@2.0.1: {} @@ -6460,6 +8186,13 @@ snapshots: - supports-color - utf-8-validate + streamx@2.22.0: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.5.4 + strict-event-emitter@0.5.1: {} string-width@4.2.3: @@ -6490,6 +8223,8 @@ snapshots: set-function-name: 2.0.2 side-channel: 1.1.0 + string.prototype.repeat@0.2.0: {} + string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 @@ -6518,6 +8253,14 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -6532,6 +8275,8 @@ snapshots: strip-json-comments@3.1.1: {} + stylis@4.2.0: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -6597,18 +8342,76 @@ snapshots: transitivePeerDependencies: - supports-color + svg-pan-zoom@3.6.1: {} + tailwind-merge@3.0.2: {} tailwindcss@4.0.15: {} tapable@2.2.1: {} + tar-fs@2.1.2: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-fs@3.0.8: + dependencies: + pump: 3.0.2 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.1.2 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.0 + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 glob: 10.4.5 minimatch: 9.0.5 + testcontainers@10.24.2: + dependencies: + '@balena/dockerignore': 1.0.2 + '@types/dockerode': 3.3.38 + archiver: 7.0.1 + async-lock: 1.4.1 + byline: 5.0.0 + debug: 4.4.0 + docker-compose: 0.24.8 + dockerode: 4.0.5 + get-port: 7.1.0 + proper-lockfile: 4.1.2 + properties-reader: 2.3.0 + ssh-remote-port-forward: 1.0.4 + tar-fs: 3.0.8 + tmp: 0.2.3 + undici: 5.29.0 + transitivePeerDependencies: + - bare-buffer + - supports-color + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + text-table@0.2.0: {} tiny-invariant@1.3.3: {} @@ -6625,6 +8428,8 @@ snapshots: tinyspy@3.0.2: {} + tmp@0.2.3: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -6646,6 +8451,13 @@ snapshots: tslib@2.8.1: {} + tsx@4.19.3: + dependencies: + esbuild: 0.25.1 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 + turbo-darwin-64@2.4.4: optional: true @@ -6675,6 +8487,8 @@ snapshots: tween-functions@1.2.0: {} + tweetnacl@0.14.5: {} + tweetnacl@1.0.3: {} type-check@0.4.0: @@ -6736,6 +8550,8 @@ snapshots: typescript@5.8.2: {} + typescript@5.8.3: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -6743,8 +8559,14 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + undici-types@5.26.5: {} + undici-types@6.20.0: {} + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + universalify@0.2.0: {} universalify@2.0.1: {} @@ -6769,6 +8591,8 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 + urlpattern-polyfill@10.0.0: {} + util-deprecate@1.0.2: {} util@0.12.5: @@ -6779,6 +8603,8 @@ snapshots: is-typed-array: 1.1.15 which-typed-array: 1.1.19 + uuid@10.0.0: {} + uuid@11.1.0: {} uuid@8.3.2: {} @@ -6787,13 +8613,13 @@ snapshots: v8-compile-cache@2.4.0: {} - vite-node@3.0.9(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2): + vite-node@3.0.9(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - '@types/node' - jiti @@ -6808,7 +8634,7 @@ snapshots: - tsx - yaml - vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2): + vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -6818,15 +8644,56 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.29.2 + tsx: 4.19.3 + yaml: 2.7.1 + + vitefu@1.0.6(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)): + optionalDependencies: + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) - vitefu@1.0.6(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)): + vitest@3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(tsx@4.19.3)(yaml@2.7.1): + dependencies: + '@vitest/expect': 3.0.9 + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) + '@vitest/pretty-format': 3.0.9 + '@vitest/runner': 3.0.9 + '@vitest/snapshot': 3.0.9 + '@vitest/spy': 3.0.9 + '@vitest/utils': 3.0.9 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.0 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.8.1 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) + vite-node: 3.0.9(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) + why-is-node-running: 2.3.0 optionalDependencies: - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + '@types/node': 22.13.10 + '@vitest/browser': 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.6.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))(vitest@3.0.9) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml - vitest@3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3)): + vitest@3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2))(tsx@4.19.3)(yaml@2.7.1): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.6.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -6842,12 +8709,12 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) - vite-node: 3.0.9(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) + vite-node: 3.0.9(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.13.10 - '@vitest/browser': 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.6.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))(vitest@3.0.9) + '@vitest/browser': 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))(vitest@3.0.9) transitivePeerDependencies: - jiti - less @@ -6862,10 +8729,10 @@ snapshots: - tsx - yaml - vitest@3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2)): + vitest@3.0.9(@types/node@22.13.10)(@vitest/browser@3.0.9)(jiti@2.4.2)(lightningcss@1.29.2)(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.3))(tsx@4.19.3)(yaml@2.7.1): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.2))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.10)(typescript@5.8.3))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -6881,12 +8748,12 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) - vite-node: 3.0.9(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) + vite-node: 3.0.9(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.13.10 - '@vitest/browser': 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))(vitest@3.0.9) + '@vitest/browser': 3.0.9(@types/node@22.13.10)(playwright@1.51.1)(typescript@5.8.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.1))(vitest@3.0.9) transitivePeerDependencies: - jiti - less @@ -6982,6 +8849,10 @@ snapshots: yallist@3.1.1: optional: true + yaml@1.10.2: {} + + yaml@2.7.1: {} + yargs-parser@21.1.1: {} yargs@17.7.2: @@ -6999,3 +8870,9 @@ snapshots: yoctocolors-cjs@2.1.2: {} zimmerframe@1.1.2: {} + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0