From 901fd659df2b1066f795b869126650106ea7c78e Mon Sep 17 00:00:00 2001 From: Sylvain Duchesne Date: Wed, 11 Mar 2026 12:19:45 +0100 Subject: [PATCH] NextGraph integration (WIP), broker banner, and feature-based architecture - Add NextGraph data layer with @ng-org/orm, SHEX shapes (Event, UserProfile, Participation), session management, and FestipodDataContext with dual-mode operation (connected via NextGraph or local seed data) - Add BrokerBanner and NgStatus components showing connection status - Refactor to feature-based architecture: organize code by business domain (event, user, home, auth, workshop, meeting, notification) instead of technical layer. Modules only import from shared/, never from each other - Collocate BDD features and step definitions with their modules: event-specific steps in event/steps/, user steps in user/steps/, shared generic steps remain in shared/steps/ - Set up multi-layer BDD structure (frontend/backend/e2e steps per module) - Add project documentation (AGENTS.md, .project/knowledge/) Co-Authored-By: Claude Opus 4.6 --- .gitignore | 1 + .project/knowledge/architecture.md | 84 + .project/knowledge/bdd-testing.md | 101 + .project/knowledge/data-layer.md | 67 + .project/knowledge/screens.md | 94 + AGENTS.md | 47 + CLAUDE.md | 71 +- bun.lock | 380 ++- cucumber.json | 7 +- features/step_definitions/form.steps.ts | 88 - features/step_definitions/screen.steps.ts | 203 -- package.json | 10 +- patches/@ng-org%2Form@0.1.2-alpha.4.patch | 74 + reports/cucumber-report.html | 2 +- reports/cucumber-report.json | 2171 +++++++++-------- scripts/build-ng-packages.sh | 148 ++ scripts/extract-step-definitions.ts | 24 +- scripts/parse-features.ts | 6 +- scripts/parse-test-results.ts | 4 +- src/{ => app}/App.tsx | 14 +- src/{ => app}/components/DemoMode.tsx | 8 +- src/{ => app}/components/Gallery.tsx | 8 +- src/{ => app}/components/ThemeToggle.tsx | 2 +- src/{ => app}/components/UserStoriesPage.tsx | 4 +- .../components/specs/FeatureFilter.tsx | 6 +- .../components/specs/FeatureView.tsx | 10 +- .../components/specs/GherkinHighlighter.tsx | 6 +- src/{ => app}/components/specs/SpecsPage.tsx | 14 +- src/{ => app}/components/specs/index.ts | 0 src/{ => app}/frontend.tsx | 0 src/{ => app}/router.tsx | 0 src/index.html | 2 +- src/modules/auth/screens/LoginScreen.tsx | 90 + .../auth}/screens/WelcomeScreen.tsx | 4 +- .../features}/us-13-creer-evenement.feature | 0 .../us-3-visualiser-evenement-termine.feature | 0 .../us-5-commentaires-evenement.feature | 0 .../us-7-inscription-evenement.feature | 0 .../features}/us-8-macro-evenement.feature | 0 .../event}/screens/CreateEventScreen.tsx | 121 +- .../event/screens/EventDetailScreen.tsx | 174 ++ .../event}/screens/EventsScreen.tsx | 65 +- .../event}/screens/InviteScreen.tsx | 24 +- .../event}/screens/MeetingPointsScreen.tsx | 74 +- .../event}/screens/ParticipantsListScreen.tsx | 54 +- .../event/screens/UpdateEventScreen.tsx | 146 ++ .../event/steps/frontend/event.steps.ts | 124 + src/{ => modules/home}/screens/HomeScreen.tsx | 53 +- .../home}/screens/SettingsScreen.tsx | 4 +- src/modules/home/steps/frontend/home.steps.ts | 10 + .../features}/us-16-point-rencontre.feature | 0 .../us-17-informer-utilisateurs.feature | 0 .../us-18-nouveaux-participants.feature | 0 .../features}/us-19-recapitulatif.feature | 0 .../us-10-profil-participant.feature | 0 .../features}/us-12-carte-evenements.feature | 0 .../us-15-visualiser-inscrits.feature | 0 .../features}/us-20-profil-reseau.feature | 0 .../features}/us-21-profil-public.feature | 0 .../user/features}/us-22-parrainer.feature | 0 .../us-23-connexion-utilisateurs.feature | 0 .../us-24-notification-contacts.feature | 0 .../us-25-notification-evenements.feature | 0 .../features}/us-26-portee-evenement.feature | 0 .../features}/us-9-visualiser-photo.feature | 0 .../user}/screens/FriendsListScreen.tsx | 37 +- .../user}/screens/ProfileScreen.tsx | 35 +- .../user}/screens/ShareProfileScreen.tsx | 13 +- .../user/screens/UpdateProfileScreen.tsx | 93 + .../user}/screens/UserProfileScreen.tsx | 58 +- src/modules/user/steps/frontend/user.steps.ts | 87 + .../us-1-visualiser-atelier-termine.feature | 0 .../features}/us-11-bilan-consolide.feature | 0 .../features}/us-14-creer-atelier.feature | 0 .../us-2-visualiser-notes-atelier.feature | 0 .../us-4-commentaires-atelier.feature | 0 .../us-6-inscription-atelier.feature | 0 src/screens/EventDetailScreen.tsx | 134 - src/screens/LoginScreen.tsx | 39 - src/screens/UpdateEventScreen.tsx | 104 - src/screens/UpdateProfileScreen.tsx | 68 - src/screens/index.ts | 40 +- .../components/sketchy/Avatar.tsx | 0 src/{ => shared}/components/sketchy/Badge.tsx | 0 .../components/sketchy/BrokerBanner.tsx | 57 + .../components/sketchy/Button.tsx | 0 src/{ => shared}/components/sketchy/Card.tsx | 0 .../components/sketchy/Checkbox.tsx | 0 .../components/sketchy/Divider.tsx | 0 .../components/sketchy/Header.tsx | 0 src/{ => shared}/components/sketchy/Input.tsx | 0 .../components/sketchy/ListItem.tsx | 0 .../components/sketchy/NavBar.tsx | 0 src/shared/components/sketchy/NgStatus.tsx | 78 + .../components/sketchy/PhoneFrame.tsx | 0 .../components/sketchy/Placeholder.tsx | 0 src/{ => shared}/components/sketchy/Text.tsx | 0 .../components/sketchy/Toggle.tsx | 0 src/{ => shared}/components/sketchy/index.ts | 1 + src/{ => shared}/components/ui/button.tsx | 2 +- src/{ => shared}/components/ui/card.tsx | 2 +- src/{ => shared}/components/ui/input.tsx | 2 +- src/{ => shared}/components/ui/label.tsx | 2 +- src/{ => shared}/components/ui/select.tsx | 2 +- src/{ => shared}/components/ui/textarea.tsx | 2 +- src/{ => shared}/components/ui/tooltip.tsx | 2 +- src/shared/context/FestipodDataContext.tsx | 473 ++++ src/shared/context/NextGraphContext.tsx | 87 + src/{ => shared}/context/ThemeContext.tsx | 0 src/{ => shared}/data/features.ts | 1154 ++++----- src/{ => shared}/data/index.ts | 0 src/shared/data/seedData.ts | 237 ++ src/{ => shared}/data/stepDefinitions.ts | 460 ++-- src/{ => shared}/data/testResults.ts | 0 src/shared/data/types.ts | 59 + src/shared/hooks/useShapeWithDefaults.ts | 38 + src/{ => shared}/lib/utils.ts | 0 .../shapes/orm/festipodShapes.schema.ts | 179 ++ .../shapes/orm/festipodShapes.shapeTypes.ts | 17 + .../shapes/orm/festipodShapes.typings.ts | 163 ++ src/shared/shapes/shex/festipodShapes.shex | 49 + src/shared/steps/frontend/form.steps.ts | 30 + .../steps/frontend}/navigation.steps.ts | 34 +- {features => src/shared}/support/hooks.ts | 0 {features => src/shared}/support/world.ts | 36 +- src/{ => shared}/types/gherkin.ts | 0 src/shared/utils/ngBootstrap.ts | 98 + src/shared/utils/ngSession.ts | 52 + 128 files changed, 5738 insertions(+), 2885 deletions(-) create mode 100644 .project/knowledge/architecture.md create mode 100644 .project/knowledge/bdd-testing.md create mode 100644 .project/knowledge/data-layer.md create mode 100644 .project/knowledge/screens.md create mode 100644 AGENTS.md delete mode 100644 features/step_definitions/form.steps.ts delete mode 100644 features/step_definitions/screen.steps.ts create mode 100644 patches/@ng-org%2Form@0.1.2-alpha.4.patch create mode 100755 scripts/build-ng-packages.sh rename src/{ => app}/App.tsx (73%) rename src/{ => app}/components/DemoMode.tsx (97%) rename src/{ => app}/components/Gallery.tsx (95%) rename src/{ => app}/components/ThemeToggle.tsx (95%) rename src/{ => app}/components/UserStoriesPage.tsx (99%) rename src/{ => app}/components/specs/FeatureFilter.tsx (98%) rename src/{ => app}/components/specs/FeatureView.tsx (92%) rename src/{ => app}/components/specs/GherkinHighlighter.tsx (99%) rename src/{ => app}/components/specs/SpecsPage.tsx (96%) rename src/{ => app}/components/specs/index.ts (100%) rename src/{ => app}/frontend.tsx (100%) rename src/{ => app}/router.tsx (100%) create mode 100644 src/modules/auth/screens/LoginScreen.tsx rename src/{ => modules/auth}/screens/WelcomeScreen.tsx (95%) rename {features/event => src/modules/event/features}/us-13-creer-evenement.feature (100%) rename {features/event => src/modules/event/features}/us-3-visualiser-evenement-termine.feature (100%) rename {features/event => src/modules/event/features}/us-5-commentaires-evenement.feature (100%) rename {features/event => src/modules/event/features}/us-7-inscription-evenement.feature (100%) rename {features/event => src/modules/event/features}/us-8-macro-evenement.feature (100%) rename src/{ => modules/event}/screens/CreateEventScreen.tsx (70%) create mode 100644 src/modules/event/screens/EventDetailScreen.tsx rename src/{ => modules/event}/screens/EventsScreen.tsx (63%) rename src/{ => modules/event}/screens/InviteScreen.tsx (81%) rename src/{ => modules/event}/screens/MeetingPointsScreen.tsx (53%) rename src/{ => modules/event}/screens/ParticipantsListScreen.tsx (53%) create mode 100644 src/modules/event/screens/UpdateEventScreen.tsx create mode 100644 src/modules/event/steps/frontend/event.steps.ts rename src/{ => modules/home}/screens/HomeScreen.tsx (73%) rename src/{ => modules/home}/screens/SettingsScreen.tsx (97%) create mode 100644 src/modules/home/steps/frontend/home.steps.ts rename {features/meeting => src/modules/meeting/features}/us-16-point-rencontre.feature (100%) rename {features/notif => src/modules/notification/features}/us-17-informer-utilisateurs.feature (100%) rename {features/notif => src/modules/notification/features}/us-18-nouveaux-participants.feature (100%) rename {features/notif => src/modules/notification/features}/us-19-recapitulatif.feature (100%) rename {features/user => src/modules/user/features}/us-10-profil-participant.feature (100%) rename {features/user => src/modules/user/features}/us-12-carte-evenements.feature (100%) rename {features/user => src/modules/user/features}/us-15-visualiser-inscrits.feature (100%) rename {features/user => src/modules/user/features}/us-20-profil-reseau.feature (100%) rename {features/user => src/modules/user/features}/us-21-profil-public.feature (100%) rename {features/user => src/modules/user/features}/us-22-parrainer.feature (100%) rename {features/user => src/modules/user/features}/us-23-connexion-utilisateurs.feature (100%) rename {features/user => src/modules/user/features}/us-24-notification-contacts.feature (100%) rename {features/user => src/modules/user/features}/us-25-notification-evenements.feature (100%) rename {features/user => src/modules/user/features}/us-26-portee-evenement.feature (100%) rename {features/user => src/modules/user/features}/us-9-visualiser-photo.feature (100%) rename src/{ => modules/user}/screens/FriendsListScreen.tsx (69%) rename src/{ => modules/user}/screens/ProfileScreen.tsx (74%) rename src/{ => modules/user}/screens/ShareProfileScreen.tsx (90%) create mode 100644 src/modules/user/screens/UpdateProfileScreen.tsx rename src/{ => modules/user}/screens/UserProfileScreen.tsx (66%) create mode 100644 src/modules/user/steps/frontend/user.steps.ts rename {features/workshop => src/modules/workshop/features}/us-1-visualiser-atelier-termine.feature (100%) rename {features/workshop => src/modules/workshop/features}/us-11-bilan-consolide.feature (100%) rename {features/workshop => src/modules/workshop/features}/us-14-creer-atelier.feature (100%) rename {features/workshop => src/modules/workshop/features}/us-2-visualiser-notes-atelier.feature (100%) rename {features/workshop => src/modules/workshop/features}/us-4-commentaires-atelier.feature (100%) rename {features/workshop => src/modules/workshop/features}/us-6-inscription-atelier.feature (100%) delete mode 100644 src/screens/EventDetailScreen.tsx delete mode 100644 src/screens/LoginScreen.tsx delete mode 100644 src/screens/UpdateEventScreen.tsx delete mode 100644 src/screens/UpdateProfileScreen.tsx rename src/{ => shared}/components/sketchy/Avatar.tsx (100%) rename src/{ => shared}/components/sketchy/Badge.tsx (100%) create mode 100644 src/shared/components/sketchy/BrokerBanner.tsx rename src/{ => shared}/components/sketchy/Button.tsx (100%) rename src/{ => shared}/components/sketchy/Card.tsx (100%) rename src/{ => shared}/components/sketchy/Checkbox.tsx (100%) rename src/{ => shared}/components/sketchy/Divider.tsx (100%) rename src/{ => shared}/components/sketchy/Header.tsx (100%) rename src/{ => shared}/components/sketchy/Input.tsx (100%) rename src/{ => shared}/components/sketchy/ListItem.tsx (100%) rename src/{ => shared}/components/sketchy/NavBar.tsx (100%) create mode 100644 src/shared/components/sketchy/NgStatus.tsx rename src/{ => shared}/components/sketchy/PhoneFrame.tsx (100%) rename src/{ => shared}/components/sketchy/Placeholder.tsx (100%) rename src/{ => shared}/components/sketchy/Text.tsx (100%) rename src/{ => shared}/components/sketchy/Toggle.tsx (100%) rename src/{ => shared}/components/sketchy/index.ts (91%) rename src/{ => shared}/components/ui/button.tsx (98%) rename src/{ => shared}/components/ui/card.tsx (97%) rename src/{ => shared}/components/ui/input.tsx (95%) rename src/{ => shared}/components/ui/label.tsx (93%) rename src/{ => shared}/components/ui/select.tsx (99%) rename src/{ => shared}/components/ui/textarea.tsx (94%) rename src/{ => shared}/components/ui/tooltip.tsx (97%) create mode 100644 src/shared/context/FestipodDataContext.tsx create mode 100644 src/shared/context/NextGraphContext.tsx rename src/{ => shared}/context/ThemeContext.tsx (100%) rename src/{ => shared}/data/features.ts (97%) rename src/{ => shared}/data/index.ts (100%) create mode 100644 src/shared/data/seedData.ts rename src/{ => shared}/data/stepDefinitions.ts (50%) rename src/{ => shared}/data/testResults.ts (100%) create mode 100644 src/shared/data/types.ts create mode 100644 src/shared/hooks/useShapeWithDefaults.ts rename src/{ => shared}/lib/utils.ts (100%) create mode 100644 src/shared/shapes/orm/festipodShapes.schema.ts create mode 100644 src/shared/shapes/orm/festipodShapes.shapeTypes.ts create mode 100644 src/shared/shapes/orm/festipodShapes.typings.ts create mode 100644 src/shared/shapes/shex/festipodShapes.shex create mode 100644 src/shared/steps/frontend/form.steps.ts rename {features/step_definitions => src/shared/steps/frontend}/navigation.steps.ts (83%) rename {features => src/shared}/support/hooks.ts (100%) rename {features => src/shared}/support/world.ts (88%) rename src/{ => shared}/types/gherkin.ts (100%) create mode 100644 src/shared/utils/ngBootstrap.ts create mode 100644 src/shared/utils/ngSession.ts diff --git a/.gitignore b/.gitignore index a14702c..b416474 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json # Finder (MacOS) folder config .DS_Store +.ng-tarballs diff --git a/.project/knowledge/architecture.md b/.project/knowledge/architecture.md new file mode 100644 index 0000000..73ebd42 --- /dev/null +++ b/.project/knowledge/architecture.md @@ -0,0 +1,84 @@ +# Architecture + +Feature-based architecture where code is organized by business domain (module), not by technical layer. + +## Module Structure + +``` +src/modules/ + event/ # 7 screens, 5 features — events CRUD, discovery, participants, meeting points + user/ # 5 screens, 11 features — profiles, friends, sharing + home/ # 2 screens — dashboard, settings + auth/ # 2 screens — login, welcome/onboarding + workshop/ # 0 screens, 6 features — workshop/atelier specs (future) + meeting/ # 0 screens, 1 feature — meeting point specs + notification/ # 0 screens, 3 features — notification specs +``` + +Each module can contain: +- `screens/` — React screen components +- `features/` — Gherkin `.feature` files (BDD specs) +- `steps/{frontend,backend,e2e}/` — Cucumber step definitions by layer + +## Import Rules + +**Modules only import from `shared/` — never from each other.** + +``` +src/modules/event/screens/EventDetailScreen.tsx + ✅ import from '../../../shared/components/sketchy' + ✅ import from '../../../shared/context/FestipodDataContext' + ✅ import from '../../../screens' (registry types) + ❌ import from '../../user/screens/...' +``` + +## Shared Layer + +`src/shared/` contains everything reusable across modules: + +| Directory | Contents | +|-----------|----------| +| `components/sketchy/` | Hand-drawn UI library (Button, Card, Avatar, Header, NavBar, etc.) | +| `components/ui/` | Shadcn/Radix components (used only in prototyping tool) | +| `context/` | ThemeContext, NextGraphContext, FestipodDataContext | +| `data/` | User stories (`index.ts`), auto-generated `features.ts`, `testResults.ts`, `seedData.ts`, `types.ts` | +| `hooks/` | `useShapeWithDefaults` (NextGraph) | +| `shapes/` | SHEX definitions + ORM TypeScript bindings | +| `utils/` | `ngSession.ts`, `ngBootstrap.ts` | +| `steps/frontend/` | Shared BDD step definitions (navigation, screen, form) | +| `support/` | Cucumber `world.ts`, `hooks.ts` | +| `types/` | `gherkin.ts` (ParsedFeature, ParsedScenario types) | +| `lib/` | `utils.ts` (cn helper for Tailwind) | + +## App Shell + +`src/app/` is the prototyping tool — not part of the Festipod app itself: + +- `App.tsx` — Root: ThemeProvider > NextGraphProvider > FestipodDataProvider > RouterProvider +- `router.tsx` — Hash-based routing: `#/` (gallery), `#/demo/{screenId}`, `#/specs/{featureId}` +- `frontend.tsx` — React entry point (referenced from `src/index.html`) +- `components/Gallery.tsx` — Screen preview grid +- `components/DemoMode.tsx` — Interactive mockup viewer with sidebar navigation +- `components/specs/` — BDD specs browser (SpecsPage, FeatureView, GherkinHighlighter) + +## Screen Registry + +`src/screens/index.ts` is the central registry that imports all screens from all modules and exports: +- `screenGroups` — Grouped by domain (Accueil, Evenements, Utilisateur, General) +- `screens` — Flat list +- `getScreen(id)` — Lookup by ID +- `ScreenProps` interface — `{ navigate: (screenId: string) => void }` + +## Entry Points + +| File | Purpose | +|------|---------| +| `src/index.ts` | Bun.serve() — HTTP server, serves index.html + cucumber report | +| `src/index.html` | HTML entry, loads `src/app/frontend.tsx` | +| `src/app/frontend.tsx` | React root, renders `` | + +## Build + +- Dev: `bun --hot src/index.ts` (via `bun run dev`) +- Prod: `bun run build.ts` — Bun bundler + Tailwind plugin → `dist/` +- Path alias: `@/*` → `./src/*` (tsconfig) diff --git a/.project/knowledge/bdd-testing.md b/.project/knowledge/bdd-testing.md new file mode 100644 index 0000000..67c81b3 --- /dev/null +++ b/.project/knowledge/bdd-testing.md @@ -0,0 +1,101 @@ +# BDD Testing + +Cucumber/Gherkin BDD specs in French with multi-layer step definitions. + +## Overview + +- 26 feature files (US-1 to US-26), all in French +- Categories: EVENT, WORKSHOP, USER, MEETING, NOTIF +- Priorities: 0 (Impossible), 1 (Haute), 2 (Moyenne), 3 (Basse) +- Current results: 51 passed, 7 failed, 75 skipped (133 scenarios total) + +## Multi-Layer BDD + +Each module has step directories for three test layers: + +``` +src/modules/event/steps/ + frontend/ # UI/screen assertions (active) + backend/ # Data layer assertions (planned) + e2e/ # Full integration (planned) +``` + +Shared steps (cross-domain) live in `src/shared/steps/frontend/`. + +## Feature Files + +Collocated with their module: + +``` +src/modules/event/features/us-13-creer-evenement.feature +src/modules/user/features/us-23-connexion-utilisateurs.feature +src/modules/workshop/features/us-1-visualiser-atelier-termine.feature +... +``` + +Tagged with `@CATEGORY @priority-N` for filtering. + +## Step Definitions + +### Shared Steps (`src/shared/steps/frontend/`) + +| File | Purpose | +|------|---------| +| `navigation.steps.ts` | Screen navigation, authentication, click/select actions, section/button/field assertions | +| `form.steps.ts` | Form field validation, required fields, import/duplicate detection | +| `screen.steps.ts` | Screen content assertions (participants, events, profiles, QR codes) | + +### How Frontend Steps Work + +Steps analyze screen **source code** (not rendered DOM): +1. `world.ts` loads screen `.tsx` file content via `loadScreenSource()` +2. Steps use regex patterns on JSX source to verify UI elements +3. `screenFileMap` in `world.ts` maps screen IDs to file paths (e.g., `'home'` → `'src/modules/home/screens/HomeScreen.tsx'`) +4. `screenFieldDetectors` define per-screen regex patterns for field verification +5. `screenExpectedContent` lists expected text content per screen + +### Screen Name Resolution + +French names in `.feature` files map to screen IDs via `screenNameMap`: +- `"accueil"` → `home` +- `"détail événement"` → `event-detail` +- `"mon profil"` → `profile` +- `"relayer un événement"` → `create-event` + +## Cucumber Configuration + +`cucumber.json`: +```json +{ + "default": { + "import": [ + "src/shared/support/**/*.ts", + "src/shared/steps/**/*.ts", + "src/modules/*/steps/**/*.ts" + ], + "paths": ["src/modules/*/features/**/*.feature"], + "language": "fr" + } +} +``` + +Requires `tsx` loader: `node --import tsx/esm node_modules/.bin/cucumber-js` + +## Auto-Generated Files + +Scripts in `scripts/` parse features and steps into TypeScript data files consumed by the prototyping tool: + +| Script | Input | Output | +|--------|-------|--------| +| `parse-features.ts` | `src/modules/*/features/*.feature` | `src/shared/data/features.ts` | +| `parse-test-results.ts` | `reports/cucumber-report.json` | `src/shared/data/testResults.ts` | +| `extract-step-definitions.ts` | `src/shared/steps/frontend/*.ts` | `src/shared/data/stepDefinitions.ts` | + +Run all: `bun run test:cucumber` + +## Adding New Steps + +1. **Module-specific**: Create in `src/modules/{module}/steps/frontend/` +2. **Cross-domain**: Add to `src/shared/steps/frontend/` +3. Import `FestipodWorld` type from `../../support/world` (shared) or adjust relative path +4. Run `bun run steps:extract` to regenerate tooltip data diff --git a/.project/knowledge/data-layer.md b/.project/knowledge/data-layer.md new file mode 100644 index 0000000..a8f526c --- /dev/null +++ b/.project/knowledge/data-layer.md @@ -0,0 +1,67 @@ +# Data Layer + +NextGraph-backed local-first data with fallback to local state for demo/disconnected mode. + +## Overview + +The app has two data modes: +1. **Connected** — NextGraph ORM shapes (P2P, encrypted, local-first) +2. **Disconnected/Demo** — Local React state seeded from `seedData.ts` + +All screens use `useFestipodData()` hook regardless of mode. + +## NextGraph Stack + +``` +@ng-org/web # Browser WASM runtime +@ng-org/orm # RDF shape-based ORM +@ng-org/shex-orm # SHEX → TypeScript code generation +@ng-org/alien-deepsignals # Reactive signals bridge +``` + +Packages installed from local tarballs in `.ng-tarballs/`. + +## SHEX Shapes + +`src/shared/shapes/shex/festipodShapes.shex` defines: +- **Event** — title, description, dates, location, themes, participants +- **UserProfile** — name, username, bio, city, visibility +- **Participation** — links event + user, confirmation status + +ORM bindings in `src/shared/shapes/orm/`: +- `festipodShapes.schema.ts` — Schema registration +- `festipodShapes.shapeTypes.ts` — Shape type constants +- `festipodShapes.typings.ts` — TypeScript interfaces + +Regenerate with `bun run build:orm`. + +## Context Providers + +### NextGraphContext (`src/shared/context/NextGraphContext.tsx`) +- Connection lifecycle: `disconnected` → `connecting` → `connected` | `error` +- Auto-initializes via `initNg()` from `src/shared/utils/ngSession.ts` +- Provides session with store IDs (private, protected, public) + +### FestipodDataContext (`src/shared/context/FestipodDataContext.tsx`) +- Wraps NextGraph shapes with `useShapeWithDefaults()` hook +- CRUD: `createEvent()`, `updateEvent()`, `joinEvent()`, `leaveEvent()`, etc. +- Exposes `useFestipodData()` hook consumed by all screens +- `selectedEventId` state for cross-screen event navigation +- Falls back to seed data when disconnected + +## Data Types + +`src/shared/data/types.ts`: +- `FpEventData` — id, title, date, location, distance, themes, etc. +- `FpUserData` — id, name, username, bio, city, counts +- `FpParticipationData` — eventId + userId + confirmed +- `FpMeetingPointData` — eventId, location, time, host (local-only) +- `FpFriendshipData` — userId + friendId (local-only) + +## Seed Data + +`src/shared/data/seedData.ts`: +- 10 users (Marie Dupont = current user, `user-1`) +- Multiple events with dates, locations, themes +- Participations, meeting points, friendships +- `CURRENT_USER_ID = 'user-1'` diff --git a/.project/knowledge/screens.md b/.project/knowledge/screens.md new file mode 100644 index 0000000..302e9d6 --- /dev/null +++ b/.project/knowledge/screens.md @@ -0,0 +1,94 @@ +# Screens + +16 mobile mockup screens using the sketchy hand-drawn component library. + +## Screen Inventory + +### Home Module (`src/modules/home/screens/`) + +| ID | Name | File | Description | +|----|------|------|-------------| +| `welcome` | Bienvenue | WelcomeScreen.tsx | Onboarding/welcome page | +| `home` | Accueil | HomeScreen.tsx | Dashboard with upcoming events, quick actions | +| `settings` | Parametres | SettingsScreen.tsx | Notifications, privacy, location settings | + +### Event Module (`src/modules/event/screens/`) + +| ID | Name | File | Description | +|----|------|------|-------------| +| `events` | Decouvrir | EventsScreen.tsx | Event discovery/search | +| `event-detail` | Detail evenement | EventDetailScreen.tsx | Event info, participants, join/leave | +| `create-event` | Relayer evenement | CreateEventScreen.tsx | Create/relay event, import from Mobilizon/Transiscope | +| `update-event` | Modifier evenement | UpdateEventScreen.tsx | Edit existing event | +| `invite` | Inviter des amis | InviteScreen.tsx | Invite contacts to event | +| `participants-list` | Liste des participants | ParticipantsListScreen.tsx | Event participant list | +| `meeting-points` | Points de rencontre | MeetingPointsScreen.tsx | Carpooling/meeting coordination | + +### User Module (`src/modules/user/screens/`) + +| ID | Name | File | Description | +|----|------|------|-------------| +| `profile` | Mon profil | ProfileScreen.tsx | Current user profile | +| `update-profile` | Modifier mon profil | UpdateProfileScreen.tsx | Edit profile form | +| `user-profile` | Profil d'un utilisateur | UserProfileScreen.tsx | View another user's profile | +| `friends-list` | Mon reseau | FriendsListScreen.tsx | Network/friends list | +| `share-profile` | Partager mon profil | ShareProfileScreen.tsx | QR code + link sharing | + +### Auth Module (`src/modules/auth/screens/`) + +| ID | Name | File | Description | +|----|------|------|-------------| +| `login` | Connexion | LoginScreen.tsx | Login (NextGraph + email fallback) | + +## Screen Registry + +`src/screens/index.ts` imports all screens and exports: + +```typescript +export interface ScreenProps { + navigate: (screenId: string) => void; +} + +export const screenGroups: ScreenGroup[] // Grouped: home, events, user, general +export const screens: Screen[] // Flat list +export function getScreen(id: string): Screen | undefined +``` + +## Sketchy Component Library + +`src/shared/components/sketchy/` — hand-drawn UI with custom font: + +| Component | Usage | +|-----------|-------| +| `Header` | Screen header with back button | +| `NavBar` | Bottom tab navigation | +| `Button` | Action buttons | +| `Card` | Content cards | +| `Input` | Text inputs | +| `Title`, `Subtitle`, `Text` | Typography | +| `Avatar` | User avatars with initials | +| `Badge` | Status/category badges | +| `Toggle`, `Checkbox` | Form controls | +| `ListItem` | List row items | +| `Divider` | Section separators | +| `Placeholder` | Image/content placeholders | +| `PhoneFrame` | Phone device frame wrapper | +| `BrokerBanner` | NextGraph connection status banner | +| `NgStatus` | Connection indicator dot | + +## Screen Patterns + +All screens follow the same pattern: + +```typescript +import { Header, Button, ... } from '../../../shared/components/sketchy'; +import { useFestipodData } from '../../../shared/context/FestipodDataContext'; +import type { ScreenProps } from '../../../screens'; + +export function MyScreen({ navigate }: ScreenProps) { + const { events, currentUser, ... } = useFestipodData(); + // render with sketchy components +} +``` + +Navigation between screens uses `navigate(screenId)` — the prototyping tool intercepts this to switch the displayed screen. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..f548e24 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,47 @@ +# Festipod + +Prototyping tool for a mobile festival/event app — mockup screens, user stories, and BDD specs. + +## Two Apps in One + +| Layer | Tech | Purpose | +|-------|------|---------| +| **Festipod App** (mockups) | React + sketchy components | 16 mobile screens with hand-drawn UI | +| **Prototyping Tool** (shell) | React + Tailwind/Shadcn | Gallery, demo viewer, BDD specs browser | + +## Architecture + +Feature-based: code organized by business domain, not technical layer. See [architecture](.project/knowledge/architecture.md). + +``` +src/modules/{event,user,home,auth,workshop,meeting,notification}/ +src/shared/ # Components, context, data — importable by all modules +src/app/ # Prototyping tool shell +src/screens/index.ts # Screen registry +``` + +## Data Layer + +NextGraph (P2P/local-first) with SHEX shapes and ORM. See [data-layer](.project/knowledge/data-layer.md). + +## BDD Testing + +Multi-layer Cucumber/Gherkin in French. See [bdd-testing](.project/knowledge/bdd-testing.md). + +## Quick Start + +```bash +bun run dev # Dev server with HMR (port 3000) +bun run build # Production build to dist/ +bun run test:cucumber # Run all BDD tests +bun run features:parse # Regenerate features.ts from .feature files +bun run steps:extract # Extract step definitions for tooltips +bun run build:orm # Regenerate ORM from SHEX shapes +``` + +## Documentation + +- [Architecture](.project/knowledge/architecture.md) — module structure, import rules, app shell +- [Data Layer](.project/knowledge/data-layer.md) — NextGraph, shapes, context, seed data +- [BDD Testing](.project/knowledge/bdd-testing.md) — Cucumber setup, step layers, feature files +- [Screens](.project/knowledge/screens.md) — screen inventory, registry, sketchy components diff --git a/CLAUDE.md b/CLAUDE.md index 2bbd888..3cefacd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,25 +1,70 @@ +@AGENTS.md + # Festipod Project This project has two parts: -1. **Festipod App** - Mobile app mockups in `src/screens/` with sketchy hand-drawn UI +1. **Festipod App** - Mobile app mockups with sketchy hand-drawn UI 2. **Prototyping Tool** - Web app to view mockups, user stories, and BDD specs +## Architecture + +Feature-based architecture: code is organized by business domain (module), not by technical layer. A module can only import from `shared/` — never from another module. + +Multi-layer BDD: each module has `steps/frontend/`, `steps/backend/`, `steps/e2e/` directories. Shared step definitions live in `src/shared/steps/`. + ## Project Structure ``` src/ - screens/ # Mockup screens (HomeScreen, EventDetailScreen, etc.) - components/ - sketchy/ # Hand-drawn UI components (Button, Card, Avatar, etc.) - specs/ # Specs viewer (GherkinHighlighter, FeatureView, etc.) - ui/ # Shadcn/Radix components - data/ - index.ts # User stories definitions - features.ts # Auto-generated from .feature files - testResults.ts # Cucumber test results -features/ # Gherkin .feature files (French) -scripts/ # Build scripts for parsing features -docs/ # Documentation + modules/ # Business domain modules + event/ # Events (create, discover, detail, update, invite, participants, meeting points) + screens/ # EventsScreen, EventDetailScreen, CreateEventScreen, etc. + features/ # Gherkin .feature files for this domain + steps/ # BDD step definitions + frontend/ # Frontend-layer steps + backend/ # Backend-layer steps (planned) + e2e/ # E2E steps (planned) + user/ # User profiles, friends, sharing + screens/ # ProfileScreen, FriendsListScreen, ShareProfileScreen, etc. + features/ + steps/ + home/ # Home dashboard, settings + screens/ # HomeScreen, SettingsScreen + auth/ # Authentication, onboarding + screens/ # LoginScreen, WelcomeScreen + workshop/ # Workshop/atelier specs (no screens yet) + features/ + steps/ + meeting/ # Meeting point specs + features/ + steps/ + notification/ # Notification specs + features/ + steps/ + shared/ # Shared code (importable by all modules) + components/ + sketchy/ # Hand-drawn UI components (Button, Card, Avatar, etc.) + ui/ # Shadcn/Radix components + context/ # ThemeContext, NextGraphContext, FestipodDataContext + data/ # User stories, features.ts (auto-generated), testResults.ts + hooks/ # Custom hooks (useShapeWithDefaults) + shapes/ # SHEX shapes + ORM bindings (NextGraph) + utils/ # ngSession, ngBootstrap + steps/ # Shared BDD step definitions (cross-domain) + frontend/ # navigation.steps.ts, form.steps.ts, screen.steps.ts + backend/ + support/ # Cucumber hooks.ts, world.ts + types/ # TypeScript type definitions + lib/ # Utility functions (cn, etc.) + app/ # Prototyping tool (app shell) + App.tsx # Root component with providers + router.tsx # Hash-based routing + frontend.tsx # React entry point + components/ # Gallery, DemoMode, ThemeToggle, specs/ + screens/ + index.ts # Screen registry (imports from all modules) +scripts/ # Build scripts for parsing features +docs/ # Documentation ``` ## Key Commands diff --git a/bun.lock b/bun.lock index 2e6e468..16561a8 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,10 @@ "": { "name": "bun-react-template", "dependencies": { + "@ng-org/orm": ".ng-tarballs/ng-org-orm-0.1.2-alpha.15.tgz", + "@ng-org/alien-deepsignals": ".ng-tarballs/ng-org-alien-deepsignals-0.1.2-alpha.11.tgz", + "@ng-org/shex-orm": ".ng-tarballs/ng-org-shex-orm-0.1.2-alpha.7.tgz", + "@ng-org/web": ".ng-tarballs/ng-org-web-0.1.2-alpha.11.tgz", "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-slot": "^1.2.3", @@ -34,25 +38,25 @@ }, }, "packages": { - "@babel/code-frame": ["@babel/code-frame@7.28.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q=="], + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], - "@cucumber/ci-environment": ["@cucumber/ci-environment@12.0.0", "", {}, "sha512-SqCEnbCNl3zCXCFpqGUuoaSNhLC0jLw4tKeFcAxTw9MD/QRlJjeAC/fyvVLFuXuSq0OunJlFfxLu+Z3HE+oLPg=="], + "@cucumber/ci-environment": ["@cucumber/ci-environment@13.0.0", "", {}, "sha512-cs+3NzfNkGbcmHPddjEv4TKFiBpZRQ6WJEEufB9mw+ExS22V/4R/zpDSEG+fsJ/iSNCd6A2sATdY8PFOyY3YnA=="], - "@cucumber/cucumber": ["@cucumber/cucumber@12.5.0", "", { "dependencies": { "@cucumber/ci-environment": "12.0.0", "@cucumber/cucumber-expressions": "18.0.1", "@cucumber/gherkin": "37.0.1", "@cucumber/gherkin-streams": "6.0.0", "@cucumber/gherkin-utils": "10.0.0", "@cucumber/html-formatter": "22.3.0", "@cucumber/junit-xml-formatter": "0.9.0", "@cucumber/message-streams": "4.0.1", "@cucumber/messages": "31.1.0", "@cucumber/pretty-formatter": "1.0.1", "@cucumber/tag-expressions": "8.1.0", "assertion-error-formatter": "^3.0.0", "capital-case": "^1.0.4", "chalk": "^4.1.2", "cli-table3": "0.6.5", "commander": "^14.0.0", "debug": "^4.3.4", "error-stack-parser": "^2.1.4", "figures": "^3.2.0", "glob": "^13.0.0", "has-ansi": "^4.0.1", "indent-string": "^4.0.0", "is-installed-globally": "^0.4.0", "is-stream": "^2.0.0", "knuth-shuffle-seeded": "^1.0.6", "lodash.merge": "^4.6.2", "lodash.mergewith": "^4.6.2", "luxon": "3.7.2", "mime": "^3.0.0", "mkdirp": "^3.0.0", "mz": "^2.7.0", "progress": "^2.0.3", "read-package-up": "^12.0.0", "semver": "7.7.3", "string-argv": "0.3.1", "supports-color": "^8.1.1", "type-fest": "^4.41.0", "util-arity": "^1.1.0", "yaml": "^2.2.2", "yup": "1.7.1" }, "bin": { "cucumber-js": "bin/cucumber.js" } }, "sha512-+VWxkIIpm5EWFfaF3grP1GlHobzlDBIF54FqJutdYmfpx3LJc+IS8uWdIN97m6zxizo5CPrUopTWkxzwVswUzg=="], + "@cucumber/cucumber": ["@cucumber/cucumber@12.7.0", "", { "dependencies": { "@cucumber/ci-environment": "13.0.0", "@cucumber/cucumber-expressions": "19.0.0", "@cucumber/gherkin": "38.0.0", "@cucumber/gherkin-streams": "6.0.0", "@cucumber/gherkin-utils": "11.0.0", "@cucumber/html-formatter": "23.0.0", "@cucumber/junit-xml-formatter": "0.9.0", "@cucumber/message-streams": "4.0.1", "@cucumber/messages": "32.0.1", "@cucumber/pretty-formatter": "1.0.1", "@cucumber/tag-expressions": "9.1.0", "assertion-error-formatter": "^3.0.0", "capital-case": "^1.0.4", "chalk": "^4.1.2", "cli-table3": "0.6.5", "commander": "^14.0.0", "debug": "^4.3.4", "error-stack-parser": "^2.1.4", "figures": "^3.2.0", "glob": "^13.0.0", "has-ansi": "^4.0.1", "indent-string": "^4.0.0", "is-installed-globally": "^0.4.0", "is-stream": "^2.0.0", "knuth-shuffle-seeded": "^1.0.6", "lodash.merge": "^4.6.2", "lodash.mergewith": "^4.6.2", "luxon": "3.7.2", "mime": "^3.0.0", "mkdirp": "^3.0.0", "mz": "^2.7.0", "progress": "^2.0.3", "read-package-up": "^12.0.0", "semver": "7.7.4", "string-argv": "0.3.1", "supports-color": "^8.1.1", "type-fest": "^4.41.0", "util-arity": "^1.1.0", "yaml": "^2.2.2", "yup": "1.7.1" }, "bin": { "cucumber-js": "bin/cucumber.js" } }, "sha512-7A/9CJpJDxv1SQ7hAZU0zPn2yRxx6XMR+LO4T94Enm3cYNWsEEj+RGX38NLX4INT+H6w5raX3Csb/qs4vUBsOA=="], - "@cucumber/cucumber-expressions": ["@cucumber/cucumber-expressions@18.0.1", "", { "dependencies": { "regexp-match-indices": "1.0.2" } }, "sha512-NSid6bI+7UlgMywl5octojY5NXnxR9uq+JisjOrO52VbFsQM6gTWuQFE8syI10KnIBEdPzuEUSVEeZ0VFzRnZA=="], + "@cucumber/cucumber-expressions": ["@cucumber/cucumber-expressions@19.0.0", "", { "dependencies": { "regexp-match-indices": "1.0.2" } }, "sha512-4FKoOQh2Uf6F6/Ln+1OxuK8LkTg6PyAqekhf2Ix8zqV2M54sH+m7XNJNLhOFOAW/t9nxzRbw2CcvXbCLjcvHZg=="], "@cucumber/gherkin": ["@cucumber/gherkin@29.0.0", "", { "dependencies": { "@cucumber/messages": "<=25" } }, "sha512-6t3V7fFsLlyhLSj4FS+fPz22pPVcFhFZ3QOP7otFYmkhZ4g1ierj5pf7fxJWvEsI555hGatg+Iql6cqK93RFUg=="], "@cucumber/gherkin-streams": ["@cucumber/gherkin-streams@6.0.0", "", { "dependencies": { "commander": "14.0.0", "source-map-support": "0.5.21" }, "peerDependencies": { "@cucumber/gherkin": ">=22.0.0", "@cucumber/message-streams": ">=4.0.0", "@cucumber/messages": ">=17.1.1" }, "bin": { "gherkin-javascript": "bin/gherkin" } }, "sha512-HLSHMmdDH0vCr7vsVEURcDA4WwnRLdjkhqr6a4HQ3i4RFK1wiDGPjBGVdGJLyuXuRdJpJbFc6QxHvT8pU4t6jw=="], - "@cucumber/gherkin-utils": ["@cucumber/gherkin-utils@10.0.0", "", { "dependencies": { "@cucumber/gherkin": "^34.0.0", "@cucumber/messages": "^29.0.0", "@teppeis/multimaps": "3.0.0", "commander": "14.0.0", "source-map-support": "^0.5.21" }, "bin": { "gherkin-utils": "bin/gherkin-utils" } }, "sha512-BcujlDT343GXXNrMPl3ws6Il3zs8dQw3Yp/d3HnOJF8i2snGGgiapoTbko7MdvAt7ivDL7SDo+e1d5Cnpl3llA=="], + "@cucumber/gherkin-utils": ["@cucumber/gherkin-utils@11.0.0", "", { "dependencies": { "@cucumber/gherkin": "^38.0.0", "@cucumber/messages": "^32.0.0", "@teppeis/multimaps": "3.0.0", "commander": "14.0.2", "source-map-support": "^0.5.21" }, "bin": { "gherkin-utils": "bin/gherkin-utils" } }, "sha512-LJ+s4+TepHTgdKWDR4zbPyT7rQjmYIcukTwNbwNwgqr6i8Gjcmzf6NmtbYDA19m1ZFg6kWbFsmHnj37ZuX+kZA=="], - "@cucumber/html-formatter": ["@cucumber/html-formatter@22.3.0", "", { "peerDependencies": { "@cucumber/messages": ">=18" } }, "sha512-0s3G7kznCRDiiesQ4K0yBdswGqU9E0j2AWUug41NpedBzhaY+Hn192ANRF597GZtuWrCjE53aFb3fOyOsT8B+g=="], + "@cucumber/html-formatter": ["@cucumber/html-formatter@23.0.0", "", { "peerDependencies": { "@cucumber/messages": ">=18" } }, "sha512-WwcRzdM8Ixy4e53j+Frm3fKM5rNuIyWUfy4HajEN+Xk/YcjA6yW0ACGTFDReB++VDZz/iUtwYdTlPRY36NbqJg=="], "@cucumber/junit-xml-formatter": ["@cucumber/junit-xml-formatter@0.9.0", "", { "dependencies": { "@cucumber/query": "^14.0.1", "@teppeis/multimaps": "^3.0.0", "luxon": "^3.5.0", "xmlbuilder": "^15.1.1" }, "peerDependencies": { "@cucumber/messages": "*" } }, "sha512-WF+A7pBaXpKMD1i7K59Nk5519zj4extxY4+4nSgv5XLsGXHDf1gJnb84BkLUzevNtp2o2QzMG0vWLwSm8V5blw=="], @@ -64,93 +68,103 @@ "@cucumber/query": ["@cucumber/query@14.7.0", "", { "dependencies": { "@teppeis/multimaps": "3.0.0", "lodash.sortby": "^4.7.0" }, "peerDependencies": { "@cucumber/messages": "*" } }, "sha512-fiqZ4gMEgYjmbuWproF/YeCdD5y+gD2BqgBIGbpihOsx6UlNsyzoDSfO+Tny0q65DxfK+pHo2UkPyEl7dO7wmQ=="], - "@cucumber/tag-expressions": ["@cucumber/tag-expressions@8.1.0", "", {}, "sha512-UFeOVUyc711/E7VHjThxMwg3jbGod9TlbM1gxNixX/AGDKg82Eha4cE0tKki3GGUs7uB2NyI+hQAuhB8rL2h5A=="], + "@cucumber/tag-expressions": ["@cucumber/tag-expressions@9.1.0", "", {}, "sha512-bvHjcRFZ+J1TqIa9eFNO1wGHqwx4V9ZKV3hYgkuK/VahHx73uiP4rKV3JVrvWSMrwrFvJG6C8aEwnCWSvbyFdQ=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.27.2", "", { "os": "android", "cpu": "arm" }, "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.2", "", { "os": "android", "cpu": "arm64" }, "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.27.2", "", { "os": "android", "cpu": "x64" }, "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.2", "", { "os": "linux", "cpu": "arm" }, "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.2", "", { "os": "none", "cpu": "arm64" }, "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.2", "", { "os": "none", "cpu": "x64" }, "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.2", "", { "os": "none", "cpu": "arm64" }, "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.2", "", { "os": "win32", "cpu": "x64" }, "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], - "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], + "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], - "@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], + "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="], - "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.6", "", { "dependencies": { "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="], + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="], - "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], - "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], + "@ldo/traverser-shexj": ["@ldo/traverser-shexj@1.0.0-alpha.28", "", { "dependencies": { "@ldo/type-traverser": "^1.0.0-alpha.28" } }, "sha512-N06+LOWhv6//unPRLbFMd56MqPf5lO2ihZgle9hNLmxt6QJmNrZM3oXzHCL3TfDu4OT1/NUZp3kj2HmztQIZkg=="], - "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], + "@ldo/type-traverser": ["@ldo/type-traverser@1.0.0-alpha.28", "", { "dependencies": { "uuid": "^8.3.2" } }, "sha512-pGMIVxLzoLjYVhADuVhg6r5ZDNleXZ9DcyIvLXo1/ADEocLnysg/Xjk9D/7l/Rw3WtDJrTFOOtBv8OnH+VPgKA=="], - "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.3.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-27rypIapNkYboOSylkf1tD9UW9Ado2I+P1NBL46Qz29KmOjTL6WuJ7mHDC5O66CYxlOkF5r93NPDAC3lFHYBXw=="], + "@ng-org/alien-deepsignals": ["@ng-org/alien-deepsignals@.ng-tarballs/ng-org-alien-deepsignals-0.1.2-alpha.11.tgz", { "dependencies": { "alien-signals": "^2.0.7" }, "peerDependencies": { "react": "^19.0.0 || ^18.0.0", "svelte": "^5.0.0 || ^4.0.0", "vue": "^3.0.0" }, "optionalPeers": ["react", "svelte", "vue"] }], - "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.3.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-I82xGzPkBxzBKgbl8DsA0RfMQCWTWjNmLjIEkW1ECiv3qK02kHGQ5FGUr/29L/SuvnGsULW4tBTRNZiMzL37nA=="], + "@ng-org/orm": ["@ng-org/orm@.ng-tarballs/ng-org-orm-0.1.2-alpha.15.tgz", { "dependencies": { "@ng-org/alien-deepsignals": "0.1.2-alpha.11" }, "peerDependencies": { "react": "^19.0.0 || ^18.0.0", "svelte": "^5.0.0 || ^4.0.0", "vue": "^3.0.0" }, "optionalPeers": ["react", "svelte", "vue"] }], - "@oven/bun-darwin-x64-baseline": ["@oven/bun-darwin-x64-baseline@1.3.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-nqtr+pTsHqusYpG2OZc6s+AmpWDB/FmBvstrK0y5zkti4OqnCuu7Ev2xNjS7uyb47NrAFF40pWqkpaio5XEd7w=="], + "@ng-org/shex-orm": ["@ng-org/shex-orm@.ng-tarballs/ng-org-shex-orm-0.1.2-alpha.7.tgz", { "dependencies": { "@ldo/traverser-shexj": "1.0.0-alpha.28", "@ldo/type-traverser": "1.0.0-alpha.28", "@shexjs/parser": "^1.0.0-alpha.24", "commander": "^14.0.1", "dts-dom": "~3.6.0", "ejs": "^3.1.8", "fs-extra": "^10.1.0", "jsonld2graphobject": "^0.0.5", "loading-cli": "^1.1.0", "prettier": "^3.0.3" }, "bin": { "rdf-orm": "./dist/cli.js" } }], - "@oven/bun-linux-aarch64": ["@oven/bun-linux-aarch64@1.3.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-YaQEAYjBanoOOtpqk/c5GGcfZIyxIIkQ2m1TbHjedRmJNwxzWBhGinSARFkrRIc3F8pRIGAopXKvJ/2rjN1LzQ=="], + "@ng-org/web": ["@ng-org/web@.ng-tarballs/ng-org-web-0.1.2-alpha.11.tgz", { "dependencies": { "async-proxy": "^0.4.1" } }], - "@oven/bun-linux-aarch64-musl": ["@oven/bun-linux-aarch64-musl@1.3.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-FR+iJt17rfFgYgpxL3M67AUwujOgjw52ZJzB9vElI5jQXNjTyOKf8eH4meSk4vjlYF3h/AjKYd6pmN0OIUlVKQ=="], + "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.3.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-PXgg5gqcS/rHwa1hF0JdM1y5TiyejVrMHoBmWY/DjtfYZoFTXie1RCFOkoG0b5diOOmUcuYarMpH7CSNTqwj+w=="], - "@oven/bun-linux-x64": ["@oven/bun-linux-x64@1.3.6", "", { "os": "linux", "cpu": "x64" }, "sha512-egfngj0dfJ868cf30E7B+ye9KUWSebYxOG4l9YP5eWeMXCtenpenx0zdKtAn9qxJgEJym5AN6trtlk+J6x8Lig=="], + "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.3.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-Nhssuh7GBpP5PiDSOl3+qnoIG7PJo+ec2oomDevnl9pRY6x6aD2gRt0JE+uf+A8Om2D6gjeHCxjEdrw5ZHE8mA=="], - "@oven/bun-linux-x64-baseline": ["@oven/bun-linux-x64-baseline@1.3.6", "", { "os": "linux", "cpu": "x64" }, "sha512-jRmnX18ak8WzqLrex3siw0PoVKyIeI5AiCv4wJLgSs7VKfOqrPycfHIWfIX2jdn7ngqbHFPzI09VBKANZ4Pckg=="], + "@oven/bun-darwin-x64-baseline": ["@oven/bun-darwin-x64-baseline@1.3.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-w1gaTlqU0IJCmJ1X+PGHkdNU1n8Gemx5YKkjhkJIguvFINXEBB5U1KG82QsT65Tk4KyNMfbLTlmy4giAvUoKfA=="], - "@oven/bun-linux-x64-musl": ["@oven/bun-linux-x64-musl@1.3.6", "", { "os": "linux", "cpu": "x64" }, "sha512-YeXcJ9K6vJAt1zSkeA21J6pTe7PgDMLTHKGI3nQBiMYnYf7Ob3K+b/ChSCznrJG7No5PCPiQPg4zTgA+BOTmSA=="], + "@oven/bun-linux-aarch64": ["@oven/bun-linux-aarch64@1.3.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-OUgPHfL6+PM2Q+tFZjcaycN3D7gdQdYlWnwMI31DXZKY1r4HINWk9aEz9t/rNaHg65edwNrt7dsv9TF7xK8xIA=="], - "@oven/bun-linux-x64-musl-baseline": ["@oven/bun-linux-x64-musl-baseline@1.3.6", "", { "os": "linux", "cpu": "x64" }, "sha512-7FjVnxnRTp/AgWqSQRT/Vt9TYmvnZ+4M+d9QOKh/Lf++wIFXFGSeAgD6bV1X/yr2UPVmZDk+xdhr2XkU7l2v3w=="], + "@oven/bun-linux-aarch64-musl": ["@oven/bun-linux-aarch64-musl@1.3.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-Ui5pAgM7JE9MzHokF0VglRMkbak3lTisY4Mf1AZutPACXWgKJC5aGrgnHBfkl7QS6fEeYb0juy1q4eRznRHOsw=="], - "@oven/bun-windows-x64": ["@oven/bun-windows-x64@1.3.6", "", { "os": "win32", "cpu": "x64" }, "sha512-Sr1KwUcbB0SEpnSPO22tNJppku2khjFluEst+mTGhxHzAGQTQncNeJxDnt3F15n+p9Q+mlcorxehd68n1siikQ=="], + "@oven/bun-linux-x64": ["@oven/bun-linux-x64@1.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-bzUgYj/PIZziB/ZesIP9HUyfvh6Vlf3od+TrbTTyVEuCSMKzDPQVW/yEbRp0tcHO3alwiEXwJDrWrHAguXlgiQ=="], - "@oven/bun-windows-x64-baseline": ["@oven/bun-windows-x64-baseline@1.3.6", "", { "os": "win32", "cpu": "x64" }, "sha512-PFUa7JL4lGoyyppeS4zqfuoXXih+gSE0XxhDMrCPVEUev0yhGNd/tbWBvcdpYnUth80owENoGjc8s5Knopv9wA=="], + "@oven/bun-linux-x64-baseline": ["@oven/bun-linux-x64-baseline@1.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-oqvMDYpX6dGJO03HgO5bXuccEsH3qbdO3MaAiAlO4CfkBPLUXz3N0DDElg5hz0L6ktdDVKbQVE5lfe+LAUISQg=="], + + "@oven/bun-linux-x64-musl": ["@oven/bun-linux-x64-musl@1.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-poVXvOShekbexHq45b4MH/mRjQKwACAC8lHp3Tz/hEDuz0/20oncqScnmKwzhBPEpqJvydXficXfBYuSim8opw=="], + + "@oven/bun-linux-x64-musl-baseline": ["@oven/bun-linux-x64-musl-baseline@1.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-/hOZ6S1VsTX6vtbhWVL9aAnOrdpuO54mAGUWpTdMz7dFG5UBZ/VUEiK0pBkq9A1rlBk0GeD/6Y4NBFl8Ha7cRA=="], + + "@oven/bun-windows-aarch64": ["@oven/bun-windows-aarch64@1.3.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-GXbz2swvN2DLw2dXZFeedMxSJtI64xQ9xp9Eg7Hjejg6mS2E4dP1xoQ2yAo2aZPi/2OBPAVaGzppI2q20XumHA=="], + + "@oven/bun-windows-x64": ["@oven/bun-windows-x64@1.3.10", "", { "os": "win32", "cpu": "x64" }, "sha512-qaS1In3yfC/Z/IGQriVmF8GWwKuNqiw7feTSJWaQhH5IbL6ENR+4wGNPniZSJFaM/SKUO0e/YCRdoVBvgU4C1g=="], + + "@oven/bun-windows-x64-baseline": ["@oven/bun-windows-x64-baseline@1.3.10", "", { "os": "win32", "cpu": "x64" }, "sha512-gh3UAHbUdDUG6fhLc1Csa4IGdtghue6U8oAIXWnUqawp6lwb3gOCRvp25IUnLF5vUHtgfMxuEUYV7YA2WxVutw=="], "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], @@ -210,24 +224,54 @@ "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + "@rdfjs/types": ["@rdfjs/types@1.1.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-wqpOJK1QCbmsGNtyzYnojPU8gRDPid2JO0Q0kMtb4j65xhCK880cnKAfEOwC+dX85VJcCByQx5zOwyyfCjDJsg=="], + + "@shexjs/parser": ["@shexjs/parser@1.0.0-alpha.28", "", { "dependencies": { "@shexjs/util": "^1.0.0-alpha.28", "@ts-jison/parser": "^0.4.1-alpha.1" } }, "sha512-eeVeHq/2JG9X+3h7y+7EmuBSWWl2EMj/EQBLk5CTRx4W4hWDdjWczsY8RWwKjkIzLwUS1+G0aiAI1u5LHCZ2Rw=="], + + "@shexjs/term": ["@shexjs/term@1.0.0-alpha.27", "", { "dependencies": { "@types/shexj": "^2.1.6", "rdf-data-factory": "^1.1.2", "relativize-url": "^0.1.0" } }, "sha512-+D7P7pglRPTZC2RkwaQuq+cgBZImx+61JZtcN77uEJVqcGaIscQK5hScsKhAPIo16/I+4jhIUCEFojXqw6otpg=="], + + "@shexjs/util": ["@shexjs/util@1.0.0-alpha.28", "", { "dependencies": { "@shexjs/term": "^1.0.0-alpha.27", "@shexjs/visitor": "^1.0.0-alpha.27", "@types/shexj": "^2.1.6", "hierarchy-closure": "^1.2.2", "sync-request": "^6.1.0" } }, "sha512-L8pBokTU/5eNRJPkC8R9SIgPw6/JDh/bHKdV5TZzf8/FkOMNJwKIy6UDHXM1I8FJ+c8u2gOOHp2MA+7b+md+0A=="], + + "@shexjs/visitor": ["@shexjs/visitor@1.0.0-alpha.27", "", {}, "sha512-9s67A+f0ZZNw/SNxqoi1483CqUca8dbnHM6WDWsRH4+eXlQpQqwOZDxA8uKEaWeX4VcDrDwzWpr0WvK6EyDWIQ=="], + "@teppeis/multimaps": ["@teppeis/multimaps@3.0.0", "", {}, "sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q=="], - "@types/bun": ["@types/bun@1.3.6", "", { "dependencies": { "bun-types": "1.3.6" } }, "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="], + "@ts-jison/common": ["@ts-jison/common@0.4.1-alpha.1", "", {}, "sha512-SDbHzq+UMD+V3ciKVBHwCEgVqSeyQPTCjOsd/ZNTGySUVg4x3EauR9ZcEfdVFAsYRR38XWgDI+spq5LDY46KvQ=="], + + "@ts-jison/lexer": ["@ts-jison/lexer@0.4.1-alpha.1", "", { "dependencies": { "@ts-jison/common": "^0.4.1-alpha.1" } }, "sha512-5C1Wr+wixAzn2MOFtgy7KbT6N6j9mhmbjAtyvOqZKsikKtNOQj22MM5HxT+ooRexG2NbtxnDSXYdhHR1Lg58ow=="], + + "@ts-jison/parser": ["@ts-jison/parser@0.4.1-alpha.1", "", { "dependencies": { "@ts-jison/common": "^0.4.1-alpha.1", "@ts-jison/lexer": "^0.4.1-alpha.1" } }, "sha512-xNj+qOez/7dju44LlYiTlCjxMzW5oek9EckUAElfln/GBK9vgMSk0swWcnacMr0TYbGjUQuXvL2wEgmDf5WajQ=="], + + "@types/bun": ["@types/bun@1.3.10", "", { "dependencies": { "bun-types": "1.3.10" } }, "sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ=="], "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], + "@types/concat-stream": ["@types/concat-stream@1.6.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA=="], + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], - "@types/node": ["@types/node@25.0.9", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="], + "@types/form-data": ["@types/form-data@0.0.33", "", { "dependencies": { "@types/node": "*" } }, "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw=="], + + "@types/http-link-header": ["@types/http-link-header@1.0.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-snm5oLckop0K3cTDAiBnZDy6ncx9DJ3mCRDvs42C884MbVYPP74Tiq2hFsSDRTyjK6RyDYDIulPiW23ge+g5Lw=="], + + "@types/jsonld": ["@types/jsonld@1.5.15", "", {}, "sha512-PlAFPZjL+AuGYmwlqwKEL0IMP8M8RexH0NIPGfCVWSQ041H2rR/8OlyZSD7KsCVoN8vCfWdtWDBxX8yBVP+xow=="], + + "@types/node": ["@types/node@25.4.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw=="], "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], - "@types/react": ["@types/react@19.2.8", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg=="], + "@types/qs": ["@types/qs@6.15.0", "", {}, "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow=="], + + "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + "@types/shexj": ["@types/shexj@2.1.7", "", {}, "sha512-pu/0vIZxFTMPVjTlo5MJKFkBL/EbAuFhtCXpmBB7ZdUiyNpc6pt8GxfyRPqdf6q2SsWu71a/vbhvGK2IZN2Eug=="], + "@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="], + "alien-signals": ["alien-signals@2.0.8", "", {}, "sha512-844G1VLkk0Pe2SJjY0J8vp8ADI73IM4KliNu2OGlYzWpO28NexEUvjHTcFjFX3VXoiUtwTbHxLNI9ImkcoBqzA=="], + "ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], @@ -236,20 +280,38 @@ "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], "assertion-error-formatter": ["assertion-error-formatter@3.0.0", "", { "dependencies": { "diff": "^4.0.1", "pad-right": "^0.2.2", "repeat-string": "^1.6.1" } }, "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ=="], + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "async-proxy": ["async-proxy@0.4.1", "", { "dependencies": { "object-path-operator": "^3.0.0" } }, "sha512-4e+zNtoGL4+cnqib8v169CnKcRfAsAubp2EsjBhAA5jyW7jjI3t36rVvuqLwmhtliwf8JvSnxinE4ecQN+DK4w=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - "bun": ["bun@1.3.6", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.3.6", "@oven/bun-darwin-x64": "1.3.6", "@oven/bun-darwin-x64-baseline": "1.3.6", "@oven/bun-linux-aarch64": "1.3.6", "@oven/bun-linux-aarch64-musl": "1.3.6", "@oven/bun-linux-x64": "1.3.6", "@oven/bun-linux-x64-baseline": "1.3.6", "@oven/bun-linux-x64-musl": "1.3.6", "@oven/bun-linux-x64-musl-baseline": "1.3.6", "@oven/bun-windows-x64": "1.3.6", "@oven/bun-windows-x64-baseline": "1.3.6" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bunx.exe" } }, "sha512-Tn98GlZVN2WM7+lg/uGn5DzUao37Yc0PUz7yzYHdeF5hd+SmHQGbCUIKE4Sspdgtxn49LunK3mDNBC2Qn6GJjw=="], + "bun": ["bun@1.3.10", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.3.10", "@oven/bun-darwin-x64": "1.3.10", "@oven/bun-darwin-x64-baseline": "1.3.10", "@oven/bun-linux-aarch64": "1.3.10", "@oven/bun-linux-aarch64-musl": "1.3.10", "@oven/bun-linux-x64": "1.3.10", "@oven/bun-linux-x64-baseline": "1.3.10", "@oven/bun-linux-x64-musl": "1.3.10", "@oven/bun-linux-x64-musl-baseline": "1.3.10", "@oven/bun-windows-aarch64": "1.3.10", "@oven/bun-windows-x64": "1.3.10", "@oven/bun-windows-x64-baseline": "1.3.10" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bunx.exe" } }, "sha512-S/CXaXXIyA4CMjdMkYQ4T2YMqnAn4s0ysD3mlsY4bUiOCqGlv28zck4Wd4H4kpvbekx15S9mUeLQ7Uxd0tYTLA=="], "bun-plugin-tailwind": ["bun-plugin-tailwind@0.1.2", "", { "peerDependencies": { "bun": ">=1.0.0" } }, "sha512-41jNC1tZRSK3s1o7pTNrLuQG8kL/0vR/JgiTmZAJ1eHwe0w5j6HFPKeqEk0WAD13jfrUC7+ULuewFBBCoADPpg=="], - "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="], + "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], "capital-case": ["capital-case@1.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A=="], + "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], + "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -266,50 +328,110 @@ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - "commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="], + "colors-cli": ["colors-cli@1.0.33", "", { "bin": { "colors": "bin/colors" } }, "sha512-PWGsmoJFdOB0t+BeHgmtuoRZUQucOLl5ii81NBzOOGVxlgE04muFNHlR5j8i8MKbOPELBl3243AI6lGBTj5ICQ=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], + + "concat-stream": ["concat-stream@1.6.2", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], - "diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], + "diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], + + "dts-dom": ["dts-dom@3.6.0", "", {}, "sha512-on5jxTgt+A6r0Zyyz6ZRHXaAO7J1VPnOd6+AmvI1vH440AlAZZNc5rUHzgPuTjGlrVr1rOWQYNl7ZJK6rDohbw=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], - "esbuild": ["esbuild@0.27.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.2", "@esbuild/android-arm": "0.27.2", "@esbuild/android-arm64": "0.27.2", "@esbuild/android-x64": "0.27.2", "@esbuild/darwin-arm64": "0.27.2", "@esbuild/darwin-x64": "0.27.2", "@esbuild/freebsd-arm64": "0.27.2", "@esbuild/freebsd-x64": "0.27.2", "@esbuild/linux-arm": "0.27.2", "@esbuild/linux-arm64": "0.27.2", "@esbuild/linux-ia32": "0.27.2", "@esbuild/linux-loong64": "0.27.2", "@esbuild/linux-mips64el": "0.27.2", "@esbuild/linux-ppc64": "0.27.2", "@esbuild/linux-riscv64": "0.27.2", "@esbuild/linux-s390x": "0.27.2", "@esbuild/linux-x64": "0.27.2", "@esbuild/netbsd-arm64": "0.27.2", "@esbuild/netbsd-x64": "0.27.2", "@esbuild/openbsd-arm64": "0.27.2", "@esbuild/openbsd-x64": "0.27.2", "@esbuild/openharmony-arm64": "0.27.2", "@esbuild/sunos-x64": "0.27.2", "@esbuild/win32-arm64": "0.27.2", "@esbuild/win32-ia32": "0.27.2", "@esbuild/win32-x64": "0.27.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], + "filelist": ["filelist@1.0.6", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA=="], + "find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="], + "form-data": ["form-data@2.5.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="], + + "fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], - "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], + "get-port": ["get-port@3.2.0", "", {}, "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg=="], - "glob": ["glob@13.0.0", "", { "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", "path-scurry": "^2.0.0" } }, "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA=="], + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], + + "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "global-dirs": ["global-dirs@3.0.1", "", { "dependencies": { "ini": "2.0.0" } }, "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA=="], + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "happy-dom": ["happy-dom@16.8.1", "", { "dependencies": { "webidl-conversions": "^7.0.0", "whatwg-mimetype": "^3.0.0" } }, "sha512-n0QrmT9lD81rbpKsyhnlz3DgnMZlaOkJPpgi746doA+HvaMC79bdWkwjrNnGJRvDrWTI8iOcJiVTJ5CdT/AZRw=="], "has-ansi": ["has-ansi@4.0.1", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hierarchy-closure": ["hierarchy-closure@1.2.2", "", {}, "sha512-ZqZvsA6HyMqrmm49D3llYA8x8hqdyDDEkaTXcqwyO+fGQlzxoeXws/5ze11M40s4EoTw7GFxdTKIwj5YDOicLQ=="], + "hosted-git-info": ["hosted-git-info@9.0.2", "", { "dependencies": { "lru-cache": "^11.1.0" } }, "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg=="], + "http-basic": ["http-basic@8.1.3", "", { "dependencies": { "caseless": "^0.12.0", "concat-stream": "^1.6.2", "http-response-object": "^3.0.1", "parse-cache-control": "^1.0.1" } }, "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw=="], + + "http-link-header": ["http-link-header@1.1.3", "", {}, "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ=="], + + "http-response-object": ["http-response-object@3.0.2", "", { "dependencies": { "@types/node": "^10.0.3" } }, "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA=="], + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], "index-to-position": ["index-to-position@1.2.0", "", {}, "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw=="], + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], @@ -320,10 +442,22 @@ "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "jake": ["jake@10.9.4", "", { "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" } }, "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA=="], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "jsonld-context-parser": ["jsonld-context-parser@2.4.0", "", { "dependencies": { "@types/http-link-header": "^1.0.1", "@types/node": "^18.0.0", "cross-fetch": "^3.0.6", "http-link-header": "^1.0.2", "relative-to-absolute-iri": "^1.0.5" }, "bin": { "jsonld-context-parse": "bin/jsonld-context-parse.js" } }, "sha512-ZYOfvh525SdPd9ReYY58dxB3E2RUEU4DJ6ZibO8AitcowPeBH4L5rCAitE2om5G1P+HMEgYEYEr4EZKbVN4tpA=="], + + "jsonld2graphobject": ["jsonld2graphobject@0.0.5", "", { "dependencies": { "@rdfjs/types": "^1.0.1", "@types/jsonld": "^1.5.6", "jsonld-context-parser": "^2.1.5", "uuid": "^8.3.2" } }, "sha512-5BqfXOq96+OBjjiJNG8gQH66pYt6hW88z2SJxdvFJo4XNoVMvqAcUz+JSm/KEWS5NLRnebApEzFrYP3HUiUmYw=="], + "knuth-shuffle-seeded": ["knuth-shuffle-seeded@1.0.6", "", { "dependencies": { "seed-random": "~2.2.0" } }, "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg=="], + "loading-cli": ["loading-cli@1.1.2", "", { "dependencies": { "colors-cli": "^1.0.26" } }, "sha512-M1ntfXHpdGoQxfaqKBOQPwSrTr9EIoTgj664Q9UVSbSnJvAFdribo+Ij//1jvACgrGHaTvfKoD9PG3NOxGj44g=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], "lodash.mergewith": ["lodash.mergewith@4.6.2", "", {}, "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="], @@ -332,17 +466,23 @@ "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], - "lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="], + "lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], "lucide-react": ["lucide-react@0.545.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-7r1/yUuflQDSt4f1bpn5ZAocyIxcTyVyBBChSVtBKn5M+392cPmI5YJMWOJKk/HUWGm5wg83chlAZtCcGbEZtw=="], "luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], - "minimatch": ["minimatch@10.1.1", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="], + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], @@ -352,25 +492,43 @@ "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "normalize-package-data": ["normalize-package-data@8.0.0", "", { "dependencies": { "hosted-git-info": "^9.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-path-operator": ["object-path-operator@3.0.0", "", {}, "sha512-Z7dlPUeXqRU/lLfGerP24dPC66n7ehyXaTM81k71EFlsaaEjOHkf4/uq1WGicfGfiO7snYShneE1YZZUkyRiLQ=="], + "pad-right": ["pad-right@0.2.2", "", { "dependencies": { "repeat-string": "^1.5.2" } }, "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g=="], + "parse-cache-control": ["parse-cache-control@1.0.1", "", {}, "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="], + "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], - "path-scurry": ["path-scurry@2.0.1", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA=="], + "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + "promise": ["promise@8.3.0", "", { "dependencies": { "asap": "~2.0.6" } }, "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg=="], + "property-expr": ["property-expr@2.0.6", "", {}, "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA=="], - "react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "qs": ["qs@6.15.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ=="], - "react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "rdf-data-factory": ["rdf-data-factory@1.1.3", "", { "dependencies": { "@rdfjs/types": "^1.0.0" } }, "sha512-ny6CI7m2bq4lfQQmDYvcb2l1F9KtGwz9chipX4oWu2aAtVoXjb7k3d8J1EsgAsEbMXnBipB/iuRen5H2fwRWWQ=="], + + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], + + "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], @@ -380,7 +538,9 @@ "read-package-up": ["read-package-up@12.0.0", "", { "dependencies": { "find-up-simple": "^1.0.1", "read-pkg": "^10.0.0", "type-fest": "^5.2.0" } }, "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw=="], - "read-pkg": ["read-pkg@10.0.0", "", { "dependencies": { "@types/normalize-package-data": "^2.4.4", "normalize-package-data": "^8.0.0", "parse-json": "^8.3.0", "type-fest": "^5.2.0", "unicorn-magic": "^0.3.0" } }, "sha512-A70UlgfNdKI5NSvTTfHzLQj7NJRpJ4mT5tGafkllJ4wh71oYuGm/pzphHcmW4s35iox56KSK721AihodoXSc/A=="], + "read-pkg": ["read-pkg@10.1.0", "", { "dependencies": { "@types/normalize-package-data": "^2.4.4", "normalize-package-data": "^8.0.0", "parse-json": "^8.3.0", "type-fest": "^5.4.4", "unicorn-magic": "^0.4.0" } }, "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg=="], + + "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], "reflect-metadata": ["reflect-metadata@0.2.2", "", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], @@ -388,15 +548,29 @@ "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], + "relative-to-absolute-iri": ["relative-to-absolute-iri@1.0.8", "", {}, "sha512-U1TmhrhCmXKkDL9mI8gBbF5TN6TKcuv28k5+H3gMCAjoz0TyyHAICHlaGDZsTEBSu2Y3HhDKc8e6X9n33qeIqA=="], + + "relativize-url": ["relativize-url@0.1.0", "", {}, "sha512-YXet4a9wQP96Ru9MQSfoRUzsCaeboLPXj+rVG1ulH4t54zqFHiNmW6FPl7V2dTxk9uHlW3yb9+1jWO44AdWisw=="], + "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="], "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "seed-random": ["seed-random@2.2.0", "", {}, "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ=="], - "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -408,7 +582,7 @@ "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], - "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="], + "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="], "stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="], @@ -416,15 +590,23 @@ "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "sync-request": ["sync-request@6.1.0", "", { "dependencies": { "http-response-object": "^3.0.1", "sync-rpc": "^1.2.1", "then-request": "^6.0.0" } }, "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw=="], + + "sync-rpc": ["sync-rpc@1.3.6", "", { "dependencies": { "get-port": "^3.1.0" } }, "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw=="], + "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], - "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="], + "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="], - "tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="], + "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="], + + "then-request": ["then-request@6.0.2", "", { "dependencies": { "@types/concat-stream": "^1.6.0", "@types/form-data": "0.0.33", "@types/node": "^8.0.0", "@types/qs": "^6.2.31", "caseless": "~0.12.0", "concat-stream": "^1.6.0", "form-data": "^2.2.0", "http-basic": "^8.1.1", "http-response-object": "^3.0.1", "promise": "^8.0.0", "qs": "^6.4.0" } }, "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA=="], "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], @@ -434,6 +616,8 @@ "toposort": ["toposort@2.0.2", "", {}, "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="], + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -444,9 +628,13 @@ "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], - "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + + "unicorn-magic": ["unicorn-magic@0.4.0", "", {}, "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], "upper-case-first": ["upper-case-first@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg=="], @@ -456,6 +644,8 @@ "util-arity": ["util-arity@1.1.0", "", {}, "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], @@ -464,25 +654,31 @@ "whatwg-mimetype": ["whatwg-mimetype@3.0.0", "", {}, "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="], + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], "yup": ["yup@1.7.1", "", { "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", "toposort": "^2.0.2", "type-fest": "^2.19.0" } }, "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw=="], - "@cucumber/cucumber/@cucumber/gherkin": ["@cucumber/gherkin@37.0.1", "", { "dependencies": { "@cucumber/messages": ">=31.0.0 <32" } }, "sha512-VmX+PKa9vqKZiycZoQKYlCsA0N7gAfiOfrcHSjK+suEVUwvKEH2sjO47NznrFFLmVWYTRmw3DLHQnpBAznkYEA=="], + "@cucumber/cucumber/@cucumber/gherkin": ["@cucumber/gherkin@38.0.0", "", { "dependencies": { "@cucumber/messages": ">=31.0.0 <33" } }, "sha512-duEXK+KDfQUzu3vsSzXjkxQ2tirF5PRsc1Xrts6THKHJO6mjw4RjM8RV+vliuDasmhhrmdLcOcM7d9nurNTJKw=="], - "@cucumber/cucumber/@cucumber/messages": ["@cucumber/messages@31.1.0", "", { "dependencies": { "class-transformer": "0.5.1", "reflect-metadata": "0.2.2" } }, "sha512-BViwUQ9YMjcGL98Ww2QHMgu3S4JLUjbTz+Jo/jsq+8ZjS47/2v3IszpD6e12Y6IzZoGfrZriauZHPQ4PAmN9XA=="], + "@cucumber/cucumber/@cucumber/messages": ["@cucumber/messages@32.0.1", "", { "dependencies": { "class-transformer": "0.5.1", "reflect-metadata": "0.2.2" } }, "sha512-1OSoW+GQvFUNAl6tdP2CTBexTXMNJF0094goVUcvugtQeXtJ0K8sCP0xbq7GGoiezs/eJAAOD03+zAPT64orHQ=="], "@cucumber/gherkin/@cucumber/messages": ["@cucumber/messages@25.0.1", "", { "dependencies": { "@types/uuid": "9.0.8", "class-transformer": "0.5.1", "reflect-metadata": "0.2.2", "uuid": "9.0.1" } }, "sha512-RjjhmzcauX5eYfcKns5pgenefDJQcfXE3ZDrVWdUDGcoaoyFVDmj+ZzQZWRWqFrfMjP3lKHJss6LtvIP/z+h8g=="], "@cucumber/gherkin-streams/commander": ["commander@14.0.0", "", {}, "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA=="], - "@cucumber/gherkin-utils/@cucumber/gherkin": ["@cucumber/gherkin@34.0.0", "", { "dependencies": { "@cucumber/messages": ">=19.1.4 <29" } }, "sha512-659CCFsrsyvuBi/Eix1fnhSheMnojSfnBcqJ3IMPNawx7JlrNJDcXYSSdxcUw3n/nG05P+ptCjmiZY3i14p+tA=="], + "@cucumber/gherkin-utils/@cucumber/gherkin": ["@cucumber/gherkin@38.0.0", "", { "dependencies": { "@cucumber/messages": ">=31.0.0 <33" } }, "sha512-duEXK+KDfQUzu3vsSzXjkxQ2tirF5PRsc1Xrts6THKHJO6mjw4RjM8RV+vliuDasmhhrmdLcOcM7d9nurNTJKw=="], - "@cucumber/gherkin-utils/@cucumber/messages": ["@cucumber/messages@29.0.1", "", { "dependencies": { "class-transformer": "0.5.1", "reflect-metadata": "0.2.2" } }, "sha512-aAvIYfQD6/aBdF8KFQChC3CQ1Q+GX9orlR6GurGiX6oqaCnBkxA4WU3OQUVepDynEFrPayerqKRFcAMhdcXReQ=="], + "@cucumber/gherkin-utils/@cucumber/messages": ["@cucumber/messages@32.0.1", "", { "dependencies": { "class-transformer": "0.5.1", "reflect-metadata": "0.2.2" } }, "sha512-1OSoW+GQvFUNAl6tdP2CTBexTXMNJF0094goVUcvugtQeXtJ0K8sCP0xbq7GGoiezs/eJAAOD03+zAPT64orHQ=="], - "@cucumber/gherkin-utils/commander": ["commander@14.0.0", "", {}, "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA=="], + "@cucumber/gherkin-utils/commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="], + + "@ldo/type-traverser/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "@ng-org/orm/@ng-org/alien-deepsignals": ["@ng-org/alien-deepsignals@0.1.2-alpha.11", "", { "dependencies": { "alien-signals": "^2.0.7" }, "peerDependencies": { "react": "^19.0.0 || ^18.0.0", "svelte": "^5.0.0 || ^4.0.0", "vue": "^3.0.0" }, "optionalPeers": ["react", "svelte", "vue"] }, "sha512-nPgqOrheAda/pW5FHgSb45SrSZWuyMyEVqO683ijEsVPpD105bngfh92PPfcRoRnFzGSoKXa3CfuqUHi2+qVIQ=="], "@radix-ui/react-arrow/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], @@ -512,15 +708,29 @@ "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "read-package-up/type-fest": ["type-fest@5.4.1", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ=="], + "filelist/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], - "read-pkg/type-fest": ["type-fest@5.4.1", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ=="], + "http-response-object/@types/node": ["@types/node@10.17.60", "", {}, "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="], + + "jsonld-context-parser/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], + + "jsonld2graphobject/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "read-package-up/type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="], + + "read-pkg/type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="], + + "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "yup/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + "then-request/@types/node": ["@types/node@8.10.66", "", {}, "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw=="], - "@cucumber/gherkin-utils/@cucumber/gherkin/@cucumber/messages": ["@cucumber/messages@27.2.0", "", { "dependencies": { "@types/uuid": "10.0.0", "class-transformer": "0.5.1", "reflect-metadata": "0.2.2", "uuid": "11.0.5" } }, "sha512-f2o/HqKHgsqzFLdq6fAhfG1FNOQPdBdyMGpKwhb7hZqg0yZtx9BVqkTyuoNk83Fcvk3wjMVfouFXXHNEk4nddA=="], + "whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "yup/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], "@cucumber/gherkin/@cucumber/messages/@types/uuid": ["@types/uuid@9.0.8", "", {}, "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA=="], @@ -538,6 +748,10 @@ "@radix-ui/react-visually-hidden/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - "@cucumber/gherkin-utils/@cucumber/gherkin/@cucumber/messages/uuid": ["uuid@11.0.5", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA=="], + "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "jsonld-context-parser/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "filelist/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], } } diff --git a/cucumber.json b/cucumber.json index 2b21c84..eb4fb3a 100644 --- a/cucumber.json +++ b/cucumber.json @@ -1,10 +1,11 @@ { "default": { "import": [ - "features/support/**/*.ts", - "features/step_definitions/**/*.ts" + "src/shared/support/**/*.ts", + "src/shared/steps/**/*.ts", + "src/modules/*/steps/**/*.ts" ], - "paths": ["features/**/*.feature"], + "paths": ["src/modules/*/features/**/*.feature"], "format": [ "progress-bar", "json:reports/cucumber-report.json", diff --git a/features/step_definitions/form.steps.ts b/features/step_definitions/form.steps.ts deleted file mode 100644 index 615ae0e..0000000 --- a/features/step_definitions/form.steps.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { Given, Then } from '@cucumber/cucumber'; -import { expect } from 'chai'; -import type { FestipodWorld } from '../support/world'; - -Given('l\'écran {string} est affiché', async function (this: FestipodWorld, screenName: string) { - const screenId = screenName.toLowerCase().replace(/ /g, '-'); - this.navigateTo(`#/demo/${screenId}`); -}); - -Given('le formulaire de création est vide', async function (this: FestipodWorld) { - this.formFields.forEach((field, key) => { - this.formFields.set(key, { ...field, value: '' }); - }); -}); - -// Steps removed: Form interaction steps (je remplis le champ, je laisse le champ vide, je soumets le formulaire) -// require browser automation. Scenarios needing these use "* Scénario non implémenté" placeholder. - -Then('le formulaire contient le champ obligatoire {string}', async function (this: FestipodWorld, fieldName: string) { - // This step is for form screens only (create-event) - expect(this.currentScreenId, 'This step is for form screens only').to.equal('create-event'); - const source = this.getRenderedText(); - // CreateEventScreen.tsx: Required fields have " *" after label: >Label *< - const escapedName = fieldName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const pattern = new RegExp(`>${escapedName}\\s*\\*<`); - expect(pattern.test(source), `Field "${fieldName}" should be marked as required (with *) in create-event screen`).to.be.true; -}); - -Then('le formulaire contient les champs obligatoires suivants:', async function (this: FestipodWorld, dataTable) { - // This step is for form screens only (create-event) - expect(this.currentScreenId, 'This step is for form screens only').to.equal('create-event'); - const source = this.getRenderedText(); - const expectedFields = dataTable.raw().flat(); - expectedFields.forEach((fieldName: string) => { - // CreateEventScreen.tsx: Required fields have " *" after label: >Label *< - const escapedName = fieldName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const pattern = new RegExp(`>${escapedName}\\s*\\*<`); - expect(pattern.test(source), `Field "${fieldName}" should be marked as required (with *) in create-event screen`).to.be.true; - }); -}); - -Then('le champ {string} est facultatif', async function (this: FestipodWorld, fieldName: string) { - const source = this.getRenderedText(); - // Optional fields have label without " *": >Label< followed by Input - const escapedName = fieldName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - // Check field exists but NOT marked as required - const existsPattern = new RegExp(`>${escapedName}<`); - const requiredPattern = new RegExp(`>${escapedName}\\s*\\*<`); - expect(existsPattern.test(source), `Field "${fieldName}" should exist in screen`).to.be.true; - expect(requiredPattern.test(source), `Field "${fieldName}" should NOT be marked as required`).to.be.false; -}); - -Then('le champ {string} est présent', async function (this: FestipodWorld, fieldName: string) { - const source = this.getRenderedText(); - // Check that field label exists in screen source - const escapedName = fieldName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const pattern = new RegExp(`>${escapedName}[^<]*<`); - expect(pattern.test(source), `Field "${fieldName}" should be present in screen`).to.be.true; -}); - -// Steps removed: Form display/validation steps (le champ affiche, erreur de validation, formulaire affiche N champs) -// require browser automation. Scenarios needing these use "* Scénario non implémenté" placeholder. - -Then('le formulaire permet de détecter les doublons', async function (this: FestipodWorld) { - expect(this.currentScreenId).to.equal('create-event'); - const source = this.getRenderedText(); - // CreateEventScreen.tsx has: showDuplicateWarning logic and "Événement similaire détecté" warning - expect(/showDuplicateWarning/.test(source), 'Form should have duplicate detection logic').to.be.true; - expect(/Événement similaire détecté/.test(source), 'Form should have duplicate warning message').to.be.true; -}); - -Then('le formulaire permet d\'importer depuis Mobilizon ou Transiscope', async function (this: FestipodWorld) { - expect(this.currentScreenId).to.equal('create-event'); - const source = this.getRenderedText(); - // CreateEventScreen.tsx has: importableEvents with Mobilizon and Transiscope sources - expect(/importableEvents/.test(source), 'Form should have importable events data').to.be.true; - expect(/Mobilizon/.test(source), 'Form should support Mobilizon import').to.be.true; - expect(/Transiscope/.test(source), 'Form should support Transiscope import').to.be.true; - expect(/Importer depuis une source externe/.test(source), 'Form should have import section').to.be.true; -}); - -Then('l\'import externe ne déclenche pas d\'alerte doublon', async function (this: FestipodWorld) { - expect(this.currentScreenId).to.equal('create-event'); - const source = this.getRenderedText(); - // CreateEventScreen.tsx has: importedFrom state and !importedFrom in showDuplicateWarning condition - expect(/importedFrom/.test(source), 'Form should track import source').to.be.true; - expect(/&& !importedFrom/.test(source), 'Duplicate warning should be disabled for imports').to.be.true; -}); diff --git a/features/step_definitions/screen.steps.ts b/features/step_definitions/screen.steps.ts deleted file mode 100644 index 800dcbc..0000000 --- a/features/step_definitions/screen.steps.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { Given, Then } from '@cucumber/cucumber'; -import { expect } from 'chai'; -import type { FestipodWorld } from '../support/world'; - -Then('je peux voir la liste des participants', async function (this: FestipodWorld) { - expect(this.currentScreenId).to.equal('event-detail'); - const source = this.getRenderedText(); - // EventDetailScreen.tsx has: , 📅, 🕓, 📍 emojis, and "À propos" section - expect(/]*>[^<]+<\/Title>/.test(source), 'Event detail should have a Title').to.be.true; - expect(/📅/.test(source), 'Event detail should have date emoji 📅').to.be.true; - expect(/🕓/.test(source), 'Event detail should have time emoji 🕓').to.be.true; - expect(/📍/.test(source), 'Event detail should have location emoji 📍').to.be.true; - expect(/À propos/.test(source), 'Event detail should have "À propos" section').to.be.true; -}); - -Then('je peux voir la section {string}', async function (this: FestipodWorld, sectionName: string) { - const source = this.getRenderedText(); - // Detect section by text search - const found = source.includes(sectionName); - if (!found) { - this.attach(`Looking for section: "${sectionName}"`, 'text/plain'); - this.attach(`Rendered text: ${source.substring(0, 500)}...`, 'text/plain'); - } - expect(found, `Section "${sectionName}" should be visible on screen`).to.be.true; -}); - -// Step removed: "la page affiche N éléments" requires browser automation. -// Scenarios needing this use "* Scénario non implémenté" placeholder. - -Then('je peux voir mon profil', async function (this: FestipodWorld) { - expect(this.currentScreenId).to.equal('profile'); - const source = this.getRenderedText(); - // ProfileScreen.tsx has: , Marie Dupont, @mariedupont - expect(/]*initials="MD"[^>]*size="lg"/.test(source), 'Profile should have Avatar with initials="MD" and size="lg"').to.be.true; - expect(/]*>Marie Dupont<\/Title>/.test(source), 'Profile should have Title "Marie Dupont"').to.be.true; - expect(/@mariedupont/.test(source), 'Profile should have username @mariedupont').to.be.true; -}); - -Then('je peux voir le profil de l\'utilisateur', async function (this: FestipodWorld) { - expect(this.currentScreenId).to.equal('user-profile'); - const source = this.getRenderedText(); - // UserProfileScreen.tsx has: , Jean Durand, @jeandurand - expect(/]*initials="JD"[^>]*size="lg"/.test(source), 'User profile should have Avatar with initials="JD" and size="lg"').to.be.true; - expect(/]*>Jean Durand<\/Title>/.test(source), 'User profile should have Title "Jean Durand"').to.be.true; - expect(/@jeandurand/.test(source), 'User profile should have username @jeandurand').to.be.true; -}); - -Then('je peux voir la liste des événements', async function (this: FestipodWorld) { - const source = this.getRenderedText(); - if (this.currentScreenId === 'home') { - // HomeScreen.tsx has: "Événements à venir" text and EventCard components - expect(/Mes événements à venir/.test(source), 'Home screen should have "Événements à venir" text').to.be.true; - } else if (this.currentScreenId === 'events') { - // EventsScreen.tsx has: EventCard components with event data - expect(/]*onClick/.test(source), 'Events screen should have clickable Card components').to.be.true; - } else { - expect.fail(`Unexpected screen "${this.currentScreenId}" - events list should be on home or events screen`); - } -}); - -Then('les événements affichent leur lieu', async function (this: FestipodWorld) { - const source = this.getRenderedText(); - // HomeScreen.tsx and EventsScreen.tsx EventCard components display location as: - // 📍 {location} - // Check that there's actual location text after the emoji - const locationPattern = /📍.*]*className="user-content"[^>]*>[^<]+<\/span>/; - expect(locationPattern.test(source), 'Event cards should display location text after 📍 emoji').to.be.true; -}); - -Then('je peux voir le QR code', async function (this: FestipodWorld) { - const source = this.getRenderedText(); - if (this.currentScreenId === 'share-profile') { - // ShareProfileScreen.tsx has: "QR Code" comment and "Scannez pour me retrouver" text - expect(/QR Code/.test(source), 'Share profile should have "QR Code" text').to.be.true; - expect(/Scannez pour me retrouver/.test(source), 'Share profile should have "Scannez pour me retrouver" text').to.be.true; - } else if (this.currentScreenId === 'meeting-points') { - // MeetingPointsScreen.tsx has: "Mon QR Code" text and "Scannez pour m'ajouter" - expect(/Mon QR Code/.test(source), 'Meeting points should have "Mon QR Code" text').to.be.true; - expect(/Scannez pour m'ajouter/.test(source), 'Meeting points should have "Scannez pour m\'ajouter" text').to.be.true; - } else { - expect.fail(`QR code should be on share-profile or meeting-points, not "${this.currentScreenId}"`); - } -}); - -Then('je peux voir le lien de partage', async function (this: FestipodWorld) { - expect(this.currentScreenId, 'Share link should be on share-profile screen').to.equal('share-profile'); - const source = this.getRenderedText(); - // ShareProfileScreen.tsx has: "Mon lien de profil" text and profileLink variable - expect(/Mon lien de profil/.test(source), 'Share profile should have "Mon lien de profil" text').to.be.true; - expect(/festipod\.app\/u\//.test(source), 'Share profile should have profile link URL').to.be.true; -}); - -// Steps removed: Data setup steps (un événement existe avec les données, un utilisateur existe avec les données) -// require backend/database. Scenarios needing these use "* Scénario non implémenté" placeholder. - -Given('je visualise l\'événement {string}', async function (this: FestipodWorld, eventName: string) { - this.navigateTo('#/demo/event-detail'); - expect(this.currentScreen, 'Event detail screen should be loaded').to.not.be.null; - this.attach(`Viewing event: ${eventName}`, 'text/plain'); -}); - -Given('je visualise le profil de {string}', async function (this: FestipodWorld, userName: string) { - this.navigateTo('#/demo/user-profile'); - expect(this.currentScreen, 'User profile screen should be loaded').to.not.be.null; - this.attach(`Viewing profile: ${userName}`, 'text/plain'); -}); - -Then('l\'écran affiche les informations de l\'événement', async function (this: FestipodWorld) { - expect(this.currentScreenId).to.equal('event-detail'); - const source = this.getRenderedText(); - // EventDetailScreen.tsx has: , 📅, 🕓, 📍 emojis, and "À propos" section - expect(/<Title[^>]*>[^<]+<\/Title>/.test(source), 'Event detail should have a Title').to.be.true; - expect(/📅/.test(source), 'Event detail should have date emoji 📅').to.be.true; - expect(/🕓/.test(source), 'Event detail should have time emoji 🕓').to.be.true; - expect(/📍/.test(source), 'Event detail should have location emoji 📍').to.be.true; - expect(/À propos/.test(source), 'Event detail should have "À propos" section').to.be.true; -}); - -Then('l\'écran affiche les informations du profil', async function (this: FestipodWorld) { - const source = this.getRenderedText(); - if (this.currentScreenId === 'profile') { - // ProfileScreen.tsx has: <Avatar initials="MD" size="lg" />, <Title>Marie Dupont, @mariedupont - expect(/]*initials="MD"/.test(source), 'Profile should have Avatar with initials="MD"').to.be.true; - expect(/]*>Marie Dupont<\/Title>/.test(source), 'Profile should have Title "Marie Dupont"').to.be.true; - expect(/@mariedupont/.test(source), 'Profile should have username @mariedupont').to.be.true; - } else if (this.currentScreenId === 'user-profile') { - // UserProfileScreen.tsx has: , Jean Durand, @jeandurand - expect(/]*initials="JD"/.test(source), 'User profile should have Avatar with initials="JD"').to.be.true; - expect(/]*>Jean Durand<\/Title>/.test(source), 'User profile should have Title "Jean Durand"').to.be.true; - expect(/@jeandurand/.test(source), 'User profile should have username @jeandurand').to.be.true; - } else { - expect.fail(`Unexpected screen "${this.currentScreenId}" for profile info check`); - } -}); - -// Steps removed: Feature steps not implemented in UI (commentaire, note, filtrer par période, modifier/supprimer commentaire) -// Scenarios needing these use "* Scénario non implémenté" placeholder. - -Then('je peux m\'inscrire à l\'événement', async function (this: FestipodWorld) { - expect(this.currentScreenId).to.equal('event-detail'); - const source = this.getRenderedText(); - // EventDetailScreen.tsx line 49: {isJoined ? '✓ Inscrit' : 'Participer'} - // The button shows "Participer" when not joined - const hasParticiperButton = /isJoined \? '✓ Inscrit' : 'Participer'/.test(source); - expect(hasParticiperButton, 'Event detail should have Participer/Inscrit toggle button').to.be.true; -}); - -Then('je peux me désinscrire de l\'événement', async function (this: FestipodWorld) { - expect(this.currentScreenId).to.equal('event-detail'); - const source = this.getRenderedText(); - // EventDetailScreen.tsx line 49: {isJoined ? '✓ Inscrit' : 'Participer'} - // Same button toggles - clicking "✓ Inscrit" will unregister - const hasInscritButton = /isJoined \? '✓ Inscrit' : 'Participer'/.test(source); - expect(hasInscritButton, 'Event detail should have Participer/Inscrit toggle button (click to unregister)').to.be.true; -}); - -Then('je peux contacter l\'utilisateur', async function (this: FestipodWorld) { - expect(this.currentScreenId).to.equal('user-profile'); - const source = this.getRenderedText(); - // UserProfileScreen.tsx line 44: - const hasContactButton = / + + ) : status === 'connecting' ? ( + + ) : ( +
+ + {status === 'error' && ( + + NextGraph non disponible — mode démonstration + + )} +
+ )} + + + + + {/* Classic email/password login (mockup) */} + + ou connexion classique (démo) + + +
+
+ Email + +
+ +
+ Mot de passe + +
+ + + + + Mot de passe oublié ? + +
+ + + + + Pas encore de compte ? S'inscrire + + + ); +} diff --git a/src/screens/WelcomeScreen.tsx b/src/modules/auth/screens/WelcomeScreen.tsx similarity index 95% rename from src/screens/WelcomeScreen.tsx rename to src/modules/auth/screens/WelcomeScreen.tsx index dbd7d18..355c291 100644 --- a/src/screens/WelcomeScreen.tsx +++ b/src/modules/auth/screens/WelcomeScreen.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Button, Title, Text } from '../components/sketchy'; -import type { ScreenProps } from './index'; +import { Button, Title, Text } from '../../../shared/components/sketchy'; +import type { ScreenProps } from '../../../screens'; export function WelcomeScreen({ navigate }: ScreenProps) { return ( diff --git a/features/event/us-13-creer-evenement.feature b/src/modules/event/features/us-13-creer-evenement.feature similarity index 100% rename from features/event/us-13-creer-evenement.feature rename to src/modules/event/features/us-13-creer-evenement.feature diff --git a/features/event/us-3-visualiser-evenement-termine.feature b/src/modules/event/features/us-3-visualiser-evenement-termine.feature similarity index 100% rename from features/event/us-3-visualiser-evenement-termine.feature rename to src/modules/event/features/us-3-visualiser-evenement-termine.feature diff --git a/features/event/us-5-commentaires-evenement.feature b/src/modules/event/features/us-5-commentaires-evenement.feature similarity index 100% rename from features/event/us-5-commentaires-evenement.feature rename to src/modules/event/features/us-5-commentaires-evenement.feature diff --git a/features/event/us-7-inscription-evenement.feature b/src/modules/event/features/us-7-inscription-evenement.feature similarity index 100% rename from features/event/us-7-inscription-evenement.feature rename to src/modules/event/features/us-7-inscription-evenement.feature diff --git a/features/event/us-8-macro-evenement.feature b/src/modules/event/features/us-8-macro-evenement.feature similarity index 100% rename from features/event/us-8-macro-evenement.feature rename to src/modules/event/features/us-8-macro-evenement.feature diff --git a/src/screens/CreateEventScreen.tsx b/src/modules/event/screens/CreateEventScreen.tsx similarity index 70% rename from src/screens/CreateEventScreen.tsx rename to src/modules/event/screens/CreateEventScreen.tsx index af6a56a..be8199d 100644 --- a/src/screens/CreateEventScreen.tsx +++ b/src/modules/event/screens/CreateEventScreen.tsx @@ -1,12 +1,9 @@ import React, { useState } from 'react'; -import { Header, Text, Input, Button, Placeholder } from '../components/sketchy'; -import type { ScreenProps } from './index'; +import { Header, Text, Input, Button, Placeholder } from '../../../shared/components/sketchy'; +import { useFestipodData } from '../../../shared/context/FestipodDataContext'; +import type { ScreenProps } from '../../../screens'; // Demo data for suggestions -const existingEvents = [ - { name: 'Résidence Reconnexion', relayedBy: 'Thomas Martin' }, -]; - const importableEvents = [ { name: 'Festival des Utopies Concrètes', @@ -25,15 +22,57 @@ const importableEvents = [ ]; export function CreateEventScreen({ navigate }: ScreenProps) { + const { events, createEvent, setSelectedEventId } = useFestipodData(); + const [name, setName] = useState(''); const [startDate, setStartDate] = useState(''); + const [endDate, setEndDate] = useState(''); + const [startTime, setStartTime] = useState(''); + const [endTime, setEndTime] = useState(''); const [location, setLocation] = useState(''); const [description, setDescription] = useState(''); + const [selectedThemes, setSelectedThemes] = useState(['Social']); const [showSuggestions, setShowSuggestions] = useState(false); const [importedFrom, setImportedFrom] = useState(null); + // Check for existing events with similar names + const existingMatches = events.filter(e => + name.length > 3 && e.title.toLowerCase().includes(name.toLowerCase()) + ); + // Show warning only when key fields are filled AND not imported from external source - const showDuplicateWarning = name.length > 3 && startDate && location.length > 3 && !importedFrom; + const showDuplicateWarning = existingMatches.length > 0 && startDate && location.length > 3 && !importedFrom; + + const handleCreate = () => { + const dateLabel = startDate + ? (endDate ? `${startDate} - ${endDate}` : startDate) + : 'Date à définir'; + + const newEvent = createEvent({ + title: name || 'Nouvel événement', + date: dateLabel, + startDate, + endDate, + startTime, + endTime, + location: location || 'Lieu à définir', + description, + participantCount: 1, + themes: selectedThemes, + hostName: 'Moi', + hostInitials: 'MD', + }); + setSelectedEventId(newEvent.id); + navigate('event-detail'); + }; + + const toggleTheme = (themeId: string) => { + setSelectedThemes(prev => + prev.includes(themeId) + ? prev.filter(t => t !== themeId) + : [...prev, themeId] + ); + }; return (
@@ -64,12 +103,15 @@ export function CreateEventScreen({ navigate }: ScreenProps) { Événement similaire détecté - Un événement similaire a déjà été relayé par Thomas Martin. + Un événement similaire « {existingMatches[0].title} » existe déjà. Vous pouvez continuer si vous pensez qu'il s'agit d'un événement différent. navigate('event-detail')} + onClick={() => { + setSelectedEventId(existingMatches[0].id); + navigate('event-detail'); + }} > Voir l'événement existant → @@ -85,7 +127,7 @@ export function CreateEventScreen({ navigate }: ScreenProps) { onChange={(e: React.ChangeEvent) => { setName(e.target.value); setShowSuggestions(e.target.value.length > 0); - setImportedFrom(null); // Reset import flag when user types manually + setImportedFrom(null); }} onFocus={() => name.length > 0 && setShowSuggestions(true)} onBlur={() => setTimeout(() => setShowSuggestions(false), 200)} @@ -107,14 +149,14 @@ export function CreateEventScreen({ navigate }: ScreenProps) { overflow: 'auto', }}> {/* Existing events - not selectable */} - {existingEvents.length > 0 && ( + {existingMatches.length > 0 && ( <>
Déjà relayé sur Festipod
- {existingEvents.map((event, i) => ( + {existingMatches.map((event) => (
- {event.name} + {event.title} - Relayé par {event.relayedBy} + {event.hostName ? `Relayé par ${event.hostName}` : 'Relayé'}
))} @@ -178,18 +220,33 @@ export function CreateEventScreen({ navigate }: ScreenProps) {
Date de fin - + ) => setEndDate(e.target.value)} + />
Heure de début * - + ) => setStartTime(e.target.value)} + />
Heure de fin - + ) => setEndTime(e.target.value)} + />
@@ -218,19 +275,20 @@ export function CreateEventScreen({ navigate }: ScreenProps) { Thématique *
{[ - { id: 'culture', label: 'Culture', emoji: '🎭' }, - { id: 'sport', label: 'Sport', emoji: '⚽' }, - { id: 'nature', label: 'Nature', emoji: '🌿' }, - { id: 'social', label: 'Social', emoji: '👥' }, - { id: 'food', label: 'Gastronomie', emoji: '🍽️' }, - { id: 'music', label: 'Musique', emoji: '🎵' }, - { id: 'tech', label: 'Tech', emoji: '💻' }, - { id: 'other', label: 'Autre', emoji: '✨' }, + { id: 'Culture', label: 'Culture', emoji: '🎭' }, + { id: 'Sport', label: 'Sport', emoji: '⚽' }, + { id: 'Nature', label: 'Nature', emoji: '🌿' }, + { id: 'Social', label: 'Social', emoji: '👥' }, + { id: 'Gastronomie', label: 'Gastronomie', emoji: '🍽️' }, + { id: 'Musique', label: 'Musique', emoji: '🎵' }, + { id: 'Tech', label: 'Tech', emoji: '💻' }, + { id: 'Autre', label: 'Autre', emoji: '✨' }, ].map((theme) => ( @@ -252,10 +310,13 @@ export function CreateEventScreen({ navigate }: ScreenProps) { marginBottom: 12, }}> - Un événement similaire a déjà été relayé par Thomas Martin.{' '} + Un événement similaire « {existingMatches[0].title} » existe déjà.{' '} navigate('event-detail')} + onClick={() => { + setSelectedEventId(existingMatches[0].id); + navigate('event-detail'); + }} > Voir → @@ -265,7 +326,7 @@ export function CreateEventScreen({ navigate }: ScreenProps) { diff --git a/src/modules/event/screens/EventDetailScreen.tsx b/src/modules/event/screens/EventDetailScreen.tsx new file mode 100644 index 0000000..e7d72d1 --- /dev/null +++ b/src/modules/event/screens/EventDetailScreen.tsx @@ -0,0 +1,174 @@ +import React from 'react'; +import { Header, Title, Text, Button, Avatar, Placeholder, Divider } from '../../../shared/components/sketchy'; +import { useFestipodData } from '../../../shared/context/FestipodDataContext'; +import type { ScreenProps } from '../../../screens'; + +export function EventDetailScreen({ navigate }: ScreenProps) { + const { + selectedEvent, + selectedEventId, + currentUserId, + isParticipating, + joinEvent, + leaveEvent, + getEventParticipants, + setSelectedUserId, + } = useFestipodData(); + + const event = selectedEvent; + const joined = isParticipating(selectedEventId); + const participants = getEventParticipants(selectedEventId); + + // In a real app, this would come from comparing current user with event creator + const isOwner = true; + + const knownParticipants = participants.filter(p => p.id !== currentUserId); + const unknownCount = Math.max(0, (event?.participantCount ?? 0) - participants.length); + + const handleToggleJoin = () => { + if (joined) { + leaveEvent(selectedEventId); + } else { + joinEvent(selectedEventId); + } + }; + + if (!event) { + return ( +
+
navigate('events')} style={{ cursor: 'pointer' }}>←} + /> +
+ Événement non trouvé +
+
+ ); + } + + return ( +
+
navigate('events')} style={{ cursor: 'pointer' }}>←} + right={isOwner && navigate('update-event')} style={{ cursor: 'pointer' }}>✎} + /> + + {/* Content */} +
+ {/* Cover image */} + + +
+ {event.title} + +
+ + 📅 {event.date} + + {event.startTime && ( + + 🕓 {event.startTime}{event.endTime ? ` - ${event.endTime}` : ''} + + )} + + 📍 {event.location} + {event.distance != null && ( + · {event.distance} km + )} + +
+ +
+ + +
+ + {joined && ( + + )} + + + + {/* Host */} + {event.hostName && ( + <> +
+ +
+ {event.hostName} + Relayé par +
+
+ + + )} + + {/* Description */} + À propos + + {event.description} + + + + + {/* Attendees */} +
+ Participants ({event.participantCount}) + navigate('participants-list')} + > + Voir tout → + +
+ +
+ {knownParticipants.slice(0, 3).map((p) => ( +
{ setSelectedUserId(p.id); navigate('user-profile'); }} + > + + {p.name.split(' ')[0]} +
+ ))} + {unknownCount > 0 && ( +
navigate('participants-list')} + > +
+ +{unknownCount} +
+ inconnus +
+ )} +
+
+
+
+ ); +} diff --git a/src/screens/EventsScreen.tsx b/src/modules/event/screens/EventsScreen.tsx similarity index 63% rename from src/screens/EventsScreen.tsx rename to src/modules/event/screens/EventsScreen.tsx index a25b80d..1370f0d 100644 --- a/src/screens/EventsScreen.tsx +++ b/src/modules/event/screens/EventsScreen.tsx @@ -1,6 +1,7 @@ import React from 'react'; -import { Header, Input, Card, Text, Badge, NavBar } from '../components/sketchy'; -import type { ScreenProps } from './index'; +import { Header, Input, Card, Text, Badge, NavBar } from '../../../shared/components/sketchy'; +import { useFestipodData } from '../../../shared/context/FestipodDataContext'; +import type { ScreenProps } from '../../../screens'; function EventCard({ title, date, location, distance, attendees, onClick }: { title: string; @@ -18,7 +19,7 @@ function EventCard({ title, date, location, distance, attendees, onClick }: {
📍 {location} - · {distance} km + {distance != null && · {distance} km} {attendees} inscrits @@ -26,6 +27,13 @@ function EventCard({ title, date, location, distance, attendees, onClick }: { } export function EventsScreen({ navigate }: ScreenProps) { + const { events, setSelectedEventId } = useFestipodData(); + + const handleEventClick = (eventId: string) => { + setSelectedEventId(eventId); + navigate('event-detail'); + }; + return (
- navigate('event-detail')} - /> - navigate('event-detail')} - /> - navigate('event-detail')} - /> - navigate('event-detail')} - /> - navigate('event-detail')} - /> + {events.map((event) => ( + handleEventClick(event.id)} + /> + ))}
{/* Bottom Nav */} diff --git a/src/screens/InviteScreen.tsx b/src/modules/event/screens/InviteScreen.tsx similarity index 81% rename from src/screens/InviteScreen.tsx rename to src/modules/event/screens/InviteScreen.tsx index 2a82ff7..918926f 100644 --- a/src/screens/InviteScreen.tsx +++ b/src/modules/event/screens/InviteScreen.tsx @@ -1,24 +1,12 @@ import React, { useState } from 'react'; -import { Header, Input, Text, Avatar, Checkbox, Button } from '../components/sketchy'; -import type { ScreenProps } from './index'; - -interface Friend { - id: string; - name: string; - initials: string; - username: string; -} - -const friends: Friend[] = [ - { id: '1', name: 'Alice Martin', initials: 'AM', username: '@alice' }, - { id: '2', name: 'Baptiste Morel', initials: 'BM', username: '@baptiste' }, - { id: '3', name: 'Camille Dubois', initials: 'CD', username: '@camille' }, - { id: '4', name: 'David Leroy', initials: 'DL', username: '@david' }, - { id: '5', name: 'Emma Bernard', initials: 'EB', username: '@emma' }, - { id: '6', name: 'François Petit', initials: 'FP', username: '@francois' }, -]; +import { Header, Input, Text, Avatar, Checkbox, Button } from '../../../shared/components/sketchy'; +import { useFestipodData } from '../../../shared/context/FestipodDataContext'; +import type { ScreenProps } from '../../../screens'; export function InviteScreen({ navigate }: ScreenProps) { + const { getFriends } = useFestipodData(); + const friends = getFriends(); + const [selected, setSelected] = useState>(new Set()); const toggleFriend = (id: string) => { diff --git a/src/screens/MeetingPointsScreen.tsx b/src/modules/event/screens/MeetingPointsScreen.tsx similarity index 53% rename from src/screens/MeetingPointsScreen.tsx rename to src/modules/event/screens/MeetingPointsScreen.tsx index c4a3392..4936355 100644 --- a/src/screens/MeetingPointsScreen.tsx +++ b/src/modules/event/screens/MeetingPointsScreen.tsx @@ -1,23 +1,29 @@ import React, { useState } from 'react'; -import { Header, Text, Button, Card, Avatar, Input, Divider } from '../components/sketchy'; -import type { ScreenProps } from './index'; +import { Header, Text, Button, Card, Avatar, Input, Divider } from '../../../shared/components/sketchy'; +import { useFestipodData } from '../../../shared/context/FestipodDataContext'; +import type { ScreenProps } from '../../../screens'; export function MeetingPointsScreen({ navigate }: ScreenProps) { + const { selectedEventId, getEventMeetingPoints, addMeetingPoint, currentUser } = useFestipodData(); + const meetingPoints = getEventMeetingPoints(selectedEventId); + const [showForm, setShowForm] = useState(false); - const meetingPoints = [ - { - id: '1', - location: 'Café de la Place', - time: '30 min avant l\'événement', - host: { initials: 'MD', name: 'Marie' }, - }, - { - id: '2', - location: 'Station de métro Bellecour', - time: '15h30', - host: { initials: 'JD', name: 'Jean' }, - }, - ]; + const [mpLocation, setMpLocation] = useState(''); + const [mpTime, setMpTime] = useState('1h avant'); + + const handleCreate = () => { + if (!mpLocation.trim()) return; + addMeetingPoint({ + eventId: selectedEventId, + location: mpLocation, + time: mpTime, + hostName: currentUser?.name?.split(' ')[0] ?? 'Moi', + hostInitials: currentUser?.initials ?? '?', + }); + setMpLocation(''); + setMpTime('1h avant'); + setShowForm(false); + }; return (
@@ -36,11 +42,11 @@ export function MeetingPointsScreen({ navigate }: ScreenProps) { {meetingPoints.map((mp) => (
- +
{mp.location} - {mp.time} · Proposé par {mp.host.name} + {mp.time} · Proposé par {mp.hostName}
@@ -61,21 +67,43 @@ export function MeetingPointsScreen({ navigate }: ScreenProps) {
Lieu - + ) => setMpLocation(e.target.value)} + />
Heure
- - - + + +
-
diff --git a/src/screens/ParticipantsListScreen.tsx b/src/modules/event/screens/ParticipantsListScreen.tsx similarity index 53% rename from src/screens/ParticipantsListScreen.tsx rename to src/modules/event/screens/ParticipantsListScreen.tsx index 7935aea..53578e0 100644 --- a/src/screens/ParticipantsListScreen.tsx +++ b/src/modules/event/screens/ParticipantsListScreen.tsx @@ -1,27 +1,41 @@ import React from 'react'; -import { Header, Avatar, Text, Input, Divider } from '../components/sketchy'; -import type { ScreenProps } from './index'; +import { Header, Avatar, Text, Input } from '../../../shared/components/sketchy'; +import { useFestipodData } from '../../../shared/context/FestipodDataContext'; +import type { ScreenProps } from '../../../screens'; export function ParticipantsListScreen({ navigate }: ScreenProps) { - const participants = [ - { initials: 'MD', name: 'Marie Dupont', username: '@mariedupont', known: true }, - { initials: 'TM', name: 'Thomas Martin', username: '@thomas', known: true }, - { known: false }, - { known: false }, - { known: false }, - { known: false }, - { known: false }, - { known: false }, - { known: false }, - { known: false }, - { known: false }, - { known: false }, + const { selectedEvent, selectedEventId, getEventParticipants, getFriends, setSelectedUserId } = useFestipodData(); + const participants = getEventParticipants(selectedEventId); + const friends = getFriends(); + const friendIds = new Set(friends.map(f => f.id)); + + const totalCount = selectedEvent?.participantCount ?? participants.length; + const unknownCount = Math.max(0, totalCount - participants.length); + + // Build participant list: known participants + unknown placeholders + const participantRows = [ + ...participants.map(p => ({ + key: p.id, + initials: p.initials, + name: p.name, + username: p.username, + known: true, + isFriend: friendIds.has(p.id), + })), + ...Array.from({ length: unknownCount }, (_, i) => ({ + key: `unknown-${i}`, + initials: '?', + name: '', + username: '', + known: false, + isFriend: false, + })), ]; return (
navigate('event-detail')} style={{ cursor: 'pointer' }}>←} /> @@ -32,10 +46,10 @@ export function ParticipantsListScreen({ navigate }: ScreenProps) { {/* Participants list */}
- {participants.map((p, i) => ( + {participantRows.map((p) => (
navigate('user-profile') : undefined} + key={p.key} + onClick={p.known ? () => { setSelectedUserId(p.key); navigate('user-profile'); } : undefined} style={{ display: 'flex', alignItems: 'center', @@ -45,7 +59,7 @@ export function ParticipantsListScreen({ navigate }: ScreenProps) { borderBottom: '1px solid var(--sketch-light-gray)', }} > - +
{p.known ? ( <> diff --git a/src/modules/event/screens/UpdateEventScreen.tsx b/src/modules/event/screens/UpdateEventScreen.tsx new file mode 100644 index 0000000..dc9a586 --- /dev/null +++ b/src/modules/event/screens/UpdateEventScreen.tsx @@ -0,0 +1,146 @@ +import React, { useState } from 'react'; +import { Header, Text, Input, Button, Placeholder } from '../../../shared/components/sketchy'; +import { useFestipodData } from '../../../shared/context/FestipodDataContext'; +import type { ScreenProps } from '../../../screens'; + +export function UpdateEventScreen({ navigate }: ScreenProps) { + const { selectedEvent, updateEvent, selectedEventId } = useFestipodData(); + const event = selectedEvent; + + const [title, setTitle] = useState(event?.title ?? ''); + const [startDate, setStartDate] = useState(event?.startDate ?? ''); + const [endDate, setEndDate] = useState(event?.endDate ?? ''); + const [startTime, setStartTime] = useState(event?.startTime ?? ''); + const [endTime, setEndTime] = useState(event?.endTime ?? ''); + const [location, setLocation] = useState(event?.location ?? ''); + const [description, setDescription] = useState(event?.description ?? ''); + const [themes, setThemes] = useState(event?.themes ?? ['Social']); + + const toggleTheme = (themeId: string) => { + setThemes(prev => + prev.includes(themeId) + ? prev.filter(t => t !== themeId) + : [...prev, themeId] + ); + }; + + const handleSave = () => { + const dateLabel = startDate + ? (endDate ? `${startDate} - ${endDate}` : startDate) + : event?.date ?? ''; + + updateEvent(selectedEventId, { + title, + date: dateLabel, + startDate, + endDate, + startTime, + endTime, + location, + description, + themes, + }); + navigate('event-detail'); + }; + + return ( +
+
navigate('event-detail')} style={{ cursor: 'pointer' }}>✕} + /> + + {/* Content */} +
+ {/* Cover image upload */} + + +
+
+ Nom de l'événement * + ) => setTitle(e.target.value)} /> +
+ +
+
+ Date de début * + ) => setStartDate(e.target.value)} /> +
+
+ Date de fin + ) => setEndDate(e.target.value)} /> +
+
+ +
+
+ Heure de début * + ) => setStartTime(e.target.value)} /> +
+
+ Heure de fin + ) => setEndTime(e.target.value)} /> +
+
+ +
+ Lieu * + ) => setLocation(e.target.value)} /> +
+ +
+ Description +