@tantainnovative/ndpr-toolkit 5.0.0 → 5.0.1
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 +8 -0
- package/README.md +76 -12
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
## [5.0.1](https://github.com/mr-tanta/ndpr-toolkit/compare/v5.0.0...v5.0.1) (2026-05-28)
|
|
6
|
+
|
|
7
|
+
Docs-only patch. No runtime code change.
|
|
8
|
+
|
|
9
|
+
- README refresh for 5.0: structured-result validator examples (route-handler + client branching), new Internationalization section listing all seven shipped locales (en, yo, ig, ha, pcm, ar, fr) with RTL guidance, `/server` and `/core` import examples switched to `validateConsentStructured`, `cookieAdapter` default documented as 180 days with NDPA Section 26 rationale, and every `raw.githubusercontent.com/.../vN.N.N/...` image URL pinned to the v5.0.0 tag.
|
|
10
|
+
|
|
11
|
+
The npm page now matches the v5 surface. No code, types, or exports changed — `^5.0.0` consumers do not need to upgrade unless they want the new README on their npm page.
|
|
12
|
+
|
|
5
13
|
## [5.0.0](https://github.com/mr-tanta/ndpr-toolkit/compare/v4.1.0...v5.0.0) (2026-05-27)
|
|
6
14
|
|
|
7
15
|
Closes the deprecation window opened by 4.1.0. Every removal here was already deprecated and dev-warned in 4.1, so if your 4.1.x dev console was clean, your 5.0 upgrade is a one-line bump. Full migration table in [`/docs/guides/migrating-4-1-to-5-0`](https://ndprtoolkit.com.ng/docs/guides/migrating-4-1-to-5-0).
|
package/README.md
CHANGED
|
@@ -9,19 +9,19 @@
|
|
|
9
9
|
[](https://github.com/mr-tanta/ndpr-toolkit/actions/workflows/ci.yml)
|
|
10
10
|
[](https://bundlephobia.com/package/@tantainnovative/ndpr-toolkit)
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
v5 ships **zero-config presets**, **pluggable storage adapters**, **compound components**, **structured-error validators**, a **compliance score engine**, and **seven shipped locales** (en, yo, ig, ha, pcm, ar, fr) — eight production-ready modules covering consent, data subject rights, DPIA, breach notification, privacy policies, lawful basis, cross-border transfers, and ROPA.
|
|
13
13
|
|
|
14
|
-
**[Documentation](https://ndprtoolkit.com.ng)** | **[Live Demos](https://ndprtoolkit.com.ng/ndpr-demos)** | **[npm](https://www.npmjs.com/package/@tantainnovative/ndpr-toolkit)** | **[Blog](https://ndprtoolkit.com.ng/blog)** | **[
|
|
14
|
+
**[Documentation](https://ndprtoolkit.com.ng)** | **[Live Demos](https://ndprtoolkit.com.ng/ndpr-demos)** | **[npm](https://www.npmjs.com/package/@tantainnovative/ndpr-toolkit)** | **[Blog](https://ndprtoolkit.com.ng/blog)** | **[v5.0.0 Release](https://github.com/mr-tanta/ndpr-toolkit/releases/tag/v5.0.0)**
|
|
15
15
|
|
|
16
16
|
[](https://stackblitz.com/github/mr-tanta/ndpr-toolkit/tree/main/examples/nextjs-app)
|
|
17
17
|
[](https://codesandbox.io/p/github/mr-tanta/ndpr-toolkit/main/examples/nextjs-app)
|
|
18
18
|
|
|
19
|
-
> **What's new in
|
|
19
|
+
> **What's new in 5.0:** Structured-result validators are now the only shape — `validateConsentStructured`, `validateDsrSubmissionStructured`, `formatDSRRequestStructured`, etc. return `{ field, code, message }[]` so consumers can switch on stable, locale-independent codes (`email_invalid_format`, `consent_stale`, …) instead of regex-matching English strings. Uniform `onAdd` / `onUpdate` / `onArchive` callbacks across `LawfulBasisTracker`, `CrossBorderTransferManager`, `ROPAManager`, and `useROPA`. `NDPRDPIA.onResult(result)` replaces `onComplete(answers)` — the callback now receives the full computed `DPIAResult` (risk level, can-proceed verdict, recommendations). Upgrading from 4.1? See the [4.1 → 5.0 migration guide](https://ndprtoolkit.com.ng/docs/guides/migrating-4-1-to-5-0).
|
|
20
20
|
>
|
|
21
|
-
> **
|
|
21
|
+
> **Recent highlights:** Arabic + French locales with RTL-correct CSS (4.1.0). React 17 dropped from peers; `^18 || ^19` is the honest range (4.0.0). 17 components wired through `useNDPRLocale()` for full Yoruba / Igbo / Hausa / Pidgin coverage (3.13.0). Typed theming via `<NDPRThemeProvider>`, `verify:tarball` CI gate that catches broken exports at PR time (3.10.x). Full history in the [CHANGELOG](https://github.com/mr-tanta/ndpr-toolkit/blob/main/CHANGELOG.md).
|
|
22
22
|
|
|
23
23
|
<p align="center">
|
|
24
|
-
<img src="https://raw.githubusercontent.com/mr-tanta/ndpr-toolkit/
|
|
24
|
+
<img src="https://raw.githubusercontent.com/mr-tanta/ndpr-toolkit/v5.0.0/public/screenshots/hero.png" alt="NDPA Toolkit — NDPA Compliance Made Beautiful" width="800" />
|
|
25
25
|
</p>
|
|
26
26
|
|
|
27
27
|
---
|
|
@@ -71,7 +71,7 @@ import { cookieAdapter, apiAdapter, composeAdapters, localStorageAdapter } from
|
|
|
71
71
|
The full SSR pattern (cookie read server-side → banner hydrates already-resolved, no flash) is in the [Server-Side Storage guide](https://ndprtoolkit.com.ng/docs/guides/server-side-storage).
|
|
72
72
|
|
|
73
73
|
<p align="center">
|
|
74
|
-
<img src="https://raw.githubusercontent.com/mr-tanta/ndpr-toolkit/
|
|
74
|
+
<img src="https://raw.githubusercontent.com/mr-tanta/ndpr-toolkit/v5.0.0/public/screenshots/consent-demo.png" alt="Consent Management Demo — interactive consent banner with state inspector" width="800" />
|
|
75
75
|
<br />
|
|
76
76
|
<em>Interactive consent demo with configurable position, theme, storage, and real-time state inspector</em>
|
|
77
77
|
</p>
|
|
@@ -278,7 +278,8 @@ The recommended entry for backend and serverless contexts. Pure validators, gene
|
|
|
278
278
|
|
|
279
279
|
```ts
|
|
280
280
|
import {
|
|
281
|
-
|
|
281
|
+
validateConsentStructured,
|
|
282
|
+
validateDsrSubmissionStructured,
|
|
282
283
|
generatePolicyText,
|
|
283
284
|
exportHTML,
|
|
284
285
|
getComplianceScore,
|
|
@@ -292,7 +293,7 @@ Build-output guard tests assert this entry never carries a `"use client"` direct
|
|
|
292
293
|
Adds the `NDPRProvider` React Context on top of `/server`'s pure surface. Use when you want types and validators alongside the provider in the same import.
|
|
293
294
|
|
|
294
295
|
```ts
|
|
295
|
-
import { NDPRProvider,
|
|
296
|
+
import { NDPRProvider, validateConsentStructured, getComplianceScore } from '@tantainnovative/ndpr-toolkit/core';
|
|
296
297
|
```
|
|
297
298
|
|
|
298
299
|
### Adapters — pluggable storage
|
|
@@ -357,9 +358,44 @@ import { composeAdapters, apiAdapter, localStorageAdapter } from '@tantainnovati
|
|
|
357
358
|
|
|
358
359
|
**Cookie (server-readable, for SSR consent gating):**
|
|
359
360
|
```tsx
|
|
360
|
-
<NDPRConsent adapter={cookieAdapter('ndpr_consent', { expires:
|
|
361
|
+
<NDPRConsent adapter={cookieAdapter('ndpr_consent', { expires: 180 })} />
|
|
361
362
|
```
|
|
362
363
|
|
|
364
|
+
`expires` defaults to **180 days** (since 3.10.5). NDPA Section 26 doesn't pin a number, but 6 months is the common practice for non-essential cookies and matches what regulators have published elsewhere — long enough to avoid daily re-prompting, short enough that consent stays meaningful.
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## Structured-Result Validators
|
|
369
|
+
|
|
370
|
+
Every validator returns a typed `{ field, code, message }[]` so client and server code can branch on stable, locale-independent codes — not regex-matched English strings.
|
|
371
|
+
|
|
372
|
+
**Next.js Route Handler:**
|
|
373
|
+
```ts
|
|
374
|
+
import { validateDsrSubmissionStructured } from '@tantainnovative/ndpr-toolkit/server';
|
|
375
|
+
|
|
376
|
+
export async function POST(req: Request) {
|
|
377
|
+
const { valid, errors, data } = validateDsrSubmissionStructured(await req.json());
|
|
378
|
+
if (!valid) {
|
|
379
|
+
return Response.json({ errors }, { status: 422 });
|
|
380
|
+
// errors: Array<{ field: 'dataSubject.email', code: 'email_invalid_format', message: '...' }>
|
|
381
|
+
}
|
|
382
|
+
// `data` is the narrowed `DsrSubmissionPayload`
|
|
383
|
+
await dsrStore.create(data);
|
|
384
|
+
return Response.json({ ok: true }, { status: 201 });
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**Client-side branching:**
|
|
389
|
+
```ts
|
|
390
|
+
import { validateConsentStructured } from '@tantainnovative/ndpr-toolkit';
|
|
391
|
+
|
|
392
|
+
const { valid, errors } = validateConsentStructured(settings);
|
|
393
|
+
const stale = errors.find((e) => e.code === 'consent_stale');
|
|
394
|
+
if (stale) showRefreshBanner();
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
The full code catalogue lives in the [validator API docs](https://ndprtoolkit.com.ng/docs/server). The legacy string-returning shapes (`validateConsent`, `validateDsrSubmission`, `formatDSRRequest`, `validateConsentOptions`) were removed in 5.0 — see the [4.1 → 5.0 migration guide](https://ndprtoolkit.com.ng/docs/guides/migrating-4-1-to-5-0) if you're upgrading.
|
|
398
|
+
|
|
363
399
|
---
|
|
364
400
|
|
|
365
401
|
## Compliance Score
|
|
@@ -448,13 +484,13 @@ Every module has an interactive demo. No signup, no setup — try them instantly
|
|
|
448
484
|
|
|
449
485
|
<p align="center">
|
|
450
486
|
<a href="https://ndprtoolkit.com.ng/ndpr-demos">
|
|
451
|
-
<img src="https://raw.githubusercontent.com/mr-tanta/ndpr-toolkit/
|
|
487
|
+
<img src="https://raw.githubusercontent.com/mr-tanta/ndpr-toolkit/v5.0.0/public/screenshots/demos-overview.png" alt="8 interactive live demos — zero setup required" width="800" />
|
|
452
488
|
</a>
|
|
453
489
|
</p>
|
|
454
490
|
|
|
455
491
|
<p align="center">
|
|
456
|
-
<img src="https://raw.githubusercontent.com/mr-tanta/ndpr-toolkit/
|
|
457
|
-
<img src="https://raw.githubusercontent.com/mr-tanta/ndpr-toolkit/
|
|
492
|
+
<img src="https://raw.githubusercontent.com/mr-tanta/ndpr-toolkit/v5.0.0/public/screenshots/dsr-demo.png" alt="Data Subject Rights — 8 rights with request tracking" width="400" />
|
|
493
|
+
<img src="https://raw.githubusercontent.com/mr-tanta/ndpr-toolkit/v5.0.0/public/screenshots/breach-demo.png" alt="Breach Notification — 72-hour countdown with step-by-step workflow" width="400" />
|
|
458
494
|
</p>
|
|
459
495
|
|
|
460
496
|
<p align="center">
|
|
@@ -491,6 +527,34 @@ Cookie-bridged consent that hydrates without a flash. Each scaffold reads the `n
|
|
|
491
527
|
|
|
492
528
|
---
|
|
493
529
|
|
|
530
|
+
## Internationalization
|
|
531
|
+
|
|
532
|
+
Wrap your app in `<NDPRProvider locale={...}>` and every shipped component picks up the translation:
|
|
533
|
+
|
|
534
|
+
```tsx
|
|
535
|
+
import { NDPRProvider, arabicLocale, frenchLocale } from '@tantainnovative/ndpr-toolkit/core';
|
|
536
|
+
|
|
537
|
+
<NDPRProvider locale={arabicLocale}>
|
|
538
|
+
<App />
|
|
539
|
+
</NDPRProvider>
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
Seven locales ship out of the box:
|
|
543
|
+
|
|
544
|
+
| Locale | Export | Notes |
|
|
545
|
+
|---|---|---|
|
|
546
|
+
| English | `defaultLocale` | Default |
|
|
547
|
+
| Yoruba | `yorubaLocale` | |
|
|
548
|
+
| Igbo | `igboLocale` | |
|
|
549
|
+
| Hausa | `hausaLocale` | |
|
|
550
|
+
| Nigerian Pidgin | `pidginLocale` | |
|
|
551
|
+
| Arabic | `arabicLocale` | Modern Standard; RTL-aware. Set `dir="rtl"` on a parent and `styles.css` mirrors correctly (logical properties as of 4.1). |
|
|
552
|
+
| French | `frenchLocale` | Francophone West African register; uses GDPR-equivalent French terms where they carry meaning. |
|
|
553
|
+
|
|
554
|
+
Override individual strings via `mergeLocale(base, partial)`. Component prop overrides (`title`, `description`, etc.) still win over the provider locale — the resolution order is **prop → provider locale → English default**.
|
|
555
|
+
|
|
556
|
+
---
|
|
557
|
+
|
|
494
558
|
## All 8 Modules
|
|
495
559
|
|
|
496
560
|
| Module | Import path | NDPA reference | Key exports |
|
package/package.json
CHANGED