@neetru/sdk 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/CHANGELOG.md +183 -0
- package/README.md +218 -0
- package/dist/auth.cjs +1137 -0
- package/dist/auth.cjs.map +1 -0
- package/dist/auth.d.cts +25 -0
- package/dist/auth.d.ts +25 -0
- package/dist/auth.mjs +1135 -0
- package/dist/auth.mjs.map +1 -0
- package/dist/catalog.cjs +179 -0
- package/dist/catalog.cjs.map +1 -0
- package/dist/catalog.d.cts +17 -0
- package/dist/catalog.d.ts +17 -0
- package/dist/catalog.mjs +177 -0
- package/dist/catalog.mjs.map +1 -0
- package/dist/db.cjs +232 -0
- package/dist/db.cjs.map +1 -0
- package/dist/db.d.cts +8 -0
- package/dist/db.d.ts +8 -0
- package/dist/db.mjs +230 -0
- package/dist/db.mjs.map +1 -0
- package/dist/entitlements.cjs +140 -0
- package/dist/entitlements.cjs.map +1 -0
- package/dist/entitlements.d.cts +14 -0
- package/dist/entitlements.d.ts +14 -0
- package/dist/entitlements.mjs +138 -0
- package/dist/entitlements.mjs.map +1 -0
- package/dist/errors.cjs +20 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +27 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.mjs +18 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/index.cjs +1154 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +24 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.mjs +1142 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mocks.cjs +281 -0
- package/dist/mocks.cjs.map +1 -0
- package/dist/mocks.d.cts +138 -0
- package/dist/mocks.d.ts +138 -0
- package/dist/mocks.mjs +274 -0
- package/dist/mocks.mjs.map +1 -0
- package/dist/support.cjs +176 -0
- package/dist/support.cjs.map +1 -0
- package/dist/support.d.cts +5 -0
- package/dist/support.d.ts +5 -0
- package/dist/support.mjs +174 -0
- package/dist/support.mjs.map +1 -0
- package/dist/telemetry.cjs +225 -0
- package/dist/telemetry.cjs.map +1 -0
- package/dist/telemetry.d.cts +35 -0
- package/dist/telemetry.d.ts +35 -0
- package/dist/telemetry.mjs +223 -0
- package/dist/telemetry.mjs.map +1 -0
- package/dist/types-PKUaFtBY.d.cts +408 -0
- package/dist/types-PKUaFtBY.d.ts +408 -0
- package/dist/usage.cjs +235 -0
- package/dist/usage.cjs.map +1 -0
- package/dist/usage.d.cts +5 -0
- package/dist/usage.d.ts +5 -0
- package/dist/usage.mjs +233 -0
- package/dist/usage.mjs.map +1 -0
- package/package.json +79 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
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-1.0)
|
|
11
|
+
- Telemetry batching + flush on unload.
|
|
12
|
+
- LRU cache em entitlements.check (TTL configurável).
|
|
13
|
+
- size-limit budget no CI (<12KB gz core com db namespace).
|
|
14
|
+
- CDN distribution (`cdn.neetru.com/sdk/v1/`).
|
|
15
|
+
|
|
16
|
+
## [1.0.0] - 2026-05-06 — **GA (General Availability)**
|
|
17
|
+
|
|
18
|
+
Marco de estabilidade. A partir desta versão, **a superfície pública do SDK
|
|
19
|
+
está congelada** — breaking changes só em majors (semver estrito).
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
- **API stability lock** — todos os contratos (`createNeetruClient`,
|
|
23
|
+
`NeetruClient`, namespaces `auth`/`catalog`/`entitlements`/`telemetry`/
|
|
24
|
+
`usage`/`support`/`db`, `NeetruError`) ficam estáveis em v1.x. Coberto
|
|
25
|
+
por `api-surface-stability.test.ts` que falha o build se algum método
|
|
26
|
+
muda forma.
|
|
27
|
+
- **JSDoc completo** em toda função/método público — base pra `npm run docs:gen`
|
|
28
|
+
(typedoc → `sdk/docs-html/`).
|
|
29
|
+
- **`docs:gen` script** + `scripts/typedoc.config.json` — gera HTML
|
|
30
|
+
navigable das APIs.
|
|
31
|
+
- **`engines.node`** relaxado de `>=20` → `>=18` (suporta runtimes Node 18 LTS
|
|
32
|
+
ainda em uso por consumers).
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
- `VERSION` bump `0.3.0` → `1.0.0`.
|
|
36
|
+
- README atualizado com seção de migração v0.3 → v1.0 (no breaking changes —
|
|
37
|
+
upgrade transparente).
|
|
38
|
+
|
|
39
|
+
### Migration v0.3 → v1.0
|
|
40
|
+
- **Sem breaking changes.** Upgrade direto via `npm install @neetru/sdk@1.0.0`.
|
|
41
|
+
- `initNeetru` continua deprecated mas funcional. **Será removido em v2.0.0.**
|
|
42
|
+
- `NeetruConfig` continua deprecated. Use `NeetruClientConfig`.
|
|
43
|
+
|
|
44
|
+
### Stability promise (v1.x)
|
|
45
|
+
A partir de v1.0:
|
|
46
|
+
- Métodos novos podem ser adicionados a namespaces existentes (minor bump).
|
|
47
|
+
- Métodos podem ser marcados `@deprecated` em qualquer minor — só removidos
|
|
48
|
+
em major.
|
|
49
|
+
- Tipos nunca ganham campos required em minor (só optional ou via union).
|
|
50
|
+
- `NeetruErrorCode` é union fechado em v1.0 — qualquer novo código bumpa minor.
|
|
51
|
+
|
|
52
|
+
### Notes
|
|
53
|
+
- Pacote ainda **privado** (`private: true`). Publicação no npm é
|
|
54
|
+
responsabilidade do owner — gate no CHANGELOG continua trancado até decisão.
|
|
55
|
+
|
|
56
|
+
## [0.3.0] - 2026-05-06
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
- Namespace `client.db` (v0.3) — wrapper minimalista pra coleções tenant-scoped:
|
|
60
|
+
- `client.db.collection(name).list({ limit? })`
|
|
61
|
+
- `client.db.collection(name).get(id)` (retorna null em not_found)
|
|
62
|
+
- `client.db.collection(name).set(id, data)` upsert
|
|
63
|
+
- `client.db.collection(name).remove(id)` delete
|
|
64
|
+
- Endpoints: `/sdk/v1/datastore/{collection}/{id?}` (placeholder REST — Sprint 9
|
|
65
|
+
finaliza; SDK já expõe interface estável).
|
|
66
|
+
- `MockDb` (in-memory) ativo em `NEETRU_ENV=dev`.
|
|
67
|
+
- Namespace `client.usage` ganhou `report()` e `check()`:
|
|
68
|
+
- `usage.report(resource, qty?)` → `POST /sdk/v1/usage/record` canônico
|
|
69
|
+
(Sprint 7) — incrementa atomicamente `usage_counters/{tid}_{pid}_{r}_{yyyymm}`.
|
|
70
|
+
- `usage.check(resource)` → `GET /sdk/v1/entitlements?productId&tenantId&feature` —
|
|
71
|
+
retorna `{allowed, reason, remaining, limit, planId, planFeatures}`.
|
|
72
|
+
- `NeetruClientConfig.productId` / `.tenantId` — defaults pra `usage.report` /
|
|
73
|
+
`usage.check` / `db.collection` quando não passado em options.
|
|
74
|
+
- Mock helpers: `MockDb`, `MockUsage.report()`, `MockUsage.check()`.
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
- `VERSION` bump `0.2.0` → `0.3.0`.
|
|
78
|
+
- `NeetruClient` agora expõe `.db` além dos antigos.
|
|
79
|
+
- `ResolvedConfig` ganhou `productId` + `tenantId` opcionais.
|
|
80
|
+
|
|
81
|
+
### Backend (acompanha esta release)
|
|
82
|
+
- Novos endpoints (Sprint 7):
|
|
83
|
+
- `POST /sdk/v1/usage/record` — atomic increment + 80%/100% notifications + audit.
|
|
84
|
+
- `GET /sdk/v1/entitlements` — lookup canônico subscription→plan→counter.
|
|
85
|
+
- `POST /sdk/v1/telemetry/log` — batch logger pra `logs/{productId}/{yyyymmdd}/`.
|
|
86
|
+
|
|
87
|
+
## [0.2.0] - 2026-05-06
|
|
88
|
+
|
|
89
|
+
### Added
|
|
90
|
+
- Namespace `client.auth` (v0.2 — OIDC + dev mocks):
|
|
91
|
+
- `signIn(options?)` — redireciona pra auth.neetru.com authorize endpoint
|
|
92
|
+
(browser) ou retorna mock user em dev (`NEETRU_ENV=dev`).
|
|
93
|
+
- `signOut()` — limpa `localStorage.neetru_id_token` + revoga refresh
|
|
94
|
+
server-side (best-effort).
|
|
95
|
+
- `getUser()` — decodifica id_token cached e retorna `NeetruUser` ou null.
|
|
96
|
+
- `onAuthStateChanged(listener)` — sub a mudanças, dispatcha sync no subscribe.
|
|
97
|
+
- Namespace `client.usage` (v0.2 — meter):
|
|
98
|
+
- `track(event, props?)` → `POST /sdk/v1/usage/record` com Bearer.
|
|
99
|
+
- `getQuota(metric)` → `GET /sdk/v1/usage/quota?metric=` returns
|
|
100
|
+
`{ metric, used, limit, plan, resetsAt? }`.
|
|
101
|
+
- Namespace `client.support` (v0.2 — tickets):
|
|
102
|
+
- `createTicket({subject, message, severity?, productSlug?})` →
|
|
103
|
+
`POST /api/v1/products/{slug}/tickets` (default `_default`).
|
|
104
|
+
- `listMyTickets()` → `GET ...` retorna array (aceita envelope `{tickets:[]}`).
|
|
105
|
+
- `mocks` module (`@neetru/sdk/mocks`):
|
|
106
|
+
- `MockAuth`, `MockUsage`, `MockSupport`, `MockEntitlements` — overridáveis
|
|
107
|
+
via `createNeetruClient({ mocks: { auth: MockAuth(...), ... } })`.
|
|
108
|
+
- `DEV_FIXTURE_USER` constante exportada.
|
|
109
|
+
- `NEETRU_ENV` resolution chain: config arg > `process.env.NEETRU_ENV` >
|
|
110
|
+
`globalThis.NEETRU_ENV` > default `prod`. `dev` ativa mocks automáticos.
|
|
111
|
+
- Subpath exports adicionais: `@neetru/sdk/{auth,usage,support,mocks}`.
|
|
112
|
+
- Tipos novos: `NeetruUser`, `AuthNamespace`, `UsageNamespace`,
|
|
113
|
+
`SupportNamespace`, `SignInOptions`, `SupportTicket`, `UsageQuota`,
|
|
114
|
+
`NeetruEnv`, `CreateTicketInput`.
|
|
115
|
+
|
|
116
|
+
### Changed
|
|
117
|
+
- `VERSION` bump `0.1.0` → `0.2.0`.
|
|
118
|
+
- `NeetruClientConfig` ganhou campos `env` + `mocks`.
|
|
119
|
+
- `ResolvedConfig` ganhou `env` resolved.
|
|
120
|
+
- `NeetruClient` agora expõe `.auth`, `.usage`, `.support` além dos antigos.
|
|
121
|
+
|
|
122
|
+
### Backend (acompanha esta release — endpoints documentados em `docs/SDK_OPENAPI.md`)
|
|
123
|
+
- `POST /sdk/v1/usage/record` — record event meterado.
|
|
124
|
+
- `GET /sdk/v1/usage/quota?metric=` — ler quota atual.
|
|
125
|
+
- `POST /api/v1/products/{slug}/tickets` — criar ticket.
|
|
126
|
+
- `GET /api/v1/products/{slug}/tickets` — listar meus tickets.
|
|
127
|
+
- (auth) `auth.neetru.com/oauth/authorize` — já live (Sprint 1 OIDC).
|
|
128
|
+
- (auth) `auth.neetru.com/oauth/revoke` — revoga refresh token.
|
|
129
|
+
|
|
130
|
+
### Notes
|
|
131
|
+
- Pacote ainda **privado** (`private: true`) — não publicado no npm.
|
|
132
|
+
- Carry-over: integração OIDC live aguarda owner habilitar redirect_uri pro
|
|
133
|
+
domain do consumer (configurar em `oidc_clients/{client_id}.redirect_uris`).
|
|
134
|
+
- TODO: `support.listMyTickets` precisa parametrizar productSlug (fixed
|
|
135
|
+
`_default` na v0.2).
|
|
136
|
+
|
|
137
|
+
## [0.1.0] - 2026-05-05
|
|
138
|
+
|
|
139
|
+
### Added
|
|
140
|
+
- `createNeetruClient(config)` factory — entry point principal.
|
|
141
|
+
- Resolve `apiKey` (arg explícito > `NEETRU_API_KEY` env em Node).
|
|
142
|
+
- Resolve `baseUrl` (default `https://api.neetru.com`).
|
|
143
|
+
- Resolve `fetch` (arg > `globalThis.fetch`).
|
|
144
|
+
- Namespace `client.catalog`:
|
|
145
|
+
- `list(opts?)` → `GET /api/v1/cli/catalog`. Aceita `includeDrafts`.
|
|
146
|
+
- `get(slug)` → `GET /api/v1/cli/catalog/{slug}`.
|
|
147
|
+
- Namespace `client.entitlements`:
|
|
148
|
+
- `check(slug, feature)` → boolean.
|
|
149
|
+
- `checkDetailed(slug, feature)` → `EntitlementCheck` com `reason`.
|
|
150
|
+
- Backed por `GET /api/v1/sdk/entitlements/check`.
|
|
151
|
+
- Namespace `client.telemetry`:
|
|
152
|
+
- `event({ name, properties?, timestamp? })` → `POST /api/v1/sdk/telemetry/event`.
|
|
153
|
+
- Subpath exports map: `@neetru/sdk/{catalog,entitlements,telemetry,errors}`.
|
|
154
|
+
- HTTP transport com mapeamento status → `NeetruError.code` estável.
|
|
155
|
+
- Tipos exportados: `NeetruClient`, `NeetruClientConfig`, `Product`, `ProductPlan`,
|
|
156
|
+
`EntitlementCheck`, `TelemetryEventInput`, `TelemetryEventAck`, `NeetruErrorCode`.
|
|
157
|
+
- Compat alias `initNeetru` (deprecated, será removido em v1.0).
|
|
158
|
+
|
|
159
|
+
### Changed
|
|
160
|
+
- `VERSION` bump `0.0.1` → `0.1.0`.
|
|
161
|
+
- tsup config multi-entry pra subpath imports.
|
|
162
|
+
|
|
163
|
+
### Backend (acompanha esta release)
|
|
164
|
+
- `GET /api/v1/cli/catalog/{slug}` — produto único.
|
|
165
|
+
- `GET /api/v1/sdk/entitlements/check?slug=&feature=` — verificação por user.
|
|
166
|
+
- `POST /api/v1/sdk/telemetry/event` — persiste em `usage_events`.
|
|
167
|
+
|
|
168
|
+
### Notes
|
|
169
|
+
- Pacote ainda **privado** (`private: true`). Publicação no npm é
|
|
170
|
+
responsabilidade do owner em Sprint 6.
|
|
171
|
+
- API instável; pré-1.0 segue regra "breaking allowed em qualquer minor".
|
|
172
|
+
|
|
173
|
+
## [0.0.1] - 2026-05-04
|
|
174
|
+
|
|
175
|
+
### Added
|
|
176
|
+
- Scaffold inicial do pacote `@neetru/sdk` (private, não publicado no npm ainda).
|
|
177
|
+
- `initNeetru(config)` com validação de `apiUrl` e injeção opcional de `fetch`.
|
|
178
|
+
- `NeetruError` com `code`, `status` e `requestId` opcionais.
|
|
179
|
+
- `NeetruConfig` e `NeetruClient` types públicos.
|
|
180
|
+
- `VERSION` const exportada.
|
|
181
|
+
- Build pipeline com tsup (dual ESM + CJS + `.d.ts`).
|
|
182
|
+
- README + CHANGELOG.
|
|
183
|
+
- `tsconfig.json` strict ES2022 ESNext.
|
package/README.md
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# @neetru/sdk
|
|
2
|
+
|
|
3
|
+
Biblioteca runtime para consumir o ecossistema Neetru — catálogo público de
|
|
4
|
+
produtos, entitlements de tenant e telemetria — de qualquer
|
|
5
|
+
JavaScript/TypeScript moderno (browser, Node ≥20, Edge runtimes).
|
|
6
|
+
|
|
7
|
+
> **Status:** `1.0.0` GA — superfície pública estabilizada (2026-05-06).
|
|
8
|
+
> Namespaces `auth`/`catalog`/`entitlements`/`telemetry`/`usage`/`support`/`db`.
|
|
9
|
+
> A partir de v1.0, breaking changes só em majors. CDN distribution segue
|
|
10
|
+
> roadmap pós-1.0 — vide [`docs/PLAN_SDK_NEETRU.md`](../docs/PLAN_SDK_NEETRU.md).
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Princípios
|
|
15
|
+
|
|
16
|
+
- **Vendor-neutral** — apesar do Core usar Firebase, a superfície pública do
|
|
17
|
+
SDK não vaza isso (sem `firebase/app` exposto).
|
|
18
|
+
- **TypeScript-first** — `.d.ts` shipped, JSDoc em toda função pública.
|
|
19
|
+
- **Tree-shakable** — ESM-first, `"sideEffects": false`. Subpath imports
|
|
20
|
+
permitidos (`@neetru/sdk/catalog`, `@neetru/sdk/telemetry`, etc).
|
|
21
|
+
- **Universal** — usa `fetch` global. Sem `node:` builtins no core.
|
|
22
|
+
- **Erros tipados** — todos erros são `NeetruError` com `.code`, `.status`,
|
|
23
|
+
`.requestId`.
|
|
24
|
+
- **Semver estrito** — pós v1.0, breaking changes só em majors.
|
|
25
|
+
|
|
26
|
+
## Install
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install @neetru/sdk
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
> Pacote ainda **privado** (`private: true`) e não publicado no npm.
|
|
33
|
+
> Reservar é responsabilidade do owner em Sprint 6 do plano.
|
|
34
|
+
|
|
35
|
+
## Quick start
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { createNeetruClient, NeetruError } from '@neetru/sdk';
|
|
39
|
+
|
|
40
|
+
const client = createNeetruClient({
|
|
41
|
+
apiKey: process.env.NEETRU_API_KEY, // ou deixe undefined que ele lê do env
|
|
42
|
+
baseUrl: 'https://api.neetru.com', // default
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// 1. Catálogo público de produtos
|
|
46
|
+
const { products } = await client.catalog.list();
|
|
47
|
+
console.log(products.map((p) => p.slug));
|
|
48
|
+
|
|
49
|
+
const product = await client.catalog.get('neetru-pulse');
|
|
50
|
+
|
|
51
|
+
// 2. Entitlements — pode o caller usar a feature `export-pdf` do produto?
|
|
52
|
+
const allowed = await client.entitlements.check('neetru-pulse', 'export-pdf');
|
|
53
|
+
if (!allowed) showUpgradeBanner();
|
|
54
|
+
|
|
55
|
+
// 3. Telemetria — emite evento de uso
|
|
56
|
+
await client.telemetry.event({
|
|
57
|
+
name: 'report_exported',
|
|
58
|
+
properties: { format: 'pdf', plan: 'pro' },
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Discriminação de erro:
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
try {
|
|
66
|
+
await client.catalog.list();
|
|
67
|
+
} catch (err) {
|
|
68
|
+
if (err instanceof NeetruError) {
|
|
69
|
+
if (err.code === 'rate_limited') retry();
|
|
70
|
+
if (err.code === 'unauthorized') promptLogin();
|
|
71
|
+
console.error(err.code, err.message, err.status, err.requestId);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## API reference (v0.2)
|
|
77
|
+
|
|
78
|
+
### `createNeetruClient(config?)`
|
|
79
|
+
|
|
80
|
+
| Campo | Tipo | Descrição |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| `apiKey` | `string?` | Bearer token `nrt_<keyId>_<secret>`. Default lê `process.env.NEETRU_API_KEY` em Node. |
|
|
83
|
+
| `baseUrl` | `string?` | URL base. Default `https://api.neetru.com`. |
|
|
84
|
+
| `fetch` | `typeof fetch?` | Implementação custom. Default `globalThis.fetch`. |
|
|
85
|
+
| `env` | `'dev' \| 'workspace' \| 'prod'?` | Ativa mocks automáticos em `dev`. Default `prod` (lê `NEETRU_ENV`). |
|
|
86
|
+
| `mocks` | `{ auth?, usage?, support?, entitlements? }?` | Override de namespaces — útil em tests do consumer. |
|
|
87
|
+
|
|
88
|
+
Retorna `NeetruClient` com `.config`, `.auth`, `.catalog`, `.entitlements`, `.telemetry`, `.usage`, `.support`.
|
|
89
|
+
|
|
90
|
+
### `client.auth` (v0.2)
|
|
91
|
+
|
|
92
|
+
| Método | Descrição |
|
|
93
|
+
|---|---|
|
|
94
|
+
| `signIn(options?)` | Redireciona pro authorize endpoint (browser) ou retorna fixture user (dev). |
|
|
95
|
+
| `signOut()` | Limpa session local + revoga refresh server-side. |
|
|
96
|
+
| `getUser()` | Retorna `NeetruUser` cached do id_token ou `null`. |
|
|
97
|
+
| `onAuthStateChanged(listener)` | Sub a mudanças. Dispatch sync no subscribe. Retorna unsubscribe. |
|
|
98
|
+
|
|
99
|
+
### `client.catalog`
|
|
100
|
+
|
|
101
|
+
| Método | Descrição |
|
|
102
|
+
|---|---|
|
|
103
|
+
| `list(opts?)` | `GET /api/v1/cli/catalog`. Retorna `{ products, fetchedAt }`. |
|
|
104
|
+
| `get(slug)` | `GET /api/v1/cli/catalog/{slug}`. Retorna `Product` ou lança `not_found`. |
|
|
105
|
+
|
|
106
|
+
### `client.entitlements`
|
|
107
|
+
|
|
108
|
+
| Método | Descrição |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `check(slug, feature)` | `boolean`. Atalho do `checkDetailed`. |
|
|
111
|
+
| `checkDetailed(slug, feature)` | `EntitlementCheck` com `allowed`, `reason`. |
|
|
112
|
+
|
|
113
|
+
### `client.telemetry`
|
|
114
|
+
|
|
115
|
+
| Método | Descrição |
|
|
116
|
+
|---|---|
|
|
117
|
+
| `event({ name, properties?, timestamp? })` | `POST /api/v1/sdk/telemetry/event`. Retorna `{ ok, eventId }`. |
|
|
118
|
+
|
|
119
|
+
### `client.usage` (v0.2)
|
|
120
|
+
|
|
121
|
+
| Método | Descrição |
|
|
122
|
+
|---|---|
|
|
123
|
+
| `track(event, props?)` | `POST /sdk/v1/usage/record`. Persiste consumo. |
|
|
124
|
+
| `getQuota(metric)` | `GET /sdk/v1/usage/quota?metric=`. Retorna `{ used, limit, plan, resetsAt? }`. |
|
|
125
|
+
|
|
126
|
+
### `client.support` (v0.2)
|
|
127
|
+
|
|
128
|
+
| Método | Descrição |
|
|
129
|
+
|---|---|
|
|
130
|
+
| `createTicket({subject, message, severity?, productSlug?})` | `POST /api/v1/products/{slug}/tickets`. |
|
|
131
|
+
| `listMyTickets()` | `GET /api/v1/products/_default/tickets`. |
|
|
132
|
+
|
|
133
|
+
### Mocks (`@neetru/sdk/mocks`)
|
|
134
|
+
|
|
135
|
+
Use em tests do consumer ou ative globalmente com `NEETRU_ENV=dev`:
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
import { createNeetruClient, MockAuth, MockUsage, MockSupport } from '@neetru/sdk';
|
|
139
|
+
|
|
140
|
+
const client = createNeetruClient({
|
|
141
|
+
mocks: {
|
|
142
|
+
auth: new MockAuth({ uid: 'fake', email: 'fake@x.com' }),
|
|
143
|
+
usage: new MockUsage(),
|
|
144
|
+
support: new MockSupport(),
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Códigos de erro estáveis (`NeetruError.code`)
|
|
150
|
+
|
|
151
|
+
`invalid_config` · `missing_api_key` · `unauthorized` · `forbidden` ·
|
|
152
|
+
`not_found` · `rate_limited` · `validation_failed` · `network_error` ·
|
|
153
|
+
`invalid_response` · `server_error` · `unknown`.
|
|
154
|
+
|
|
155
|
+
## Subpath imports (tree-shaking)
|
|
156
|
+
|
|
157
|
+
```ts
|
|
158
|
+
// Importa só o tipo de erro (zero deps de transport)
|
|
159
|
+
import { NeetruError } from '@neetru/sdk/errors';
|
|
160
|
+
|
|
161
|
+
// Bundlers podem fazer code-split por namespace
|
|
162
|
+
import { createCatalogNamespace } from '@neetru/sdk/catalog';
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Build
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
npm run build # tsup → dist/{index,catalog,entitlements,telemetry,errors}.{mjs,cjs,d.ts}
|
|
169
|
+
npm run dev # watch mode
|
|
170
|
+
npm run lint # tsc --noEmit
|
|
171
|
+
npm run test # vitest run (Sprint 2+)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Tooling: [tsup](https://tsup.egoist.dev) (esbuild backend, dual ESM+CJS,
|
|
175
|
+
auto `.d.ts`).
|
|
176
|
+
|
|
177
|
+
## Migration v0.3 → v1.0
|
|
178
|
+
|
|
179
|
+
**Sem breaking changes.** Upgrade direto via `npm install @neetru/sdk@1.0.0`.
|
|
180
|
+
|
|
181
|
+
- `initNeetru` continua deprecated mas funcional. **Será removido em v2.0.0.**
|
|
182
|
+
Use `createNeetruClient` em código novo.
|
|
183
|
+
- `NeetruConfig` continua deprecated — use `NeetruClientConfig`.
|
|
184
|
+
- Tipos exportados continuam idênticos.
|
|
185
|
+
- Comportamento runtime idêntico — apenas estabilização de contratos.
|
|
186
|
+
|
|
187
|
+
## Stability promise (v1.x)
|
|
188
|
+
|
|
189
|
+
A partir de v1.0:
|
|
190
|
+
- Métodos novos podem ser adicionados a namespaces existentes (minor bump).
|
|
191
|
+
- Métodos podem ser marcados `@deprecated` em qualquer minor — só removidos
|
|
192
|
+
em major.
|
|
193
|
+
- Tipos nunca ganham campos required em minor (só optional ou via union).
|
|
194
|
+
- `NeetruErrorCode` é union fechado em v1.0 — qualquer novo código bumpa minor.
|
|
195
|
+
|
|
196
|
+
## Generate API docs
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
npm install --include=dev # garante typedoc
|
|
200
|
+
npm run docs:gen # → sdk/docs-html/index.html
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## Roadmap
|
|
204
|
+
|
|
205
|
+
- ✅ **v1.0** — API stability + GA. JSDoc completo + typedoc.
|
|
206
|
+
- **v1.1** — Telemetry batching + flush on unload.
|
|
207
|
+
- **v1.2** — LRU cache em entitlements.check (TTL configurável).
|
|
208
|
+
- **v1.x** — CDN release (`cdn.neetru.com/sdk/v1/`), SRI integrity.json,
|
|
209
|
+
UMD/IIFE bundle.
|
|
210
|
+
|
|
211
|
+
Detalhes em
|
|
212
|
+
[`docs/PLAN_SDK_NEETRU.md`](../docs/PLAN_SDK_NEETRU.md) +
|
|
213
|
+
[`docs/PLAN_SDK_CLI_CDN.md`](../docs/PLAN_SDK_CLI_CDN.md).
|
|
214
|
+
|
|
215
|
+
## License
|
|
216
|
+
|
|
217
|
+
UNLICENSED — uso interno Neetru. License pública será definida em release
|
|
218
|
+
público (npm publish).
|