@neetru/sdk 1.1.1 → 2.1.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/CHANGELOG.md +284 -214
- package/README.md +194 -218
- package/dist/auth.cjs +4181 -346
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.d.cts +5 -1
- package/dist/auth.d.ts +5 -1
- package/dist/auth.mjs +4181 -346
- package/dist/auth.mjs.map +1 -1
- package/dist/catalog.cjs +63 -24
- package/dist/catalog.cjs.map +1 -1
- package/dist/catalog.d.cts +6 -2
- package/dist/catalog.d.ts +6 -2
- package/dist/catalog.mjs +63 -24
- package/dist/catalog.mjs.map +1 -1
- package/dist/checkout.cjs +60 -18
- package/dist/checkout.cjs.map +1 -1
- package/dist/checkout.d.cts +5 -1
- package/dist/checkout.d.ts +5 -1
- package/dist/checkout.mjs +60 -18
- package/dist/checkout.mjs.map +1 -1
- package/dist/collection-ref-BBvTTXoG.d.cts +423 -0
- package/dist/collection-ref-BBvTTXoG.d.ts +423 -0
- package/dist/db-react.cjs +136 -0
- package/dist/db-react.cjs.map +1 -0
- package/dist/db-react.d.cts +99 -0
- package/dist/db-react.d.ts +99 -0
- package/dist/db-react.mjs +112 -0
- package/dist/db-react.mjs.map +1 -0
- package/dist/db.cjs +3652 -143
- package/dist/db.cjs.map +1 -1
- package/dist/db.d.cts +5 -8
- package/dist/db.d.ts +5 -8
- package/dist/db.mjs +3649 -143
- package/dist/db.mjs.map +1 -1
- package/dist/entitlements.cjs +101 -24
- package/dist/entitlements.cjs.map +1 -1
- package/dist/entitlements.d.cts +15 -5
- package/dist/entitlements.d.ts +15 -5
- package/dist/entitlements.mjs +101 -24
- package/dist/entitlements.mjs.map +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.mjs.map +1 -1
- package/dist/index.cjs +4341 -282
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -6
- package/dist/index.d.ts +13 -6
- package/dist/index.mjs +4243 -189
- package/dist/index.mjs.map +1 -1
- package/dist/mocks.cjs +186 -9
- package/dist/mocks.cjs.map +1 -1
- package/dist/mocks.d.cts +21 -6
- package/dist/mocks.d.ts +21 -6
- package/dist/mocks.mjs +186 -9
- package/dist/mocks.mjs.map +1 -1
- package/dist/notifications.cjs +296 -0
- package/dist/notifications.cjs.map +1 -0
- package/dist/notifications.d.cts +5 -0
- package/dist/notifications.d.ts +5 -0
- package/dist/notifications.mjs +293 -0
- package/dist/notifications.mjs.map +1 -0
- package/dist/react.cjs +7 -3
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +5 -1
- package/dist/react.d.ts +5 -1
- package/dist/react.mjs +7 -3
- package/dist/react.mjs.map +1 -1
- package/dist/support.cjs +60 -18
- package/dist/support.cjs.map +1 -1
- package/dist/support.d.cts +5 -1
- package/dist/support.d.ts +5 -1
- package/dist/support.mjs +60 -18
- package/dist/support.mjs.map +1 -1
- package/dist/telemetry.cjs +130 -19
- package/dist/telemetry.cjs.map +1 -1
- package/dist/telemetry.d.cts +21 -1
- package/dist/telemetry.d.ts +21 -1
- package/dist/telemetry.mjs +130 -19
- package/dist/telemetry.mjs.map +1 -1
- package/dist/types-B1jylbMC.d.ts +1364 -0
- package/dist/types-Kmt4y1FQ.d.cts +1364 -0
- package/dist/usage.cjs +60 -18
- package/dist/usage.cjs.map +1 -1
- package/dist/usage.d.cts +5 -1
- package/dist/usage.d.ts +5 -1
- package/dist/usage.mjs +60 -18
- package/dist/usage.mjs.map +1 -1
- package/dist/webhooks.cjs +316 -0
- package/dist/webhooks.cjs.map +1 -0
- package/dist/webhooks.d.cts +5 -0
- package/dist/webhooks.d.ts +5 -0
- package/dist/webhooks.mjs +312 -0
- package/dist/webhooks.mjs.map +1 -0
- package/package.json +133 -101
- package/dist/types-BA53dd8S.d.cts +0 -490
- package/dist/types-BA53dd8S.d.ts +0 -490
package/CHANGELOG.md
CHANGED
|
@@ -1,214 +1,284 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to `@neetru/sdk` will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [Unreleased]
|
|
9
|
-
|
|
10
|
-
### Planned (post-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
`
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
- **`
|
|
28
|
-
- **`
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
- **`
|
|
61
|
-
|
|
62
|
-
- **`
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
- `
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
|
|
80
|
-
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
- `
|
|
110
|
-
- `
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
- `
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
-
|
|
143
|
-
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
-
|
|
149
|
-
|
|
150
|
-
-
|
|
151
|
-
- `
|
|
152
|
-
|
|
153
|
-
###
|
|
154
|
-
- `
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
-
|
|
163
|
-
-
|
|
164
|
-
|
|
165
|
-
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
- `
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
-
|
|
185
|
-
-
|
|
186
|
-
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
###
|
|
191
|
-
-
|
|
192
|
-
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
-
|
|
196
|
-
- `
|
|
197
|
-
- `
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
-
|
|
201
|
-
|
|
202
|
-
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
-
|
|
208
|
-
|
|
209
|
-
- `
|
|
210
|
-
- `
|
|
211
|
-
|
|
212
|
-
-
|
|
213
|
-
-
|
|
214
|
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `@neetru/sdk` will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Planned (post-2.0)
|
|
11
|
+
- size-limit budget no CI (<12KB gz core com db namespace).
|
|
12
|
+
- CDN distribution (`cdn.neetru.com/sdk/v2/`).
|
|
13
|
+
- Endpoint batch `/api/v1/sdk/telemetry/batch` (substitui drenagem N×1 do `track()` por 1 request).
|
|
14
|
+
|
|
15
|
+
## [2.0.0] - 2026-05-22 — **client.db NeetruDb (Documentos engine-aware + SQL) [M2]**
|
|
16
|
+
|
|
17
|
+
Major bump — breaking changes no namespace `db`. Liga todos os building blocks M2 na superfície pública.
|
|
18
|
+
|
|
19
|
+
### Breaking Changes
|
|
20
|
+
|
|
21
|
+
- **`client.db`** troca de `DbNamespace` (v0.3 REST simples) para `NeetruDb` (v2.0 offline-first engine-aware).
|
|
22
|
+
- `collection().list()` agora retorna `DbListResult<T>` (com `docs`, `nextCursor`, `fromCache`, `stale`, `hasPendingWrites`, `changes`) em vez de `T[]`.
|
|
23
|
+
- `collection().get(id)` retorna `DbGetResult<T> | null` em vez de `T | null`.
|
|
24
|
+
- `db_unavailable` não significa mais "sem rede" — só ciclo de vida do banco. Offline é transparente.
|
|
25
|
+
- Novos métodos obrigatórios na superfície: `sql()`, `syncState`, `flush()`, `clearCache()`, `getConflicts()`, `onSyncStateChanged()`, `batch()`, `onDoc()`, `onSnapshot()`, `doc()`.
|
|
26
|
+
- **`db.sql(schema)` lança `NeetruDbError('db_unavailable')` em `NEETRU_ENV=dev`** — sem Postgres local, sem acesso SQL. Use `neetru dev` para subir o container.
|
|
27
|
+
- **`initNeetru`** — mantido como stub funcional mas não mapeia mais `apiUrl → baseUrl`. Remover em v3.0.
|
|
28
|
+
- **`MockDb`** foi atualizado para implementar `NeetruDb` (v2.0) em vez de `DbNamespace` (v0.3).
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
|
|
32
|
+
- **`client.db.collection<T>(name)`** — retorna `DbCollectionRef<T>` offline-first, engine-aware. Funciona sem rede. Sync automático quando conectado.
|
|
33
|
+
- CRUD: `add`, `set`, `update`, `remove`, `get`, `list` (com query, cursor, orderBy, where, limit).
|
|
34
|
+
- Batch: `batch(ops)` — operações atômicas (client-side).
|
|
35
|
+
- Realtime: `onSnapshot(query, cb)`, `onDoc(id, cb)` — subscriptions permanentes, delivery imediato do cache.
|
|
36
|
+
- Doc ref: `doc(id).get()`, `.set()`, `.update()`, `.remove()`, `.onSnapshot()`.
|
|
37
|
+
- **`client.db.sql<TSchema>(schema)`** — lease SQL. Retorna `NeetruSqlClient<TSchema>` com `orm` (Drizzle `NodePgDatabase`) + `transaction()` + `close()`.
|
|
38
|
+
- **`client.db.syncState`** — estado de sincronização observável (`status`, `pendingWrites`, `lastSyncedAt`, `isLeaderTab`).
|
|
39
|
+
- **`client.db.onSyncStateChanged(cb)`** — subscrição de mudanças de sync state.
|
|
40
|
+
- **`client.db.flush()`** — força ciclo de sync imediato.
|
|
41
|
+
- **`client.db.clearCache(collections?)`** — limpa o cache local (IndexedDB).
|
|
42
|
+
- **`client.db.getConflicts(collection?)`** — lista conflitos LWW pendentes.
|
|
43
|
+
- **Engine detection** via `NeetruDbOptions.engine`: `'firestore'` | `'nosql-vm'` | `'rest'` (default MVP).
|
|
44
|
+
- **Subpath `@neetru/sdk/db/react`** — hooks React: `useCollection`, `useDoc` (exporta via `dist/db-react.{mjs,cjs}`).
|
|
45
|
+
- **Novos tipos públicos exportados**: `NeetruDb`, `NeetruDbEngine`, `NeetruDbOptions`, `NeetruSqlClient`, `DbSqlLease`, `DbCollectionRef`, `DbDocRef`, `DbQuery`, `DbDoc`, `DbListResult`, `DbGetResult`, `DbBatchOp`, `DbChangeType`, `NeetruDbError`, `NeetruDbErrorCode`.
|
|
46
|
+
- **`createNeetruDb(config, opts)`** — factory async (para uso fora do `createNeetruClient`).
|
|
47
|
+
- **`createNeetruDbSync(config, opts)`** — factory sync com lazy init IndexedDB (usada internamente em `createNeetruClient`).
|
|
48
|
+
|
|
49
|
+
### Changed
|
|
50
|
+
|
|
51
|
+
- **`NeetruClientConfig.db`** — aceita `NeetruDbOptions` (engine, dbId, collections, dbName, etc.).
|
|
52
|
+
- **`client.config.mocks.db`** — agora é `NeetruDb` em vez de `DbNamespace`.
|
|
53
|
+
- **`VERSION`** bumped para `'2.0.0'`.
|
|
54
|
+
|
|
55
|
+
## [1.2.0] - 2026-05-19 — **Webhooks + Notifications + DX (cache, retry, batch)**
|
|
56
|
+
|
|
57
|
+
Release de qualidade fechando 3 CRITICAL + 6 IMPORTANT do code review interno + 4 melhorias de DX. Adiciona `webhooks` + `notifications` no `NeetruClient`.
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
- **`client.webhooks`** — `register`/`list`/`unregister`/`test` pra endpoints HTTP do produto receberem eventos do Core (subscription.activated, usage.quota_exceeded, etc).
|
|
61
|
+
- **`verifyWebhookSignature(payload, signature, secret)`** — util pura (HMAC SHA-256 constant-time compare via `node:crypto`) pra consumidor validar payloads recebidos.
|
|
62
|
+
- **`client.notifications`** — `send`/`list`/`markRead`/`dismiss` pra produto integrar com a bandeja in-app do Neetru.
|
|
63
|
+
- **`client.telemetry.track(input)`** + `client.telemetry.flush()` — fire-and-forget batch (500ms debounce). Ideal pra alta frequência (page-views, cliques). `event()` segue como single-shot com `eventId` ack.
|
|
64
|
+
- **`client.entitlements.check(..., { cacheBust })`** — cache LRU em memória (60s TTL, 100 entries). Corta 90%+ requests em renders repetidos do `<EntitlementGate>`. `cacheBust: true` força ida ao servidor.
|
|
65
|
+
- **httpRequest retry/backoff** — 2 retries default em `rate_limited` (429), `server_error` (5xx), `network_error`. Honra `Retry-After` header. Caller opt-out com `opts.retries: 0`.
|
|
66
|
+
- **Subpaths novos**: `@neetru/sdk/webhooks`, `@neetru/sdk/notifications`.
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
- **`client.catalog.list()` / `get()`** agora consomem `/api/sdk/v1/catalog` (público, sem Bearer) em vez de `/api/v1/cli/catalog` (staff). Consumidor não precisa mais de chave staff só pra ler catálogo. `includeDrafts` é ignorado — rascunhos só via CLI.
|
|
70
|
+
- **`auth.signOut()`** revoga token em `auth.neetru.com/api/v1/oauth/revoke` (canônico), não mais `api.neetru.com/oauth/revoke` (404 em prod).
|
|
71
|
+
- **`<EntitlementGate>`** passa `tenantId` (do `client.config.tenantId`) pra `usage.check`. Sem tenantId, cai pra `entitlements.check` em vez de chamar `usage.check` e travar em `validation_failed` silencioso.
|
|
72
|
+
- **`engines.node`** subiu pra `>=20` (alinha com `target: node20` do tsup; Node 18 EOL).
|
|
73
|
+
|
|
74
|
+
### Fixed
|
|
75
|
+
- **CRITICAL** — `webhooks` e `notifications` lançavam `'invalid_input'`, código ausente da union `NeetruErrorCode`. Todas as 17 ocorrências viraram `'validation_failed'`.
|
|
76
|
+
- **CRITICAL** — `telemetry.log()` chamava `/sdk/v1/telemetry/log` (404). Corrigido pra `/api/sdk/v1/telemetry/log`.
|
|
77
|
+
- **CRITICAL** — `db` namespace tinha o mesmo bug em 6 paths (`/sdk/v1/datastore/...`). Corrigido em massa pra `/api/sdk/v1/datastore/...`.
|
|
78
|
+
- **CRITICAL** — 8 `httpRequest` calls em `webhooks` e `notifications` não passavam `requireAuth: true` — todos hits em prod retornavam 401. Corrigido.
|
|
79
|
+
- **`MockSupport.mockTicketSeq`** virou instance field (era module-level, poluía tests entre suites).
|
|
80
|
+
- **`db.list()`** removeu variável `query` dead code (refactor incompleto de pre-1.1).
|
|
81
|
+
|
|
82
|
+
### Internal
|
|
83
|
+
- 51 testes novos (webhooks: 22, notifications: 20, react: 9). Total: 215 testes (16 files), 100% passing. tsc clean.
|
|
84
|
+
- `api-surface-stability.test.ts` agora lock `webhooks` + `notifications` no `NeetruClient`.
|
|
85
|
+
|
|
86
|
+
## [1.1.0] - 2026-05-08 — **Checkout namespace + React helpers**
|
|
87
|
+
|
|
88
|
+
Adiciona o namespace `client.checkout` (start/get/cancel intent) com auto-redirect
|
|
89
|
+
em browser. Suporte ao fluxo Sprint 13 onde produtos SaaS delegam checkout pro
|
|
90
|
+
portal `minhaconta.neetru.com` via `POST /api/v1/checkout/intents`.
|
|
91
|
+
|
|
92
|
+
### Added
|
|
93
|
+
- **`client.checkout.start({productId, planId, callbackUrl, tenantType?, tenantId?})`** — cria
|
|
94
|
+
`checkout_intents/{intentId}` no Core e (em browser) redireciona automaticamente
|
|
95
|
+
pra `minhaconta.neetru.com/portal/checkout/{intentId}`. Em Node/SSR retorna
|
|
96
|
+
`{intentId, redirectUrl}` sem efeito colateral.
|
|
97
|
+
- **`client.checkout.get(intentId)`** — lê estado atual do intent.
|
|
98
|
+
- **`client.checkout.cancel(intentId)`** — marca intent como `cancelled`.
|
|
99
|
+
- **Subpath `@neetru/sdk/react`** — componente `<CheckoutLink>` (wrapper de `<a>`
|
|
100
|
+
que dispara `start()` no click) + `<EntitlementGate mode="block|readonly">`
|
|
101
|
+
+ hook `useEntitlementContext()` pra desabilitar escritas quando free tier
|
|
102
|
+
estoura limite (decisão CEO §5 — read-only sempre, não hard-block).
|
|
103
|
+
- **`MockCheckout`** — implementação dev (`NEETRU_ENV=dev`) sem network. Retorna
|
|
104
|
+
URL fake `https://localhost:9003/portal/checkout/{intentId}` pra dev externo
|
|
105
|
+
testar UI sem provisionar conta Neetru.
|
|
106
|
+
- **Peer dep `react ^18 || ^19`** marcado opcional (só carregado se import `/react`).
|
|
107
|
+
|
|
108
|
+
### Changed
|
|
109
|
+
- `VERSION` const bump `1.0.0 → 1.1.0`.
|
|
110
|
+
- `NeetruClient.checkout` adicionado — backward-compatible (caller que não usa
|
|
111
|
+
o namespace não é afetado).
|
|
112
|
+
|
|
113
|
+
### Notes
|
|
114
|
+
- API stability test (`api-surface-stability.test.ts`) atualizado pra incluir
|
|
115
|
+
`checkout` no inventário canônico.
|
|
116
|
+
|
|
117
|
+
## [1.0.0] - 2026-05-06 — **GA (General Availability)**
|
|
118
|
+
|
|
119
|
+
Marco de estabilidade. A partir desta versão, **a superfície pública do SDK
|
|
120
|
+
está congelada** — breaking changes só em majors (semver estrito).
|
|
121
|
+
|
|
122
|
+
### Added
|
|
123
|
+
- **API stability lock** — todos os contratos (`createNeetruClient`,
|
|
124
|
+
`NeetruClient`, namespaces `auth`/`catalog`/`entitlements`/`telemetry`/
|
|
125
|
+
`usage`/`support`/`db`, `NeetruError`) ficam estáveis em v1.x. Coberto
|
|
126
|
+
por `api-surface-stability.test.ts` que falha o build se algum método
|
|
127
|
+
muda forma.
|
|
128
|
+
- **JSDoc completo** em toda função/método público — base pra `npm run docs:gen`
|
|
129
|
+
(typedoc → `sdk/docs-html/`).
|
|
130
|
+
- **`docs:gen` script** + `scripts/typedoc.config.json` — gera HTML
|
|
131
|
+
navigable das APIs.
|
|
132
|
+
- **`engines.node`** relaxado de `>=20` → `>=18` (suporta runtimes Node 18 LTS
|
|
133
|
+
ainda em uso por consumers).
|
|
134
|
+
|
|
135
|
+
### Changed
|
|
136
|
+
- `VERSION` bump `0.3.0` → `1.0.0`.
|
|
137
|
+
- README atualizado com seção de migração v0.3 → v1.0 (no breaking changes —
|
|
138
|
+
upgrade transparente).
|
|
139
|
+
|
|
140
|
+
### Migration v0.3 → v1.0
|
|
141
|
+
- **Sem breaking changes.** Upgrade direto via `npm install @neetru/sdk@1.0.0`.
|
|
142
|
+
- `initNeetru` continua deprecated mas funcional. **Será removido em v2.0.0.**
|
|
143
|
+
- `NeetruConfig` continua deprecated. Use `NeetruClientConfig`.
|
|
144
|
+
|
|
145
|
+
### Stability promise (v1.x)
|
|
146
|
+
A partir de v1.0:
|
|
147
|
+
- Métodos novos podem ser adicionados a namespaces existentes (minor bump).
|
|
148
|
+
- Métodos podem ser marcados `@deprecated` em qualquer minor — só removidos
|
|
149
|
+
em major.
|
|
150
|
+
- Tipos nunca ganham campos required em minor (só optional ou via union).
|
|
151
|
+
- `NeetruErrorCode` é union fechado em v1.0 — qualquer novo código bumpa minor.
|
|
152
|
+
|
|
153
|
+
### Notes
|
|
154
|
+
- Pacote ainda **privado** (`private: true`). Publicação no npm é
|
|
155
|
+
responsabilidade do owner — gate no CHANGELOG continua trancado até decisão.
|
|
156
|
+
|
|
157
|
+
## [0.3.0] - 2026-05-06
|
|
158
|
+
|
|
159
|
+
### Added
|
|
160
|
+
- Namespace `client.db` (v0.3) — wrapper minimalista pra coleções tenant-scoped:
|
|
161
|
+
- `client.db.collection(name).list({ limit? })`
|
|
162
|
+
- `client.db.collection(name).get(id)` (retorna null em not_found)
|
|
163
|
+
- `client.db.collection(name).set(id, data)` upsert
|
|
164
|
+
- `client.db.collection(name).remove(id)` delete
|
|
165
|
+
- Endpoints: `/sdk/v1/datastore/{collection}/{id?}` (placeholder REST — Sprint 9
|
|
166
|
+
finaliza; SDK já expõe interface estável).
|
|
167
|
+
- `MockDb` (in-memory) ativo em `NEETRU_ENV=dev`.
|
|
168
|
+
- Namespace `client.usage` ganhou `report()` e `check()`:
|
|
169
|
+
- `usage.report(resource, qty?)` → `POST /sdk/v1/usage/record` canônico
|
|
170
|
+
(Sprint 7) — incrementa atomicamente `usage_counters/{tid}_{pid}_{r}_{yyyymm}`.
|
|
171
|
+
- `usage.check(resource)` → `GET /sdk/v1/entitlements?productId&tenantId&feature` —
|
|
172
|
+
retorna `{allowed, reason, remaining, limit, planId, planFeatures}`.
|
|
173
|
+
- `NeetruClientConfig.productId` / `.tenantId` — defaults pra `usage.report` /
|
|
174
|
+
`usage.check` / `db.collection` quando não passado em options.
|
|
175
|
+
- Mock helpers: `MockDb`, `MockUsage.report()`, `MockUsage.check()`.
|
|
176
|
+
|
|
177
|
+
### Changed
|
|
178
|
+
- `VERSION` bump `0.2.0` → `0.3.0`.
|
|
179
|
+
- `NeetruClient` agora expõe `.db` além dos antigos.
|
|
180
|
+
- `ResolvedConfig` ganhou `productId` + `tenantId` opcionais.
|
|
181
|
+
|
|
182
|
+
### Backend (acompanha esta release)
|
|
183
|
+
- Novos endpoints (Sprint 7):
|
|
184
|
+
- `POST /sdk/v1/usage/record` — atomic increment + 80%/100% notifications + audit.
|
|
185
|
+
- `GET /sdk/v1/entitlements` — lookup canônico subscription→plan→counter.
|
|
186
|
+
- `POST /sdk/v1/telemetry/log` — batch logger pra `logs/{productId}/{yyyymmdd}/`.
|
|
187
|
+
|
|
188
|
+
## [0.2.0] - 2026-05-06
|
|
189
|
+
|
|
190
|
+
### Added
|
|
191
|
+
- Namespace `client.auth` (v0.2 — OIDC + dev mocks):
|
|
192
|
+
- `signIn(options?)` — redireciona pra auth.neetru.com authorize endpoint
|
|
193
|
+
(browser) ou retorna mock user em dev (`NEETRU_ENV=dev`).
|
|
194
|
+
- `signOut()` — limpa `localStorage.neetru_id_token` + revoga refresh
|
|
195
|
+
server-side (best-effort).
|
|
196
|
+
- `getUser()` — decodifica id_token cached e retorna `NeetruUser` ou null.
|
|
197
|
+
- `onAuthStateChanged(listener)` — sub a mudanças, dispatcha sync no subscribe.
|
|
198
|
+
- Namespace `client.usage` (v0.2 — meter):
|
|
199
|
+
- `track(event, props?)` → `POST /sdk/v1/usage/record` com Bearer.
|
|
200
|
+
- `getQuota(metric)` → `GET /sdk/v1/usage/quota?metric=` returns
|
|
201
|
+
`{ metric, used, limit, plan, resetsAt? }`.
|
|
202
|
+
- Namespace `client.support` (v0.2 — tickets):
|
|
203
|
+
- `createTicket({subject, message, severity?, productSlug?})` →
|
|
204
|
+
`POST /api/v1/products/{slug}/tickets` (default `_default`).
|
|
205
|
+
- `listMyTickets()` → `GET ...` retorna array (aceita envelope `{tickets:[]}`).
|
|
206
|
+
- `mocks` module (`@neetru/sdk/mocks`):
|
|
207
|
+
- `MockAuth`, `MockUsage`, `MockSupport`, `MockEntitlements` — overridáveis
|
|
208
|
+
via `createNeetruClient({ mocks: { auth: MockAuth(...), ... } })`.
|
|
209
|
+
- `DEV_FIXTURE_USER` constante exportada.
|
|
210
|
+
- `NEETRU_ENV` resolution chain: config arg > `process.env.NEETRU_ENV` >
|
|
211
|
+
`globalThis.NEETRU_ENV` > default `prod`. `dev` ativa mocks automáticos.
|
|
212
|
+
- Subpath exports adicionais: `@neetru/sdk/{auth,usage,support,mocks}`.
|
|
213
|
+
- Tipos novos: `NeetruUser`, `AuthNamespace`, `UsageNamespace`,
|
|
214
|
+
`SupportNamespace`, `SignInOptions`, `SupportTicket`, `UsageQuota`,
|
|
215
|
+
`NeetruEnv`, `CreateTicketInput`.
|
|
216
|
+
|
|
217
|
+
### Changed
|
|
218
|
+
- `VERSION` bump `0.1.0` → `0.2.0`.
|
|
219
|
+
- `NeetruClientConfig` ganhou campos `env` + `mocks`.
|
|
220
|
+
- `ResolvedConfig` ganhou `env` resolved.
|
|
221
|
+
- `NeetruClient` agora expõe `.auth`, `.usage`, `.support` além dos antigos.
|
|
222
|
+
|
|
223
|
+
### Backend (acompanha esta release — endpoints documentados em `docs/SDK_OPENAPI.md`)
|
|
224
|
+
- `POST /sdk/v1/usage/record` — record event meterado.
|
|
225
|
+
- `GET /sdk/v1/usage/quota?metric=` — ler quota atual.
|
|
226
|
+
- `POST /api/v1/products/{slug}/tickets` — criar ticket.
|
|
227
|
+
- `GET /api/v1/products/{slug}/tickets` — listar meus tickets.
|
|
228
|
+
- (auth) `auth.neetru.com/oauth/authorize` — já live (Sprint 1 OIDC).
|
|
229
|
+
- (auth) `auth.neetru.com/oauth/revoke` — revoga refresh token.
|
|
230
|
+
|
|
231
|
+
### Notes
|
|
232
|
+
- Pacote ainda **privado** (`private: true`) — não publicado no npm.
|
|
233
|
+
- Carry-over: integração OIDC live aguarda owner habilitar redirect_uri pro
|
|
234
|
+
domain do consumer (configurar em `oidc_clients/{client_id}.redirect_uris`).
|
|
235
|
+
- TODO: `support.listMyTickets` precisa parametrizar productSlug (fixed
|
|
236
|
+
`_default` na v0.2).
|
|
237
|
+
|
|
238
|
+
## [0.1.0] - 2026-05-05
|
|
239
|
+
|
|
240
|
+
### Added
|
|
241
|
+
- `createNeetruClient(config)` factory — entry point principal.
|
|
242
|
+
- Resolve `apiKey` (arg explícito > `NEETRU_API_KEY` env em Node).
|
|
243
|
+
- Resolve `baseUrl` (default `https://api.neetru.com`).
|
|
244
|
+
- Resolve `fetch` (arg > `globalThis.fetch`).
|
|
245
|
+
- Namespace `client.catalog`:
|
|
246
|
+
- `list(opts?)` → `GET /api/v1/cli/catalog`. Aceita `includeDrafts`.
|
|
247
|
+
- `get(slug)` → `GET /api/v1/cli/catalog/{slug}`.
|
|
248
|
+
- Namespace `client.entitlements`:
|
|
249
|
+
- `check(slug, feature)` → boolean.
|
|
250
|
+
- `checkDetailed(slug, feature)` → `EntitlementCheck` com `reason`.
|
|
251
|
+
- Backed por `GET /api/v1/sdk/entitlements/check`.
|
|
252
|
+
- Namespace `client.telemetry`:
|
|
253
|
+
- `event({ name, properties?, timestamp? })` → `POST /api/v1/sdk/telemetry/event`.
|
|
254
|
+
- Subpath exports map: `@neetru/sdk/{catalog,entitlements,telemetry,errors}`.
|
|
255
|
+
- HTTP transport com mapeamento status → `NeetruError.code` estável.
|
|
256
|
+
- Tipos exportados: `NeetruClient`, `NeetruClientConfig`, `Product`, `ProductPlan`,
|
|
257
|
+
`EntitlementCheck`, `TelemetryEventInput`, `TelemetryEventAck`, `NeetruErrorCode`.
|
|
258
|
+
- Compat alias `initNeetru` (deprecated, será removido em v1.0).
|
|
259
|
+
|
|
260
|
+
### Changed
|
|
261
|
+
- `VERSION` bump `0.0.1` → `0.1.0`.
|
|
262
|
+
- tsup config multi-entry pra subpath imports.
|
|
263
|
+
|
|
264
|
+
### Backend (acompanha esta release)
|
|
265
|
+
- `GET /api/v1/cli/catalog/{slug}` — produto único.
|
|
266
|
+
- `GET /api/v1/sdk/entitlements/check?slug=&feature=` — verificação por user.
|
|
267
|
+
- `POST /api/v1/sdk/telemetry/event` — persiste em `usage_events`.
|
|
268
|
+
|
|
269
|
+
### Notes
|
|
270
|
+
- Pacote ainda **privado** (`private: true`). Publicação no npm é
|
|
271
|
+
responsabilidade do owner em Sprint 6.
|
|
272
|
+
- API instável; pré-1.0 segue regra "breaking allowed em qualquer minor".
|
|
273
|
+
|
|
274
|
+
## [0.0.1] - 2026-05-04
|
|
275
|
+
|
|
276
|
+
### Added
|
|
277
|
+
- Scaffold inicial do pacote `@neetru/sdk` (private, não publicado no npm ainda).
|
|
278
|
+
- `initNeetru(config)` com validação de `apiUrl` e injeção opcional de `fetch`.
|
|
279
|
+
- `NeetruError` com `code`, `status` e `requestId` opcionais.
|
|
280
|
+
- `NeetruConfig` e `NeetruClient` types públicos.
|
|
281
|
+
- `VERSION` const exportada.
|
|
282
|
+
- Build pipeline com tsup (dual ESM + CJS + `.d.ts`).
|
|
283
|
+
- README + CHANGELOG.
|
|
284
|
+
- `tsconfig.json` strict ES2022 ESNext.
|