@neetru/sdk 3.4.2 → 3.4.4
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 +37 -0
- package/dist/ai.d.cts +1 -1
- package/dist/ai.d.ts +1 -1
- package/dist/auth.cjs +17 -7
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.d.cts +1 -1
- package/dist/auth.d.ts +1 -1
- package/dist/auth.mjs +17 -7
- package/dist/auth.mjs.map +1 -1
- package/dist/build-guard.cjs +98 -0
- package/dist/build-guard.cjs.map +1 -1
- package/dist/build-guard.d.cts +63 -1
- package/dist/build-guard.d.ts +63 -1
- package/dist/build-guard.mjs +93 -1
- package/dist/build-guard.mjs.map +1 -1
- package/dist/catalog.d.cts +1 -1
- package/dist/catalog.d.ts +1 -1
- package/dist/checkout.cjs +17 -7
- package/dist/checkout.cjs.map +1 -1
- package/dist/checkout.d.cts +1 -1
- package/dist/checkout.d.ts +1 -1
- package/dist/checkout.mjs +17 -7
- package/dist/checkout.mjs.map +1 -1
- package/dist/db-react.d.cts +1 -1
- package/dist/db-react.d.ts +1 -1
- package/dist/db.d.cts +1 -1
- package/dist/db.d.ts +1 -1
- package/dist/entitlements.d.cts +1 -1
- package/dist/entitlements.d.ts +1 -1
- package/dist/firestore-compat.d.cts +1 -1
- package/dist/firestore-compat.d.ts +1 -1
- package/dist/index.cjs +18 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +18 -8
- package/dist/index.mjs.map +1 -1
- package/dist/mocks.d.cts +1 -1
- package/dist/mocks.d.ts +1 -1
- package/dist/notifications.d.cts +1 -1
- package/dist/notifications.d.ts +1 -1
- package/dist/react.cjs +62 -3
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +38 -7
- package/dist/react.d.ts +38 -7
- package/dist/react.mjs +62 -3
- package/dist/react.mjs.map +1 -1
- package/dist/support.d.cts +1 -1
- package/dist/support.d.ts +1 -1
- package/dist/telemetry.d.cts +1 -1
- package/dist/telemetry.d.ts +1 -1
- package/dist/{types-BlOLDMR0.d.ts → types-Bzxb5rlF.d.ts} +26 -8
- package/dist/{types-D-QdG502.d.cts → types-Dw0fqhHm.d.cts} +26 -8
- package/dist/usage.d.cts +1 -1
- package/dist/usage.d.ts +1 -1
- package/dist/webhooks.d.cts +1 -1
- package/dist/webhooks.d.ts +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,43 @@ All notable changes to `@neetru/sdk` will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.4.4] - 2026-09-07 — **fix(checkout): aceitar id_token no padrão BFF/cookie (desbloqueia checkout PAGO)**
|
|
9
|
+
|
|
10
|
+
Release **patch** (correção de bug que bloqueava 100% do checkout PAGO no padrão BFF/cookie; aditivos opcionais retrocompatíveis, nenhuma remoção de API, nenhuma mudança de wire além de um header aceito a mais). Bug `bug_72ccf42065304d3384aa3ed09accef8d` (HIGH).
|
|
11
|
+
|
|
12
|
+
### Contexto
|
|
13
|
+
|
|
14
|
+
No padrão **BFF/cookie** (recomendado), o app troca `code`→tokens **no servidor**, guarda só o **id_token** num cookie **httpOnly** e **descarta o access_token** — então o browser NUNCA tem o access_token. Mas `checkout.start()` / `<CheckoutLink>` exigiam o access_token no browser, tornando impossível iniciar o checkout PAGO nesse padrão (só o `MockCheckout` de dev "funcionava"). O Core passou a aceitar o **id_token** no endpoint de checkout (via `verifyEndUserIdToken`, mesma validação forte de assinatura/kid/iss/exp da barra de conta), então o SDK agora expõe o caminho BFF.
|
|
15
|
+
|
|
16
|
+
### Corrigido
|
|
17
|
+
|
|
18
|
+
- **`checkout.start()` / `get()` / `cancel()` aceitam `idToken`** além de `accessToken`. O helper de auth manda o token que houver no header `Bearer` (o Core resolve se é access_token ou id_token). Quando ambos vêm, `accessToken` tem prioridade (é revogável no servidor). Sem nenhum dos dois, continua lançando `validation_failed` sem tocar a rede.
|
|
19
|
+
|
|
20
|
+
### Adicionado (aditivo, opcional)
|
|
21
|
+
|
|
22
|
+
- **`CheckoutStartInput.idToken?` / `CheckoutAuthOpts.idToken?`** — id_token OIDC do usuário final para o padrão BFF/cookie.
|
|
23
|
+
- **`<CheckoutLink startPath="/api/checkout/start">`** — novo modo BFF: o clique faz `POST` no route do PRÓPRIO app (same-origin, `credentials: 'include'` → manda o cookie httpOnly), que inicia o checkout server-side e devolve `{ redirectUrl }`. O `client` vira **opcional** neste modo (o browser não precisa de token nem de client). O modo legado `client.checkout.start()` (client-side, browser com token) segue intacto.
|
|
24
|
+
|
|
25
|
+
### Padrão BFF suportado
|
|
26
|
+
|
|
27
|
+
Ver `docs/CHECKOUT_BFF.md` — passo a passo canônico do checkout num app BFF/cookie (o que o produto tem que fazer: route BFF que lê o id_token do cookie e chama `client.checkout.start({ ..., idToken })`, + `<CheckoutLink startPath=...>` no client).
|
|
28
|
+
|
|
29
|
+
## [3.4.3] - 2026-09-07 — **build-guard força pg + drizzle-orm no trace do standalone (causa-2 outage PDV 2026-09-07)**
|
|
30
|
+
|
|
31
|
+
Release **patch** (só correção de build; nada de wire, nada removido da API). Fase 2 do conserto do outage do PDV.
|
|
32
|
+
|
|
33
|
+
### Corrigido
|
|
34
|
+
|
|
35
|
+
- **`withNeetruBuildGuard` força o FECHO TRANSITIVO de `pg` + `drizzle-orm` no trace do `output: 'standalone'`** — `client.db.sql` carrega `pg` e `drizzle-orm/node-postgres` por `import()` dinâmico com `webpackIgnore` (server-only, pra `pg` nunca vazar `fs`/`tls`/`net` pro bundle do browser). O efeito colateral era invisível: o trace estático do Next (`@vercel/nft`) não enxerga esses `import()`, então num standalone enxuto `pg` e todo o closure dele **não eram copiados** pra `.next/standalone/node_modules` → runtime `Cannot find package 'pg'` (e, depois de forçar só o dir do `pg`, `Cannot find module 'postgres-array'`). Causa-2 do outage do PDV de 2026-09-07. O guard agora injeta duas chaves no `next.config`:
|
|
36
|
+
- `outputFileTracingIncludes: { '*': [...closure] }` **(o conserto real)** — computa PROGRAMATICAMENTE o fecho transitivo de runtime de `pg` + `drizzle-orm` a partir do node_modules instalado do produto e emite um glob `./node_modules/<pkg>/**` por pacote do closure: `pg → pg-pool/pg-protocol/pg-types/pg-connection-string/pgpass → postgres-array/postgres-bytea/postgres-date/postgres-interval/pg-int8 → …` (+ optional `pg-cloudflare`). O walker lê `package.json` **direto do filesystem** (não `require.resolve`, que dá `ERR_PACKAGE_PATH_NOT_EXPORTED` em pacotes com `exports` fechando `./package.json` — `drizzle-orm`/`pg-protocol`/`pg-pool` fazem isso), com poda de ciclo e skip gracioso de dep faltando. Chave `'*'` casa todas as rotas.
|
|
37
|
+
- `serverExternalPackages: [...existentes, 'pg', 'drizzle-orm']` **(reforço)** — inofensivo e ajuda caminhos de import VISÍVEIS ao nft, mas **NÃO conserta** o caso `webpackIgnore` (o `import()` é invisível ao nft, então `serverExternalPackages` sozinho não copia `pg` nem o closure — por isso o glob computado é o que resolve).
|
|
38
|
+
|
|
39
|
+
Ambas MESCLAM (concat + dedupe) com o que o produto já tiver — nunca sobrescrevem. Só o caminho de produção (`pg` + `drizzle-orm`); `pglite`/`pg-mem` (mock/teste) NÃO entram. Produto **sem SQL**: `pg`/`drizzle-orm` não resolvem → closure `[]` → nenhuma chave adicionada → **zero peso morto**. Programático (não glob fixo) DE PROPÓSITO: os transitivos ficam HOISTADOS na raiz (npm 7+), então `./node_modules/pg/**` sozinho não os cobre — à prova de whack-a-mole. Chaves canônicas do Next 15 (todo o ecossistema Neetru). Roda no BUILD do produto, não em runtime. Verificado contra o artefato ESM buildado: closure de 15 pacotes, `./node_modules/postgres-array/**` presente.
|
|
40
|
+
|
|
41
|
+
### Manutenção
|
|
42
|
+
|
|
43
|
+
- **Sincroniza `VERSION` (`src/index.ts`) com `package.json`** — a release 3.4.2 bumpou o `package.json` mas esqueceu a const `VERSION` (ficou em `3.4.1`), o que reprovava o drift-guard (`version-and-export-surface`). Realinhado em `3.4.3`.
|
|
44
|
+
|
|
8
45
|
## [3.4.2] - 2026-09-06 — **barra de conta (app-switcher) + build-guard OIDC de PROD + pool SQL tunável**
|
|
9
46
|
|
|
10
47
|
Release **patch** (tudo aditivo/retrocompatível: nova superfície opcional, guard só-prod, tuning de pool). Nenhuma mudança de wire, nenhuma remoção de API.
|
package/dist/ai.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { A as AiChatChoice, a as AiChatMessage, b as AiChatOptions, c as AiChatResult, d as AiChatUsage, e as AiContentPart, f as AiImageUrlPart, g as AiNamespace, h as AiResponseFormat, i as AiStreamHandle, j as AiStreamMeta, k as AiTextPart, aJ as createAiNamespace } from './types-
|
|
1
|
+
export { A as AiChatChoice, a as AiChatMessage, b as AiChatOptions, c as AiChatResult, d as AiChatUsage, e as AiContentPart, f as AiImageUrlPart, g as AiNamespace, h as AiResponseFormat, i as AiStreamHandle, j as AiStreamMeta, k as AiTextPart, aJ as createAiNamespace } from './types-Dw0fqhHm.cjs';
|
|
2
2
|
import 'drizzle-orm/node-postgres';
|
|
3
3
|
import './errors.cjs';
|
package/dist/ai.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { A as AiChatChoice, a as AiChatMessage, b as AiChatOptions, c as AiChatResult, d as AiChatUsage, e as AiContentPart, f as AiImageUrlPart, g as AiNamespace, h as AiResponseFormat, i as AiStreamHandle, j as AiStreamMeta, k as AiTextPart, aJ as createAiNamespace } from './types-
|
|
1
|
+
export { A as AiChatChoice, a as AiChatMessage, b as AiChatOptions, c as AiChatResult, d as AiChatUsage, e as AiContentPart, f as AiImageUrlPart, g as AiNamespace, h as AiResponseFormat, i as AiStreamHandle, j as AiStreamMeta, k as AiTextPart, aJ as createAiNamespace } from './types-Bzxb5rlF.js';
|
|
2
2
|
import 'drizzle-orm/node-postgres';
|
|
3
3
|
import './errors.js';
|
package/dist/auth.cjs
CHANGED
|
@@ -5576,14 +5576,15 @@ function createLazyCollectionRef(name, getDocsPromise) {
|
|
|
5576
5576
|
// src/checkout.ts
|
|
5577
5577
|
init_errors();
|
|
5578
5578
|
init_http();
|
|
5579
|
-
function checkoutAuth(
|
|
5580
|
-
|
|
5579
|
+
function checkoutAuth(auth, method) {
|
|
5580
|
+
const token = auth?.accessToken || auth?.idToken;
|
|
5581
|
+
if (!token || typeof token !== "string") {
|
|
5581
5582
|
throw new NeetruError(
|
|
5582
5583
|
"validation_failed",
|
|
5583
|
-
`checkout.${method} requer o access_token OIDC do usu\xE1rio final (passe \`accessToken\`). A chave de API do SDK (nrt_*) N\xC3O \xE9 aceita pelo endpoint de checkout \u2014 ele autentica a identidade do cliente que est\xE1 assinando (Bearer access_token OIDC ou cookie de sess\xE3o).`
|
|
5584
|
+
`checkout.${method} requer o access_token OU o id_token OIDC do usu\xE1rio final (passe \`accessToken\` ou \`idToken\`). A chave de API do SDK (nrt_*) N\xC3O \xE9 aceita pelo endpoint de checkout \u2014 ele autentica a identidade do cliente que est\xE1 assinando (Bearer access_token/id_token OIDC ou cookie de sess\xE3o). No padr\xE3o BFF/cookie, passe o \`idToken\` que seu servidor guardou no cookie httpOnly.`
|
|
5584
5585
|
);
|
|
5585
5586
|
}
|
|
5586
|
-
return { requireAuth: false, headers: { authorization: `Bearer ${
|
|
5587
|
+
return { requireAuth: false, headers: { authorization: `Bearer ${token}` } };
|
|
5587
5588
|
}
|
|
5588
5589
|
function parseStartResponse(raw) {
|
|
5589
5590
|
if (!raw || typeof raw !== "object") {
|
|
@@ -5662,7 +5663,10 @@ function createHttpCheckoutNamespace(config) {
|
|
|
5662
5663
|
};
|
|
5663
5664
|
if (input.tenantType) body.targetTenantType = input.tenantType;
|
|
5664
5665
|
if (input.tenantId) body.targetTenantId = input.tenantId;
|
|
5665
|
-
const { requireAuth, headers } = checkoutAuth(
|
|
5666
|
+
const { requireAuth, headers } = checkoutAuth(
|
|
5667
|
+
{ accessToken: input.accessToken, idToken: input.idToken },
|
|
5668
|
+
"start"
|
|
5669
|
+
);
|
|
5666
5670
|
const raw = await httpRequest(config, {
|
|
5667
5671
|
method: "POST",
|
|
5668
5672
|
path: "/api/v1/checkout/intents",
|
|
@@ -5682,7 +5686,10 @@ function createHttpCheckoutNamespace(config) {
|
|
|
5682
5686
|
if (!intentId || typeof intentId !== "string") {
|
|
5683
5687
|
throw new NeetruError("validation_failed", "checkout.get: intentId is required");
|
|
5684
5688
|
}
|
|
5685
|
-
const { requireAuth, headers } = checkoutAuth(
|
|
5689
|
+
const { requireAuth, headers } = checkoutAuth(
|
|
5690
|
+
{ accessToken: opts?.accessToken, idToken: opts?.idToken },
|
|
5691
|
+
"get"
|
|
5692
|
+
);
|
|
5686
5693
|
const raw = await httpRequest(config, {
|
|
5687
5694
|
method: "GET",
|
|
5688
5695
|
path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,
|
|
@@ -5695,7 +5702,10 @@ function createHttpCheckoutNamespace(config) {
|
|
|
5695
5702
|
if (!intentId || typeof intentId !== "string") {
|
|
5696
5703
|
throw new NeetruError("validation_failed", "checkout.cancel: intentId is required");
|
|
5697
5704
|
}
|
|
5698
|
-
const { requireAuth, headers } = checkoutAuth(
|
|
5705
|
+
const { requireAuth, headers } = checkoutAuth(
|
|
5706
|
+
{ accessToken: opts?.accessToken, idToken: opts?.idToken },
|
|
5707
|
+
"cancel"
|
|
5708
|
+
);
|
|
5699
5709
|
const raw = await httpRequest(config, {
|
|
5700
5710
|
method: "DELETE",
|
|
5701
5711
|
path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,
|