From abc9e2b16455ff4d51e86ffdf8fb2ff4a065d64a Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 29 Mar 2026 17:11:18 +0000 Subject: [PATCH] feat(arch): initialize specialized documentation for micro-frontends Co-authored-by: beginwebdev2002 <102213457+beginwebdev2002@users.noreply.github.com> --- architectures/micro-frontends/data-flow.md | 73 ++++++++++++++ .../micro-frontends/folder-structure.md | 53 ++++++++++ .../micro-frontends/implementation-guide.md | 79 +++++++++++++++ architectures/micro-frontends/readme.md | 99 +++++++++++++++++++ architectures/micro-frontends/trade-offs.md | 60 +++++++++++ architectures/readme.md | 43 ++++++++ package-lock.json | 33 ++++++- 7 files changed, 439 insertions(+), 1 deletion(-) create mode 100644 architectures/micro-frontends/data-flow.md create mode 100644 architectures/micro-frontends/folder-structure.md create mode 100644 architectures/micro-frontends/implementation-guide.md create mode 100644 architectures/micro-frontends/readme.md create mode 100644 architectures/micro-frontends/trade-offs.md diff --git a/architectures/micro-frontends/data-flow.md b/architectures/micro-frontends/data-flow.md new file mode 100644 index 0000000..6fd9a78 --- /dev/null +++ b/architectures/micro-frontends/data-flow.md @@ -0,0 +1,73 @@ +--- +description: Vibe coding guidelines and architectural constraints for Micro-frontends Data Flow within the Architecture domain. +tags: [micro-frontends, architecture, module-federation, frontend, data-flow, sequence-diagram, vibe-coding] +topic: Micro-frontends Data Flow +complexity: Architect +last_evolution: 2026-03-22 +vibe_coding_ready: true +technology: Micro-frontends +domain: Architecture +level: Senior/Architect +version: Agnostic +ai_role: Senior Architect +last_updated: 2026-03-22 +--- + +
+ # 📊 Micro-frontends Data Flow +
+ +--- + +Этот документ определяет строгие правила жизненного цикла данных, обработки событий и потоков запросов в архитектуре Micro-frontends. + +## Request and Event Lifecycle + +### 1. Synchronous Global Communication (Anti-Pattern) + +#### ❌ Bad Practice +```javascript +// MFE Auth synchronously calling an exposed method on MFE App Shell +window.AppShell.updateUserSession(userData); +``` + +#### ⚠️ Problem +Synchronous calls introduce severe, rigid coupling. If the App Shell hasn't loaded or changes its method signature, the MFE Auth crashes. It makes parallel development nearly impossible and creates hard dependencies on loading order. + +#### ✅ Best Practice +```javascript +// MFE Auth publishes an event asynchronously +const loginEvent = new CustomEvent('auth:loginSuccess', { + detail: { userId: userData.id, token: userData.token } +}); +window.dispatchEvent(loginEvent); + +// App Shell subscribes to the event +window.addEventListener('auth:loginSuccess', (e) => { + sessionManager.initialize(e.detail.token); +}); +``` + +#### 🚀 Solution +Embrace an asynchronous, event-driven architecture using robust event buses or native browser CustomEvents. This guarantees total decoupling and ensures that the system components are completely resilient to missing services or delayed initializations. + +--- + +## Data Flow Diagram + +```mermaid +sequenceDiagram + participant User + participant AppShell as App Shell + participant MFE_Auth as Auth Micro-frontend + participant MFE_Catalog as Catalog Micro-frontend + + User->>AppShell: Access Application + AppShell->>MFE_Auth: Load Module (Module Federation) + MFE_Auth->>User: Render Login + User->>MFE_Auth: Submit Credentials + MFE_Auth-->>AppShell: Event: auth:loginSuccess + AppShell->>MFE_Catalog: Load Module (Module Federation) + AppShell-->>MFE_Catalog: Pass Context / Propagate Event + MFE_Catalog->>User: Render Catalog Data +``` diff --git a/architectures/micro-frontends/folder-structure.md b/architectures/micro-frontends/folder-structure.md new file mode 100644 index 0000000..698c514 --- /dev/null +++ b/architectures/micro-frontends/folder-structure.md @@ -0,0 +1,53 @@ +--- +description: Vibe coding guidelines and architectural constraints for Micro-frontends Folder Structure within the Architecture domain. +tags: [micro-frontends, architecture, module-federation, frontend, folder-structure, vibe-coding] +topic: Micro-frontends Folder Structure +complexity: Architect +last_evolution: 2026-03-22 +vibe_coding_ready: true +technology: Micro-frontends +domain: Architecture +level: Senior/Architect +version: Agnostic +ai_role: Senior Architect +last_updated: 2026-03-22 +--- + +
+ # 📁 Micro-frontends Folder Structure +
+ +--- + +Этот документ определяет строгие правила структуры директорий и логического слоения в архитектуре Micro-frontends для обеспечения максимальной изоляции. + +## Directory Layout Rules + +### 1. Monorepo vs Polyrepo Constraints + +#### ❌ Bad Practice +```text +monorepo/ +├── packages/ +│ ├── shared-ui/ (contains business logic!) +│ ├── app-shell/ +│ ├── mfe-auth/ (imports directly from app-shell) +``` + +#### ⚠️ Problem +Storing business logic in shared libraries or directly importing cross-package code defeats the purpose of micro-frontends. It binds deployment cycles together, meaning a change in `shared-ui` forces all dependent MFEs to re-test and redeploy simultaneously. + +#### ✅ Best Practice +```text +workspace/ +├── apps/ +│ ├── app-shell/ (Entry point, Router, Module Federation config) +│ ├── mfe-catalog/ (Independent application) +│ └── mfe-checkout/ (Independent application) +├── packages/ +│ ├── design-system/ (Pure, dumb UI components only) +│ └── event-bus/ (Agnostic communication contract types) +``` + +#### 🚀 Solution +Structure your repository (whether mono or polyrepo) to ensure each application folder (`mfe-*`) operates as a completely standalone entity. Shared libraries must be restricted strictly to agnostic utilities and purely visual design system components. Ensure zero business logic crossover. diff --git a/architectures/micro-frontends/implementation-guide.md b/architectures/micro-frontends/implementation-guide.md new file mode 100644 index 0000000..53c0882 --- /dev/null +++ b/architectures/micro-frontends/implementation-guide.md @@ -0,0 +1,79 @@ +--- +description: Vibe coding guidelines and architectural constraints for Micro-frontends Implementation Guide within the Architecture domain. +tags: [micro-frontends, architecture, module-federation, frontend, implementation, guide, vibe-coding] +topic: Micro-frontends Implementation Guide +complexity: Architect +last_evolution: 2026-03-22 +vibe_coding_ready: true +technology: Micro-frontends +domain: Architecture +level: Senior/Architect +version: Agnostic +ai_role: Senior Architect +last_updated: 2026-03-22 +--- + +
+ # 🛠️ Micro-frontends Implementation Guide +
+ +--- + +Этот документ определяет практические паттерны реализации и антипаттерны в архитектуре Micro-frontends с использованием стандартов 2026 года. + +## 2026 Code Patterns & Anti-patterns + +### 1. Tight Routing Coupling (Hardcoded URLs) + +#### ❌ Bad Practice +```javascript +// Micro-frontend directly redirecting the user to a specific MFE route +function navigateToCart() { + window.location.href = '/app/cart'; +} +``` + +#### ⚠️ Problem +Hardcoding URLs within a micro-frontend creates brittle links. If the App Shell changes its routing strategy or paths, the micro-frontend breaks. It violates the boundary principles. + +#### ✅ Best Practice +```javascript +// Navigating via agnostic Intent Events +function navigateToCart() { + const event = new CustomEvent('router:navigate', { + detail: { routeId: 'cart', params: { source: 'catalog' } } + }); + window.dispatchEvent(event); +} +``` + +#### 🚀 Solution +Routing should be fully managed by the App Shell (the Host). Micro-frontends should dispatch "intent" events when they need the user to navigate across MFE boundaries. The App Shell listens, resolves the intent to a physical URL path, and executes the router change safely. + +--- + +### 2. Inconsistent Design and Shared UI + +#### ❌ Bad Practice +```javascript +// MFE Auth implements its own Button component +const LoginButton = () => ; + +// MFE Catalog implements its own Button component +const AddToCartButton = () => ; +``` + +#### ⚠️ Problem +Without a shared design system, the user experiences disjointed UI elements across different pages of the same application. This degrades UX and creates massive design debt for teams to maintain independently. + +#### ✅ Best Practice +```javascript +// Both MFEs consume a federated, versioned Design System +import { Button } from '@company/design-system'; + +const LoginButton = () => ; +const AddToCartButton = () => ; +``` + +#### 🚀 Solution +Establish a centralized, strictly versioned UI Component Library (Design System) that all micro-frontends must consume. This ensures visual consistency while keeping the business logic decoupled. diff --git a/architectures/micro-frontends/readme.md b/architectures/micro-frontends/readme.md new file mode 100644 index 0000000..9081b5f --- /dev/null +++ b/architectures/micro-frontends/readme.md @@ -0,0 +1,99 @@ +--- +description: Vibe coding guidelines and architectural constraints for Micro-frontends within the Architecture domain. +tags: [micro-frontends, architecture, module-federation, frontend, scalable, web-components, vibe-coding] +topic: Micro-frontends +complexity: Architect +last_evolution: 2026-03-22 +vibe_coding_ready: true +technology: Micro-frontends +domain: Architecture +level: Senior/Architect +version: Agnostic +ai_role: Senior Architect +last_updated: 2026-03-22 +--- + +
+ # 🧩 Micro-frontends Production-Ready Best Practices +
+ +--- + +Этот инженерный директив определяет **лучшие практики (best practices)** для архитектуры Micro-frontends. Данный документ спроектирован для обеспечения максимальной масштабируемости, безопасности и качества кода при разработке frontend-приложений корпоративного уровня. + +# Context & Scope +- **Primary Goal:** Предоставить строгие архитектурные правила и практические паттерны для разбиения монолитного фронтенда на независимые, развертываемые микро-приложения. +- **Description:** An architectural style where independently deliverable frontend applications are composed into a greater whole. This enables multiple teams to work simultaneously without stepping on each other's toes. + +## Map of Patterns +- 📊 [**Data Flow:** Request and Event Lifecycle](./data-flow.md) +- 📁 [**Folder Structure:** Layering logic](./folder-structure.md) +- ⚖️ [**Trade-offs:** Pros, Cons, and System Constraints](./trade-offs.md) +- 🛠️ [**Implementation Guide:** Code patterns and Anti-patterns](./implementation-guide.md) + +## Core Principles + +1. **Independent Deployments:** Each micro-frontend must be deployable on its own without requiring a redeployment of the entire system. +2. **Technology Agnostic (Optional but powerful):** Different teams can use different frameworks (React, Vue, Angular) if necessary, though standardization is recommended for performance. +3. **Isolated State:** Micro-frontends should not share global state directly; communication must be handled via established protocols (e.g., Custom Events, Window, Event Bus). +4. **Resilience:** Failure in one micro-frontend should not crash the entire application (graceful degradation). + +--- + +## 1. Global State Coupling + +### ❌ Bad Practice +```javascript +// Micro-frontend A directly mutating global window object for state sharing +window.__APP_STATE__ = { + user: { id: 1, name: "Alice" }, + cart: [{ item: "Laptop", price: 1000 }] +}; + +// Micro-frontend B strictly depending on this global state +const cart = window.__APP_STATE__.cart; +``` + +### ⚠️ Problem +Directly mutating and depending on global objects like `window` creates tight coupling between micro-frontends. This leads to race conditions, unpredictable state mutations, and makes isolated testing impossible. It destroys the independence of micro-frontends. + +### ✅ Best Practice +```javascript +// Using an Event Bus or Custom Events for decoupled communication + +// Micro-frontend A (Publisher) +const event = new CustomEvent('cart:itemAdded', { + detail: { item: "Laptop", price: 1000 } +}); +window.dispatchEvent(event); + +// Micro-frontend B (Subscriber) +window.addEventListener('cart:itemAdded', (event) => { + const { item, price } = event.detail; + updateCartUI(item, price); +}); +``` + +### 🚀 Solution +Communication between micro-frontends must be asynchronous and event-driven. Using standard DOM events (CustomEvents) ensures that micro-frontends remain entirely decoupled. The publisher doesn't need to know if subscribers exist, and subscribers only react to explicit, documented contracts. + +--- + +## Architecture Diagram + +```mermaid +graph TD + AppShell[App Shell / Host] --> MFE_Auth[Micro-frontend: Auth] + AppShell --> MFE_Catalog[Micro-frontend: Catalog] + AppShell --> MFE_Checkout[Micro-frontend: Checkout] + + %% Added Design Token Styles for Mermaid Diagrams + classDef default fill:#e1f5fe,stroke:#03a9f4,stroke-width:2px,color:#000; + classDef component fill:#e8f5e9,stroke:#4caf50,stroke-width:2px,color:#000; + classDef layout fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px,color:#000; + + class AppShell layout; + class MFE_Auth component; + class MFE_Catalog component; + class MFE_Checkout component; +``` diff --git a/architectures/micro-frontends/trade-offs.md b/architectures/micro-frontends/trade-offs.md new file mode 100644 index 0000000..c698894 --- /dev/null +++ b/architectures/micro-frontends/trade-offs.md @@ -0,0 +1,60 @@ +--- +description: Vibe coding guidelines and architectural constraints for Micro-frontends Trade-offs within the Architecture domain. +tags: [micro-frontends, architecture, module-federation, frontend, trade-offs, constraints, vibe-coding] +topic: Micro-frontends Trade-offs +complexity: Architect +last_evolution: 2026-03-22 +vibe_coding_ready: true +technology: Micro-frontends +domain: Architecture +level: Senior/Architect +version: Agnostic +ai_role: Senior Architect +last_updated: 2026-03-22 +--- + +
+ # ⚖️ Micro-frontends Trade-offs +
+ +--- + +Этот документ определяет плюсы, минусы и системные ограничения в архитектуре Micro-frontends. + +## Evaluated Pros & Cons + +### 1. Excessive Dependency Duplication + +#### ❌ Bad Practice +```javascript +// Every micro-frontend independently packages 'react' and 'react-dom' +// MFE Auth bundle size: 2MB (React included) +// MFE Catalog bundle size: 3MB (React included) +``` + +#### ⚠️ Problem +If every micro-frontend builds and ships its own core dependencies (like React, Angular, or Lodash), the user's browser ends up downloading the exact same libraries multiple times. This destroys frontend performance, increases Time-to-Interactive (TTI), and causes memory bloat. + +#### ✅ Best Practice +```javascript +// Webpack 5 Module Federation configuration in App Shell +plugins: [ + new ModuleFederationPlugin({ + name: "app_shell", + shared: { + react: { singleton: true, eager: true, requiredVersion: deps.react }, + "react-dom": { singleton: true, eager: true, requiredVersion: deps["react-dom"] }, + }, + }), +] +``` + +#### 🚀 Solution +Utilize Webpack 5 Module Federation (or similar tools like Vite Federation) to specify `shared` dependencies. By marking frameworks as singletons, the browser downloads the dependency only once, sharing it across all micro-frontends dynamically at runtime. + +--- + +## Constraints Checklist +- **System Governance:** Do you have robust CI/CD pipelines to manage 10+ independent deployments? +- **Team Size:** Micro-frontends add overhead. They are designed for large organizations (e.g., 30+ frontend engineers) divided into autonomous squads. Avoid for small MVPs. +- **Testing Complexity:** End-to-End (E2E) testing becomes significantly harder because the true application only exists at runtime. diff --git a/architectures/readme.md b/architectures/readme.md index 44be9f3..68395a4 100644 --- a/architectures/readme.md +++ b/architectures/readme.md @@ -467,3 +467,46 @@ src/ - **Languages:** Strongly-typed languages (TypeScript, C#). - **Patterns / Principles:** Event Sourcing, CQS, Mediator. - **Tools/Databases:** PostgreSQL (Command DB), ElasticSearch or Redis (Query DB). + +--- + +### 11. Micro-frontends +[![Micro-frontends](https://img.shields.io/badge/Architecture-Micro--frontends-orange?style=flat-square)](#) + +**Description:** An architectural style where independently deliverable frontend applications are composed into a greater whole. This enables multiple teams to work simultaneously without stepping on each other's toes, making scaling enterprise frontends deterministic. +**📖 Map of Patterns:** [Go to Micro-frontends Guidelines](./micro-frontends/readme.md) + +**Architecture Diagram & Folder Tree:** +```mermaid +graph TD + AppShell[App Shell / Host] --> MFE_Auth[Micro-frontend: Auth] + AppShell --> MFE_Catalog[Micro-frontend: Catalog] + AppShell --> MFE_Checkout[Micro-frontend: Checkout] + + %% Added Design Token Styles for Mermaid Diagrams + classDef default fill:#e1f5fe,stroke:#03a9f4,stroke-width:2px,color:#000; + classDef component fill:#e8f5e9,stroke:#4caf50,stroke-width:2px,color:#000; + classDef layout fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px,color:#000; + + class AppShell layout; + class MFE_Auth component; + class MFE_Catalog component; + class MFE_Checkout component; +``` + +```text +workspace/ +├── 📁 apps/ +│ ├── 📁 app-shell/ # Entry point, Router, Module Federation config +│ ├── 📁 mfe-catalog/ # Independent application +│ └── 📁 mfe-checkout/ # Independent application +└── 📁 packages/ + ├── 📁 design-system/ # Pure, dumb UI components only + └── 📁 event-bus/ # Agnostic communication contract types +``` + +**Best Compatibility:** +- **Frameworks:** React, Vue, Angular. +- **Languages:** TypeScript. +- **Patterns / Principles:** Module Federation, Event-Driven Communication. +- **Tools:** Webpack 5, Vite. diff --git a/package-lock.json b/package-lock.json index b99584f..19e34d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,12 +4,15 @@ "requires": true, "packages": { "": { + "name": "best-practise", "dependencies": { "@google-cloud/aiplatform": "^6.5.0", "@google-cloud/storage": "^7.19.0", "@google-cloud/vertexai": "^1.1.0", "@google/genai": "^1.46.0", - "axios": "^1.13.6", + "axios": "^1.13.6" + }, + "devDependencies": { "dotenv": "^17.3.1", "nodemon": "^3.1.14" } @@ -420,6 +423,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -519,6 +523,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -540,6 +545,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -571,6 +577,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -761,6 +768,7 @@ "version": "17.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -956,6 +964,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -1033,6 +1042,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -1166,6 +1176,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -1376,6 +1387,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -1479,6 +1491,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, "license": "ISC" }, "node_modules/inherits": { @@ -1491,6 +1504,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -1503,6 +1517,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1521,6 +1536,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -1533,6 +1549,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -1735,6 +1752,7 @@ "version": "3.1.14", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", + "dev": true, "license": "MIT", "dependencies": { "chokidar": "^3.5.2", @@ -1763,6 +1781,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, "license": "MIT", "engines": { "node": "18 || 20 || >=22" @@ -1772,6 +1791,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -1784,6 +1804,7 @@ "version": "10.2.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" @@ -1799,6 +1820,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1900,6 +1922,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -1954,6 +1977,7 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, "license": "MIT" }, "node_modules/readable-stream": { @@ -1974,6 +1998,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -2053,6 +2078,7 @@ "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2098,6 +2124,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, "license": "MIT", "dependencies": { "semver": "^7.5.3" @@ -2248,6 +2275,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -2314,6 +2342,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -2326,6 +2355,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, "license": "ISC", "bin": { "nodetouch": "bin/nodetouch.js" @@ -2341,6 +2371,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, "license": "MIT" }, "node_modules/undici-types": {