{"_id":"@adalink/spark-middleware","name":"@adalink/spark-middleware","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@adalink/spark-middleware","version":"1.0.0","description":"Method decorators for cross-cutting concerns (AOP)","type":"module","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/Adalink-ai/spark_middleware.git"},"bugs":{"url":"https://github.com/Adalink-ai/spark_middleware/issues"},"homepage":"https://github.com/Adalink-ai/spark_middleware#readme","author":{"name":"Cleber de Moraes Goncalves","email":"cleber.engineer@gmail.com","url":"https://github.com/deMGoncalves"},"exports":{"./middleware":{"import":"./dist/middleware.js","require":"./dist/middleware.cjs"},"./middleware/before":{"import":"./dist/before.js","require":"./dist/before.cjs"},"./middleware/around":{"import":"./dist/around.js","require":"./dist/around.cjs"},"./middleware/after":{"import":"./dist/after.js","require":"./dist/after.cjs"}},"keywords":["middleware","decorators","aop","aspect-oriented","interceptors","methods","validation","logging","web-development"],"devDependencies":{"@biomejs/biome":"2.4.7","@commitlint/cli":"^20.5.0","@commitlint/config-conventional":"^20.5.0","esbuild":"^0.27.2","husky":"^9.1.7","lint-staged":"^16.4.0","vite":"^8.0.2"},"scripts":{"build":"vite build","dev":"vite","lint":"biome check .","prepare":"husky"},"_id":"@adalink/spark-middleware@1.0.0","gitHead":"cf5fbe094c3901888b66a03fff300d2f1d3c667f","_nodeVersion":"20.20.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-QpD52CTInbp7OCDS8PK0PykF1L2LPAJ7KHO50fgvhqm6Gtnptq01KjqscpwGjJYoQCfg+/6QXigH+wRHRD6LEQ==","shasum":"8d5ff9d35ffb90226b65c3c36626664ba15a22a2","tarball":"https://registry.npmjs.org/@adalink/spark-middleware/-/spark-middleware-1.0.0.tgz","fileCount":17,"unpackedSize":35539,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIA4ww8bWOE0i0aLHfXRVmYO+8FLzrTIcVtAxJxs/ISDZAiBYv19/ks+CTAmKwhF/+eG9h6Ol5ZQG7FMuKd30nUtPNA=="}]},"_npmUser":{"name":"cleiton.couto","email":"cleiton.couto@adalink.ai"},"directories":{},"maintainers":[{"name":"cleiton.couto","email":"cleiton.couto@adalink.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spark-middleware_1.0.0_1774386702656_0.5750611373779224"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-24T21:11:42.559Z","1.0.0":"2026-03-24T21:11:42.804Z","modified":"2026-03-24T21:11:43.088Z"},"maintainers":[{"name":"cleiton.couto","email":"cleiton.couto@adalink.ai"}],"description":"Method decorators for cross-cutting concerns (AOP)","homepage":"https://github.com/Adalink-ai/spark_middleware#readme","keywords":["middleware","decorators","aop","aspect-oriented","interceptors","methods","validation","logging","web-development"],"repository":{"type":"git","url":"git+https://github.com/Adalink-ai/spark_middleware.git"},"author":{"name":"Cleber de Moraes Goncalves","email":"cleber.engineer@gmail.com","url":"https://github.com/deMGoncalves"},"bugs":{"url":"https://github.com/Adalink-ai/spark_middleware/issues"},"license":"Apache-2.0","readme":"# 🔄 Spark Middleware\n\n[![npm version](https://img.shields.io/npm/v/@adalink/spark-middleware?style=flat-square)](https://www.npmjs.com/package/@adalink/spark-middleware)\n[![License](https://img.shields.io/npm/l/@adalink/spark-middleware?style=flat-square)](LICENSE)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/Adalink-ai/spark_middleware/ci.yml?style=flat-square)](https://github.com/Adalink-ai/spark_middleware/actions)\n[![Code Style](https://img.shields.io/badge/code_style-biome-purple?style=flat-square)](https://biomejs.dev)\n[![Ecosystem](https://img.shields.io/badge/Spark_Ecosystem-compatible-blue?style=flat-square)](https://github.com/Adalink-ai)\n\n**Method decorators for cross-cutting concerns. Zero dependencies, tree-shakeable.**\n\n---\n\n## 📖 What is Spark Middleware?\n\nSpark Middleware is a lightweight library that implements Aspect-Oriented Programming (AOP) using JavaScript decorators. It provides powerful interceptors for methods and setters, enabling clean separation of cross-cutting concerns like validation, logging, authentication, and data transformation.\n\n### 🎯 Why Choose Spark Middleware?\n\n- **Zero Dependencies** - No runtime dependencies, just pure JavaScript\n- **AOP Pattern** - Separate cross-cutting concerns from business logic\n- **Composable** - Stack multiple decorators together\n- **Framework Agnostic** - Works with any framework or vanilla JavaScript\n- **Performance First** - Minimal bundle size (~70B gzipped per decorator)\n- **Developer Experience** - Clean, declarative API\n- **Production Ready** - Battle-tested in real-world applications\n\n### 🚀 Perfect For\n\n- **Validation** - Transform and validate method arguments\n- **Logging** - Log method calls without cluttering business logic\n- **Authentication** - Inject authentication checks\n- **Data Transformation** - Transform return values automatically\n- **Telemetry** - Track method execution\n- **Security** - Enforce security policies\n\n---\n\n## ✨ Key Features\n\n### 🎯 Three Decorator Types\n\nExecute code exactly where you need it:\n\n```javascript\nimport { before, around, after } from '@adalink/spark-middleware';\n\n// @before: Transform arguments before method\n@before(validate)\nsetValue(value) {\n  // value is already validated\n}\n\n// @around: Run code after method (async)\n@around(log)\nprocessData() {\n  // Method runs, then log fires\n}\n\n// @after: Transform return value\n@after(format)\ngetData() {\n  // Result is formatted automatically\n}\n```\n\n### 🔄 Stacking Decorators\n\nCombine multiple interceptors:\n\n```javascript\nclass Service {\n  @before(authenticate)\n  @around(log)\n  @after(sanitize)\n  processData(input) {\n    // Authenticate → Log → method → Sanitize\n    return { result: input };\n  }\n}\n```\n\n### ⚡ Zero Dependencies\n\nJust pure JavaScript Proxy API:\n\n```bash\n# Bundle size per decorator\nbefore:   ~70B gzipped\naround:   ~70B gzipped\nafter:    ~70B gzipped\n```\n\n---\n\n## 🔗 Integração com Spark Ecosystem\n\nO Spark Middleware é parte do Spark Ecosystem, trabalhando em harmonia com outras bibliotecas Spark para criar aplicações web completas.\n\n### 📦 Pacotes Relacionados\n\n**[@adalink/spark-std](https://github.com/Adalink-ai/spark_std)** - Biblioteca padrão com decorators para Web Components\n\nUse Spark Middleware com componentes criados com Spark Std:\n\n```javascript\nimport { define, connected } from '@adalink/spark-std';\nimport { paint, html, css } from '@adalink/spark-std/dom';\nimport { event } from '@adalink/spark-std/event';\nimport { paint as paintDom, html as htmlDom, css as cssDom } from '@adalink/spark-std/dom';\nimport { before, around, after } from '@adalink/spark-middleware';\nimport http from '@adalink/spark-http';\nimport cookie from '@adalink/spark-cookie';\n\n@define('spark-data-table')\n@paintDom(template, styles)\nclass DataTable extends HTMLElement {\n  #data = [];\n  #loading = false;\n\n  @before(checkAuth)\n  @around(logFetch)\n  @after(transformData)\n  async fetchData() {\n    const token = cookie.getItem('access_token');\n    const { data } = await http\n      .GET(this.getAttribute('data-url'))\n      .headers({ Authorization: `Bearer ${token}` })\n      .json();\n    return data;\n  }\n\n  checkAuth(args) {\n    if (!cookie.getItem('access_token')) {\n      throw new Error('Unauthorized');\n    }\n    return args;\n  }\n\n  logFetch(args) {\n    console.log('Fetching data:', args);\n  }\n\n  transformData(data) {\n    return {\n      items: Array.isArray(data) ? data : [data],\n      total: Array.isArray(data) ? data.length : 1\n    };\n  }\n\n  @event.click('button.refresh')\n  refresh() {\n    this.fetchData().then(data => {\n      this.#data = data;\n      this.render();\n    });\n  }\n\n  render() {\n    if (this.#loading) {\n      this.shadowRoot.innerHTML = htmlDom`<div class=\"loading\">Loading...</div>`;\n    } else {\n      this.shadowRoot.innerHTML = htmlDom`\n        <div class=\"data\">\n          ${this.#data.map(item => htmlDom`\n            <div class=\"row\">${JSON.stringify(item)}</div>\n          `)}\n        </div>\n        <button class=\"refresh\">Refresh</button>\n      `;\n    }\n  }\n}\n\nfunction template(component) {\n  return htmlDom`<div id=\"content\"></div>`;\n}\n\nfunction styles(component) {\n  return cssDom`\n    .loading, .data {\n      padding: 1rem;\n      text-align: center;\n    }\n    .row {\n      padding: 0.5rem;\n      border-bottom: 1px solid #eee;\n    }\n    button {\n      margin-top: 1rem;\n      padding: 0.5rem 1rem;\n      background: #667eea;\n      color: white;\n      border: none;\n      border-radius: 4px;\n      cursor: pointer;\n    }\n  `;\n}\n```\n\n**Funcionalidades Combinadas:**\n- ✅ Spark Std fornece decorators base (`@define`, `@paint`, `@event`)\n- ✅ Spark Middleware fornece interceptores de método\n- ✅ Spark HTTP fornece requests HTTP fluentes\n- ✅ Spark Cookie fornece gerenciamento de cookies (opcional)\n- ✅ Use decorators para compor comportamento complexo\n- ✅ Todos funcionam com Web Components nativos\n\n---\n\n## 🚀 Quick Start\n\n### Installation\n\n#### Option 1: Install from npm (Recommended)\n\n```bash\n# Using npm\nnpm install @adalink/spark-middleware\n\n# Using yarn\nyarn add @adalink/spark-middleware\n\n# Using pnpm\npnpm add @adalink/spark-middleware\n\n# Using bun\nbun add @adalink/spark-middleware\n```\n\n#### Option 2: Install from GitHub (Alternative)\n\n```bash\n# Install directly from GitHub repository\nnpm install github:Adalink-ai/spark_middleware#v1.0.0\n```\n\n#### Option 3: Import from CDN (Browser Only)\n\n```javascript\n// Import modules from unpkg or jsDelivr (ESM)\nimport { before, around, after } from \"https://unpkg.com/@adalink/spark-middleware@1.0.0/dist/middleware.js\";\n```\n\n**⚠️ Important Notice:**\nThis package is **private** and published to npm. To install it:\n1. Have an npm account\n2. Request access to the `@adalink` scope from the maintainers\n3. Configure npm authentication in your environment\n\n---\n\n### Basic Usage\n\n#### @before - Transform Arguments\n\nExecute code BEFORE method call:\n\n```javascript\nimport { before } from '@adalink/spark-middleware';\n\nclass FormHandler {\n  @before(validate)\n  submit(data) {\n    // data is already validated and transformed\n    console.log(' submitting:', data);\n    api.send(data);\n  }\n\n  validate(data) {\n    if (!data.name) throw new Error('Name required');\n    if (!data.email?.includes('@')) throw new Error('Invalid email');\n    \n    // Transform data before returning\n    return {\n      ...data,\n      timestamp: Date.now(),\n      validated: true\n    };\n  }\n}\n\nconst form = new FormHandler();\nform.submit({ name: 'John', email: 'john@example.com' });\n// Runs validate() → submit(validated_data)\n```\n\n#### @around - Run After (Async)\n\nExecute code AFTER method call asynchronously:\n\n```javascript\nimport { around } from '@adalink/spark-middleware';\n\nclass APIService {\n  @around(logRequest)\n  async fetchUser(id) {\n    const response = await fetch(`https://api.example.com/users/${id}`);\n    return response.json();\n  }\n\n  logRequest(args) {\n    // Called asynchronously after fetchUser completes\n    console.log('API request made with args:', args);\n    metrics.increment('api.calls');\n  }\n}\n\nconst api = new APIService();\napi.fetchUser(123);\n// Runs fetchUser() → logRequest (async)\n```\n\n#### @after - Transform Return Value\n\nExecute code WITH the return value:\n\n```javascript\nimport { after } from '@adalink/spark-middleware';\n\nclass DataService {\n  @after(transformToDTO)\n  async getProduct(id) {\n    const response = await fetch(`https://api.example.com/products/${id}`);\n    const product = await response.json();\n    return product;\n  }\n\n  transformToDTO(product) {\n    // Transform the return value\n    return {\n      id: product.id,\n      name: product.name,\n      price: `$${product.price.toFixed(2)}`,\n      formatted: true\n    };\n  }\n}\n\nconst service = new DataService();\nconst result = await service.getProduct(123);\nconsole.log(result);\n// { id: 123, name: \"...\", price: \"$99.99\", formatted: true }\n```\n\n#### Stacking Multiple Decorators\n\nCombine multiple interceptors:\n\n```javascript\nimport { before, around, after } from '@adalink/spark-middleware';\n\nclass SecureService {\n  @before(authenticate)\n  @around(logOperation)\n  @after(sanitizeResponse)\n  async updateData(data) {\n    // Execution order:\n    // 1. authenticate() transforms data\n    // 2. updateData() runs and returns result\n    // 3. logOperation() runs asynchronously\n    // 4. sanitizeResponse() transforms result\n    \n    const response = await fetch('https://api.example.com/data', {\n      method: 'POST',\n      body: JSON.stringify(data)\n    });\n    return response.json();\n  }\n\n  authenticate(data) {\n    if (!data.token) throw new Error('Unauthorized');\n    return { ...data, authenticated: true };\n  }\n\n  logOperation(args) {\n    console.log('Operation:', args);\n    metrics.track('secure.update', args);\n  }\n\n  sanitizeResponse(data) {\n    // Remove sensitive data\n    const { password, token, ...sanitized } = data;\n    return sanitized;\n  }\n}\n```\n\n#### Works with Setters Too\n\nDecorators work with setters:\n\n```javascript\nimport { before, after } from '@adalink/spark-middleware';\n\nclass SmartComponent {\n  #internalValue;\n\n  @before(validateInput)\n  @after(notifyChange)\n  set value(newValue) {\n    this.#internalValue = newValue;\n  }\n\n  get value() {\n    return this.#internalValue;\n  }\n\n  validateInput(value) {\n    if (typeof value !== 'string') throw new Error('Must be string');\n    return value.trim();\n  }\n\n  notifyChange(value) {\n    console.log('Value changed to:', value);\n    this.dispatchEvent(new CustomEvent('value-changed', { detail: value }));\n  }\n}\n\nconst component = new SmartComponent();\ncomponent.value = '  hello  ';  // \"hello\" (trimmed and notified)\n// Runs validateInput() → setter → notifyChange()\n```\n\n---\n\n## 📦 API Reference\n\n### @before(method)\n\nExecute interceptor BEFORE method call.\n\n**Parameters:**\n- `method` (function|string) - Interceptor method name or function\n\n**Behavior:**\n1. Interceptor receives original arguments\n2. Interceptor must return transformed arguments\n3. Original method receives transformed args\n4. Original method's return value is returned to caller\n\n**Usage:**\n```javascript\n@before(validate)\nsetValue(value) { /* value is validated */ }\n\nvalidate(value) {\n  return value.toUpperCase();\n}\n```\n\n---\n\n### @around(method)\n\nExecute interceptor AFTER method call (async).\n\n**Parameters:**\n- `method` (function|string) - Interceptor method name or function\n\n**Behavior:**\n1. Original method runs immediately\n2. Interceptor runs asynchronously via setImmediate\n3. Interceptor doesn't affect return value\n4. Caller receives original method's return value\n\n**Usage:**\n```javascript\n@around(log)\nasync fetchData() { /* fetch and return */ }\n\nlog(args) {\n  console.log('Called with:', args);\n}\n```\n\n---\n\n### @after(method)\n\nExecute interceptor WITH return value.\n\n**Parameters:**\n- `method` (function|string) - Interceptor method name or function\n\n**Behavior:**\n1. Original method runs and returns value\n2. Interceptor receives method's return value\n3. Interceptor must return transformed value\n4. Caller receives interceptor's return value\n\n**Usage:**\n```javascript\n@after(format)\ngetData() { return { raw: 'data' }; }\n\nformat(data) {\n  return { ...data, formatted: true };\n}\n```\n\n---\n\n## 🎯 Real-World Use Cases\n\n### Validation decorator\n\n```javascript\nimport { before } from '@adalink/spark-middleware';\n\nclass Validator {\n  @before(validateEmail)\n  setEmail(email) {\n    this.email = email;\n  }\n\n  @before(validateAge)\n  setAge(age) {\n    this.age = age;\n  }\n\n  validateEmail(email) {\n    if (!email?.includes('@')) throw new Error('Invalid email');\n    return email.toLowerCase().trim();\n  }\n\n  validateAge(age) {\n    const num = parseInt(age, 10);\n    if (isNaN(num) || num < 0 || num > 150) throw new Error('Invalid age');\n    return num;\n  }\n}\n```\n\n### Authentication decorator\n\n```javascript\nimport { before } from '@adalink/spark-middleware';\n\nclass AuthService {\n  #token = null;\n\n  @before(checkAuth)\n  async fetchProtectedData() {\n    const response = await fetch('https://api.example.com/protected', {\n      headers: { 'Authorization': `Bearer ${this.#token}` }\n    });\n    return response.json();\n  }\n\n  @before(requireAuth)\n  createSession(user, password) {\n    return api.login(user, password);\n  }\n\n  checkAuth() {\n    if (!this.#token) throw new Error('Not authenticated');\n  }\n\n  requireAuth(credentials) {\n    if (!credentials?.user || !credentials?.password) {\n      throw new Error('Credentials required');\n    }\n    return credentials;\n  }\n}\n```\n\n### Logging decorator\n\n```javascript\nimport { around } from '@adalink/spark-middleware';\n\nclass Logger {\n  @around(logMethod)\n  async fetchData(id) {\n    const response = await fetch(`https://api.example.com/data/${id}`);\n    return response.json();\n  }\n\n  @around(logError)\n  async riskyOperation(data) {\n    // Might throw error\n    return process(data);\n  }\n\n  logMethod(args) {\n    console.log(`Method called with:`, args);\n    metrics.increment('method.calls');\n  }\n\n  logError(args) {\n    console.log(`Error occurred with args:`, args);\n    metrics.increment('method.errors');\n  }\n}\n```\n\n### Data transformation decorator\n\n```javascript\nimport { after } from '@adalink/spark-middleware';\n\nclass Transformer {\n  @after(toCamelCase)\n  fetchData() {\n    return { first_name: 'John', last_name: 'Doe', user_age: 30 };\n  }\n\n  toCamelCase(obj) {\n    return Object.keys(obj).reduce((acc, key) => {\n      const camelKey = key.replace(/_([a-z])/g, (_, c) => c.toUpperCase());\n      acc[camelKey] = obj[key];\n      return acc;\n    }, {});\n  }\n  // Returns: { firstName: 'John', lastName: 'Doe', userAge: 30 }\n}\n```\n\n---\n\n## 📊 Why Spark Middleware Over Alternatives?\n\n| Feature | Spark Middleware | Core Decorators | Decorator Agent | lodash-decorators |\n|---------|------------------|------------------|-----------------|-------------------|\n| Zero Dependencies | ✅ | ✅ | ✅ | ❌ |\n| Bundle Size | ~70B/dec | ~1.2KB | ~800B | ~2KB |\n| AOP Pattern | ✅ | ⚠️ | ⚠️ | ❌ |\n| @before | ✅ | ✅ | ✅ | ✅ |\n| @around | ✅ | ✅ | ✅ | ✅ |\n| @after | ✅ | ✅ | ❌ | ✅ |\n| Async Support | ✅ | ✅ | ⚠️ | ⚠️ |\n| Works with Setters | ✅ | ✅ | ✅ | ⚠️ |\n| Stacking | ✅ | ✅ | ✅ | ✅ |\n| TypeScript Ready | ✅ | ✅ | ✅ | ✅ |\n\n---\n\n## 🌐 Usage in Frameworks\n\n### With Vanilla JavaScript\n\n```javascript\nimport { before, after } from '@adalink/spark-middleware';\n\nclass UserService {\n  @before(validate)\n  async createUser(data) {\n    const response = await fetch('/api/users', {\n      method: 'POST',\n      body: JSON.stringify(data)\n    });\n    return response.json();\n  }\n\n  validate(user) {\n    if (!user.email || !user.password) {\n      throw new Error('Email and password required');\n    }\n    return { ...user, created_at: Date.now() };\n  }\n}\n```\n\n### With React\n\n```javascript\nimport { before, around } from '@adalink/spark-middleware';\nimport { useState } from 'react';\n\nclass AuthManager {\n  constructor(setUser) {\n    this.setUser = setUser;\n  }\n\n  @before(checkCredentials)\n  async login(credentials) {\n    const response = await fetch('/api/login', {\n      method: 'POST',\n      body: JSON.stringify(credentials)\n    });\n    return response.json();\n  }\n\n  @around(logAuth)\n  async logout() {\n    const response = await fetch('/api/logout', { method: 'POST' });\n    this.setUser(null);\n    return response.json();\n  }\n\n  checkCredentials(creds) {\n    if (!creds.email || !creds.password) {\n      throw new Error('Email and password required');\n    }\n    return creds;\n  }\n\n  logAuth(args) {\n    console.log('Auth action:', args[0]);\n  }\n}\n\nfunction Login() {\n  const [user, setUser] = useState(null);\n  const auth = new AuthManager(setUser);\n\n  // Use auth.login and auth.logout\n}\n```\n\n### With Vue\n\n```javascript\nimport { before, after } from '@adalink/spark-middleware';\n\nclass Store {\n  constructor() {\n    this.data = [];\n  }\n\n  @before(validateItem)\n  addItem(item) {\n    this.data.push(item);\n    return item;\n  }\n\n  @after(sortItems)\n  async fetchItems() {\n    const response = await fetch('/api/items');\n    const items = await response.json();\n    this.data = items;\n    return items;\n  }\n\n  validateItem(item) {\n    if (!item.id || !item.name) {\n      throw new Error('Item must have id and name');\n    }\n    return { ...item, timestamp: Date.now() };\n  }\n\n  sortItems(items) {\n    return items.sort((a, b) => a.name.localeCompare(b.name));\n  }\n}\n\nexport default {\n  data() {\n    return {\n      store: new Store()\n    }\n  }\n  // Use store inside Vue component\n}\n```\n\n---\n\n## 🛠️ Development\n\n### Prerequisites\n\n- Node.js 18+\n\n### Setup\n\n```bash\n# Clone repository\ngit clone https://github.com/Adalink-ai/spark_middleware.git\ncd spark_middleware\n\n# Install dependencies\nnpm install\n\n# Build package\nnpm run build\n\n# Start development server\nnpm run dev\n\n# Lint and format\nnpx biome check .\nnpx biome check --write .\n```\n\n---\n\n## 📚 Documentation\n\n- **Architecture:** [ARCHITECTURE.md](ARCHITECTURE.md) - Design decisions and patterns\n- **Contributing:** [CONTRIBUTING.md](CONTRIBUTING.md) - Development guidelines\n- **Security:** [SECURITY.md](SECURITY.md) - Security policies\n- **Changelog:** [CHANGELOG.md](CHANGELOG.md) - Project changes\n- **Authors:** [AUTHORS.md](AUTHORS.md) - Author information\n\n---\n\n## 🤝 Contributing\n\nWe welcome contributions! Please read our [Contributing Guide](CONTRIBUTING.md) before getting started.\n\n**Ways to contribute:**\n- 🐛 [Report bugs](https://github.com/Adalink-ai/spark_middleware/issues/new?template=bug_report.md)\n- 💡 [Suggest features](https://github.com/Adalink-ai/spark_middleware/issues/new?template=feature_request.md)\n- 📖 [Improve documentation](https://github.com/Adalink-ai/spark_middleware/issues/new?template=documentation.md)\n- 🔧 [Submit pull requests](https://github.com/Adalink-ai/spark_middleware/pulls)\n\n---\n\n## 👥 Author & Community\n\n**Cleber de Moraes Goncalves** - Creator & Lead Maintainer\n\n- 📧 Email: cleber.engineer@gmail.com\n- 🐙 GitHub: [deMGoncalves](https://github.com/deMGoncalves)\n- 💼 LinkedIn: [deMGoncalves](https://linkedin.com/in/deMGoncalves)\n- 📸 Instagram: [deMGoncalves](https://instagram.com/deMGoncalves)\n\n### 🌟 Star the Project\n\nIf you find Spark Middleware useful, please ⭐ star it on GitHub!\n\n### 📢 Share\n\nShare Spark Middleware with your network:\n- [Twitter](https://twitter.com/intent/tweet?text=Check%20out%20@adalink/spark-middleware%20-%20AOP%20decorators%20for%20JavaScript!&url=https://github.com/Adalink-ai/spark_middleware)\n- [LinkedIn](https://www.linkedin.com/shareArticle?mini=true&url=https://github.com/Adalink-ai/spark_middleware&title=Spark%20Middleware&summary=Aspect-Oriented%20Programming%20decorators%20for%20JavaScript)\n\n---\n\n## 🌐 Spark Ecosystem\n\nO Spark Ecosystem é um conjunto de bibliotecas para desenvolvimento web reativo:\n\n- **[@adalink/spark-std](https://github.com/Adalink-ai/spark_std)** - Biblioteca padrão com decorators para Web Components\n- **[@adalink/spark-echo](https://github.com/Adalink-ai/spark_echo)** - Sistema de comunicação reativa entre componentes\n- **[@adalink/spark-cookie](https://github.com/Adalink-ai/spark_cookie)** - Gerenciamento de cookies\n- **[@adalink/spark-http](https://github.com/Adalink-ai/spark_http)** - Cliente HTTP fluente\n\n**Mais pacotes em breve:**\n- [@adalink/spark-form](https://github.com/Adalink-ai/spark_form) - Componentes de formulário reativos (em breve)\n- [@adalink/spark-router](https://github.com/Adalink-ai/spark_router) - Roteamento SPA (em breve)\n\n---\n\n## 📄 License\n\n[Apache-2.0](LICENSE) © 2026 Adalink\n\n---\n\n## 🔗 Links\n\n- **Repository:** [github.com/Adalink-ai/spark_middleware](https://github.com/Adalink-ai/spark_middleware)\n- **NPM Package:** [npmjs.com/package/@adalink/spark-middleware](https://www.npmjs.com/package/@adalink/spark-middleware)\n- **Organization:** [github.com/Adalink-ai](https://github.com/Adalink-ai)\n\n---\n\n**Built with ❤️ by [Adalink](https://github.com/Adalink-ai)**\n\n**Spark Middleware** - Compose behavior with ease. 🔄\n","readmeFilename":"README.md","_rev":"1-c34d6c96731d76586305a02c0eaf8f62"}