npm package: @smess/networking
Description: Networking utilities and services for SMESS platform.
Latest version: 1.1.5

# SMESS Networking Package

## Features

- Per-instance configuration (no global config)
- RxJS-based HTTP services
- Extensible provider/service architecture
- TypeScript-first
- **Bundler-friendly** (Webpack, Vite, Rollup compatible)

## Installation

```bash
npm install @smess/networking
```

## Usage

### 1. Define your config

```typescript
const configA = {
  baseUrl: "https://api-a",
  isProd: false,
  clientId: "A",
  apiKey: "keyA",
};
const configB = {
  baseUrl: "https://api-b",
  isProd: true,
  clientId: "B",
  apiKey: "keyB",
};
```

### 2. Create providers/services with config

```typescript
import { ProductService, UserService, AuthService } from "@smess/networking";

const productServiceA = new ProductService(configA);
const productServiceB = new ProductService(configB);
const userServiceA = new UserService(configA);
const authServiceA = new AuthService(configA);
```

### 3. Use services independently

```typescript
// Using RxJS Observables
productServiceA.fetchAllProducts().subscribe(...);
productServiceB.createProduct({ name: 'X', price: 10 }).subscribe(...);
userServiceA.fetchUserById(1).subscribe(...);
authServiceA.login({ identifier: 'user', password: 'pass' }).subscribe(...);

// Or convert to Promises for async/await
const user = await userServiceA.fetchUserById(1).toPromise();
const products = await productServiceA.fetchAllProducts().toPromise();
```

### 4. Example: Custom Provider

```typescript
import { BaseProvider, SmessService } from "@smess/networking";

const config = {
  baseUrl: "https://custom-api",
  isProd: false,
  clientId: "custom-client",
  apiKey: "custom-key",
};

class ExampleProvider extends BaseProvider {
  constructor(config, resourceId: string) {
    super({
      config,
      path: `/resource/${resourceId}`,
      method: "GET",
      headers: { "Custom-Header": "value" },
      getPath: () => `/resource/${resourceId}`,
    });
  }
}

const provider = new ExampleProvider(config, "123");
const service = new SmessService(provider);
service.request().subscribe((result) => {
  // handle result
});
```

## Bundler Compatibility

This package is designed to work seamlessly with modern bundlers:

- **Webpack** ✅
- **Vite** ✅
- **Rollup** ✅
- **Parcel** ✅

The package uses **extensionless imports** in TypeScript source code, which bundlers handle automatically. No `.js` extensions needed in your imports!

### Example with Webpack/Vite

```typescript
// ✅ This works perfectly with bundlers
import { UserService, ProductService } from "@smess/networking";

const config = { baseUrl: "https://api.example.com", isProd: false };
const userService = new UserService(config);
const productService = new ProductService(config);
```

## Available Services

- `UserService` - User management operations
- `ProductService` - Product CRUD operations
- `AuthService` - Authentication (login, logout, password reset)
- `CustomerService` - Customer registration and profile management
- `OrderService` - Order management
- `StoreService` - Store and product catalog operations

## Development

```bash
# Install dependencies
npm install

# Build the package
npm run build

# Run tests
npm test

# Clean build artifacts
npm run clean
```

---

## Private Package Usage

See [SETUP.md](./SETUP.md) for instructions on using this package as a private dependency (GitHub repo, GitHub Packages, npm private registry) with the correct package name: `@smess/networking`.

---

MIT License