@marianmeres/ecsuite 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +218 -0
- package/API.md +865 -0
- package/LICENSE +21 -0
- package/README.md +149 -0
- package/dist/adapters/mock/cart.d.ts +20 -0
- package/dist/adapters/mock/cart.js +86 -0
- package/dist/adapters/mock/customer.d.ts +20 -0
- package/dist/adapters/mock/customer.js +58 -0
- package/dist/adapters/mock/mod.d.ts +9 -0
- package/dist/adapters/mock/mod.js +9 -0
- package/dist/adapters/mock/order.d.ts +20 -0
- package/dist/adapters/mock/order.js +66 -0
- package/dist/adapters/mock/payment.d.ts +20 -0
- package/dist/adapters/mock/payment.js +55 -0
- package/dist/adapters/mock/product.d.ts +25 -0
- package/dist/adapters/mock/product.js +60 -0
- package/dist/adapters/mock/wishlist.d.ts +20 -0
- package/dist/adapters/mock/wishlist.js +70 -0
- package/dist/adapters/mod.d.ts +6 -0
- package/dist/adapters/mod.js +6 -0
- package/dist/domains/base.d.ts +83 -0
- package/dist/domains/base.js +187 -0
- package/dist/domains/cart.d.ts +96 -0
- package/dist/domains/cart.js +287 -0
- package/dist/domains/customer.d.ts +74 -0
- package/dist/domains/customer.js +183 -0
- package/dist/domains/mod.d.ts +13 -0
- package/dist/domains/mod.js +13 -0
- package/dist/domains/order.d.ts +83 -0
- package/dist/domains/order.js +233 -0
- package/dist/domains/payment.d.ts +83 -0
- package/dist/domains/payment.js +175 -0
- package/dist/domains/product.d.ts +130 -0
- package/dist/domains/product.js +241 -0
- package/dist/domains/wishlist.d.ts +101 -0
- package/dist/domains/wishlist.js +256 -0
- package/dist/mod.d.ts +28 -0
- package/dist/mod.js +32 -0
- package/dist/suite.d.ts +115 -0
- package/dist/suite.js +168 -0
- package/dist/types/adapter.d.ts +77 -0
- package/dist/types/adapter.js +7 -0
- package/dist/types/events.d.ts +111 -0
- package/dist/types/events.js +7 -0
- package/dist/types/mod.d.ts +9 -0
- package/dist/types/mod.js +9 -0
- package/dist/types/state.d.ts +61 -0
- package/dist/types/state.js +7 -0
- package/package.json +28 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# AGENTS.md - @marianmeres/ecsuite
|
|
2
|
+
|
|
3
|
+
Machine-readable documentation for AI coding assistants.
|
|
4
|
+
|
|
5
|
+
## Package Overview
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
name: "@marianmeres/ecsuite"
|
|
9
|
+
version: "1.0.0"
|
|
10
|
+
type: "library"
|
|
11
|
+
language: "typescript"
|
|
12
|
+
runtime: "deno"
|
|
13
|
+
npm_compatible: true
|
|
14
|
+
license: "MIT"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Purpose
|
|
18
|
+
|
|
19
|
+
E-commerce frontend UI state management library providing:
|
|
20
|
+
- Optimistic updates with automatic rollback
|
|
21
|
+
- Svelte-compatible reactive stores
|
|
22
|
+
- Pluggable adapter pattern for server communication
|
|
23
|
+
- Pub/sub event system
|
|
24
|
+
- Local persistence for cart/wishlist
|
|
25
|
+
|
|
26
|
+
## Architecture
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
ECSuite (orchestrator)
|
|
30
|
+
├── CartManager [localStorage, optimistic updates]
|
|
31
|
+
├── WishlistManager [localStorage, optimistic updates]
|
|
32
|
+
├── OrderManager [server-only, read + create]
|
|
33
|
+
├── CustomerManager [server-only, read + update]
|
|
34
|
+
├── PaymentManager [server-only, read-only]
|
|
35
|
+
└── ProductManager [in-memory cache with TTL]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Directory Structure
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
src/
|
|
42
|
+
├── mod.ts # Main entry point
|
|
43
|
+
├── suite.ts # ECSuite orchestrator
|
|
44
|
+
├── types/
|
|
45
|
+
│ ├── mod.ts # Type re-exports
|
|
46
|
+
│ ├── adapter.ts # Adapter interfaces
|
|
47
|
+
│ ├── events.ts # Event types
|
|
48
|
+
│ └── state.ts # State types
|
|
49
|
+
├── domains/
|
|
50
|
+
│ ├── mod.ts # Domain re-exports
|
|
51
|
+
│ ├── base.ts # BaseDomainManager abstract class
|
|
52
|
+
│ ├── cart.ts # CartManager
|
|
53
|
+
│ ├── wishlist.ts # WishlistManager
|
|
54
|
+
│ ├── order.ts # OrderManager
|
|
55
|
+
│ ├── customer.ts # CustomerManager
|
|
56
|
+
│ ├── payment.ts # PaymentManager
|
|
57
|
+
│ └── product.ts # ProductManager
|
|
58
|
+
└── adapters/
|
|
59
|
+
├── mod.ts # Adapter exports
|
|
60
|
+
└── mock/ # Mock adapters for testing
|
|
61
|
+
├── mod.ts
|
|
62
|
+
├── cart.ts
|
|
63
|
+
├── wishlist.ts
|
|
64
|
+
├── order.ts
|
|
65
|
+
├── customer.ts
|
|
66
|
+
├── payment.ts
|
|
67
|
+
└── product.ts
|
|
68
|
+
tests/
|
|
69
|
+
├── cart.test.ts
|
|
70
|
+
├── wishlist.test.ts
|
|
71
|
+
├── order.test.ts
|
|
72
|
+
├── customer.test.ts
|
|
73
|
+
├── payment.test.ts
|
|
74
|
+
├── product.test.ts
|
|
75
|
+
└── ecsuite.test.ts
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Key Exports
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// Main
|
|
82
|
+
export { ECSuite, createECSuite, ECSuiteConfig } from "./suite.ts";
|
|
83
|
+
|
|
84
|
+
// Types
|
|
85
|
+
export {
|
|
86
|
+
DomainState, DomainError, DomainStateWrapper, DomainContext,
|
|
87
|
+
WishlistItem, WishlistData, EnrichedCartItem, EnrichedWishlistItem,
|
|
88
|
+
AdapterResult, CartAdapter, WishlistAdapter, OrderAdapter,
|
|
89
|
+
CustomerAdapter, PaymentAdapter, ProductAdapter, OrderCreatePayload,
|
|
90
|
+
DomainName, ECSuiteEventType, ECSuiteEvent, /* ...event interfaces */
|
|
91
|
+
} from "./types/mod.ts";
|
|
92
|
+
|
|
93
|
+
// Domain Managers
|
|
94
|
+
export {
|
|
95
|
+
BaseDomainManager, BaseDomainOptions, StorageType,
|
|
96
|
+
CartManager, CartManagerOptions,
|
|
97
|
+
WishlistManager, WishlistManagerOptions,
|
|
98
|
+
OrderManager, OrderManagerOptions, OrderListData,
|
|
99
|
+
CustomerManager, CustomerManagerOptions,
|
|
100
|
+
PaymentManager, PaymentManagerOptions, PaymentListData,
|
|
101
|
+
ProductManager, ProductManagerOptions,
|
|
102
|
+
} from "./domains/mod.ts";
|
|
103
|
+
|
|
104
|
+
// Mock Adapters
|
|
105
|
+
export {
|
|
106
|
+
createMockCartAdapter, MockCartAdapterOptions,
|
|
107
|
+
createMockWishlistAdapter, MockWishlistAdapterOptions,
|
|
108
|
+
createMockOrderAdapter, MockOrderAdapterOptions,
|
|
109
|
+
createMockCustomerAdapter, MockCustomerAdapterOptions,
|
|
110
|
+
createMockPaymentAdapter, MockPaymentAdapterOptions,
|
|
111
|
+
createMockProductAdapter, MockProductAdapterOptions,
|
|
112
|
+
} from "./adapters/mod.ts";
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## State Machine
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
State transitions:
|
|
119
|
+
initializing -> ready
|
|
120
|
+
ready -> syncing
|
|
121
|
+
syncing -> ready (success)
|
|
122
|
+
syncing -> error (failure with rollback)
|
|
123
|
+
error -> syncing (retry)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Common Patterns
|
|
127
|
+
|
|
128
|
+
### Creating Suite
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
const suite = createECSuite({
|
|
132
|
+
context: { customerId: "uuid" },
|
|
133
|
+
adapters: { cart: myCartAdapter },
|
|
134
|
+
storage: { type: "local" },
|
|
135
|
+
productCacheTtl: 300000,
|
|
136
|
+
autoInitialize: true,
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Subscribing to Store (Svelte-compatible)
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
suite.cart.subscribe((state) => {
|
|
144
|
+
// state: { state, data, error, lastSyncedAt }
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Event Handling
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
suite.on("cart:item:added", (event) => { /* ... */ });
|
|
152
|
+
suite.onAny(({ event, data }) => { /* ... */ });
|
|
153
|
+
suite.once("order:created", (event) => { /* ... */ });
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Implementing Adapter
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
const myAdapter: CartAdapter = {
|
|
160
|
+
async fetch(ctx) {
|
|
161
|
+
return { success: true, data: cartData };
|
|
162
|
+
// or { success: false, error: { code, message } }
|
|
163
|
+
},
|
|
164
|
+
// ... other methods
|
|
165
|
+
};
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Dependencies
|
|
169
|
+
|
|
170
|
+
```yaml
|
|
171
|
+
runtime:
|
|
172
|
+
"@marianmeres/clog": "^3.15.0"
|
|
173
|
+
"@marianmeres/collection-types": "^1.9.0"
|
|
174
|
+
"@marianmeres/pubsub": "^2.4.5"
|
|
175
|
+
"@marianmeres/store": "^2.4.2"
|
|
176
|
+
dev:
|
|
177
|
+
"@std/assert": "^1.0.16"
|
|
178
|
+
"@std/fs": "^1.0.20"
|
|
179
|
+
"@std/path": "^1.1.3"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Testing
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
deno test # Run all tests
|
|
186
|
+
deno test --watch # Watch mode
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Test utilities:
|
|
190
|
+
- Mock adapters with configurable delay and error injection
|
|
191
|
+
- Memory storage type for isolated tests
|
|
192
|
+
|
|
193
|
+
## Build
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
deno task npm:build # Build for npm
|
|
197
|
+
deno task npm:publish # Build and publish to npm
|
|
198
|
+
deno publish # Publish to JSR
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Code Style
|
|
202
|
+
|
|
203
|
+
- Tabs for indentation
|
|
204
|
+
- 90 character line width
|
|
205
|
+
- TypeScript strict mode
|
|
206
|
+
- JSDoc for all public API
|
|
207
|
+
|
|
208
|
+
## Important Implementation Details
|
|
209
|
+
|
|
210
|
+
1. **Optimistic Updates**: `_withOptimisticUpdate()` in BaseDomainManager captures previous state before mutation, rolls back on server error.
|
|
211
|
+
|
|
212
|
+
2. **Persistence**: Cart and Wishlist use `@marianmeres/store` with `createStoragePersistor()` for localStorage/sessionStorage.
|
|
213
|
+
|
|
214
|
+
3. **ProductManager**: Does NOT extend BaseDomainManager. Uses simple Map cache with TTL instead of state machine.
|
|
215
|
+
|
|
216
|
+
4. **Event System**: Shared PubSub instance passed through ECSuite constructor. Events typed with discriminated union.
|
|
217
|
+
|
|
218
|
+
5. **Context**: DomainContext (customerId, sessionId) passed to all adapter methods for server-side identification.
|