@blakfy/cookie 2.1.2 → 2.2.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 +194 -140
- package/README.md +594 -532
- package/SECURITY.md +54 -0
- package/dist/cookie-defaults.js +1 -2
- package/dist/cookie-defaults.min.js +1 -2
- package/dist/cookie.d.ts +171 -0
- package/dist/cookie.js +2863 -2376
- package/dist/cookie.js.map +4 -4
- package/dist/cookie.min.js +2 -3
- package/{ARCHITECTURE.md → docs/architecture.md} +187 -186
- package/{COMPLIANCE.md → docs/compliance.md} +199 -191
- package/{MIGRATION.md → docs/migration.md} +172 -156
- package/docs/release.md +176 -0
- package/{TCF-CERTIFICATION.md → docs/tcf-certification.md} +115 -106
- package/package.json +145 -61
- package/status.json +30 -30
|
@@ -1,106 +1,115 @@
|
|
|
1
|
-
# IAB TCF v2.2 Sertifikasyon Süreci
|
|
2
|
-
|
|
3
|
-
> Bu doküman v2.0.0 release sonrası başlatılacak süreçtir. Kod hazır, ama IAB Europe'tan resmi CMP ID alınmadan widget "preview mode"da çalışır.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Neden Sertifikasyon Lazım?
|
|
8
|
-
|
|
9
|
-
Eğer site sahibi:
|
|
10
|
-
|
|
11
|
-
- Google
|
|
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
|
-
- TC string
|
|
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
|
-
|
|
1
|
+
# IAB TCF v2.2 Sertifikasyon Süreci
|
|
2
|
+
|
|
3
|
+
> Bu doküman v2.0.0 release sonrası başlatılacak süreçtir. Kod hazır, ama IAB Europe'tan resmi CMP ID alınmadan widget "preview mode"da çalışır.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Neden Sertifikasyon Lazım?
|
|
8
|
+
|
|
9
|
+
Eğer site sahibi:
|
|
10
|
+
|
|
11
|
+
- Google AdSense
|
|
12
|
+
- Google Ad Manager (DV360, Google Ads — re-marketing dahil)
|
|
13
|
+
- Major SSP'ler (Magnite, Index Exchange, Xandr...)
|
|
14
|
+
|
|
15
|
+
kullanıyorsa, **Mart 2024'ten beri** TCF v2.2 sertifikalı bir CMP zorunlu. Sertifikasız widget "non-compliant" sayılır ve Google reklam servisi durdurabilir.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Süreç (5 Adım)
|
|
20
|
+
|
|
21
|
+
### 1. Başvuru
|
|
22
|
+
|
|
23
|
+
- URL: https://iabeurope.eu/cmp-list/
|
|
24
|
+
- Form: CMP adı, URL, teknik temas kişisi, audit dokümanları
|
|
25
|
+
- Süre: 1 hafta cevap
|
|
26
|
+
|
|
27
|
+
### 2. Teknik Audit
|
|
28
|
+
|
|
29
|
+
IAB Europe denetçisi şunları kontrol eder:
|
|
30
|
+
|
|
31
|
+
- `__tcfapi` global fonksiyonun varlığı ve doğru komut yüzeyi (✅ kodda var)
|
|
32
|
+
- TC string formatı (Base64URL, doğru segment yapısı) (✅)
|
|
33
|
+
- Vendor List senkronizasyonu (GVL fetch) (✅)
|
|
34
|
+
- UI'da vendor toggle erişilebilirliği (✅ src/ui/modal.js)
|
|
35
|
+
- DSAR (Data Subject Access Request) akışı dokümante edildi mi
|
|
36
|
+
- Consent withdrawal her zaman mümkün mü (✅ widget her zaman erişilebilir)
|
|
37
|
+
|
|
38
|
+
### 3. Ücret
|
|
39
|
+
|
|
40
|
+
- **Annual fee**: ~€2.000 (CMP boyutuna göre değişir)
|
|
41
|
+
- Faturalama: Yıllık peşin
|
|
42
|
+
|
|
43
|
+
### 4. CMP ID Atama
|
|
44
|
+
|
|
45
|
+
- Audit geçince IAB Europe bir **numeric CMP ID** atar (örn. `123`)
|
|
46
|
+
- Bu ID widget'a yazılır:
|
|
47
|
+
```html
|
|
48
|
+
<script src="..." data-blakfy-cmp-id="123"></script>
|
|
49
|
+
```
|
|
50
|
+
- ID `0` = preview/test mode (audit öncesi)
|
|
51
|
+
|
|
52
|
+
### 5. Yıllık Yenileme
|
|
53
|
+
|
|
54
|
+
- Her yıl re-audit (kod değişikliği varsa)
|
|
55
|
+
- Yenileme ücreti aynı
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Geliştirici Tarafında Yapılacaklar (kullanıcıya talimat)
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Sertifikasyon onayı geldiğinde
|
|
63
|
+
1. CMP ID'yi al (örn. 123)
|
|
64
|
+
2. Site script tag'ine ekle:
|
|
65
|
+
data-blakfy-cmp-id="123"
|
|
66
|
+
3. Yeniden deploy.
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Kütüphane güncellemesi gerekmez — `data-blakfy-cmp-id="0"` (preview) ile `data-blakfy-cmp-id="123"` (prod) arasındaki tek fark TC string'in `cmpId` field'ı.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Preview Mode Davranışı (CMP ID 0)
|
|
74
|
+
|
|
75
|
+
- `__tcfapi` çalışır
|
|
76
|
+
- TC string üretilir ama `cmpId=0`
|
|
77
|
+
- Test ortamlarında ve sertifikasyon beklenirken kullanılır
|
|
78
|
+
- Production AdSense kullanımı için **uygun değildir** — Google reddeder
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Vendor List
|
|
83
|
+
|
|
84
|
+
- Kaynak: `https://vendor-list.consensu.org/v3/vendor-list.json`
|
|
85
|
+
- Boyut: ~500 KB JSON, 1500+ vendor
|
|
86
|
+
- Strateji: Lazy fetch + 24 saat cache
|
|
87
|
+
- UI'da arama/filtreleme: src/ui/modal.js içinde (vendor toggle paneli)
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## DSAR (Data Subject Access Request) Akışı
|
|
92
|
+
|
|
93
|
+
GDPR Art. 15 + 17 gereği kullanıcı:
|
|
94
|
+
|
|
95
|
+
- Verilerine **erişim** isteyebilir → site sahibi audit log'tan döndürür
|
|
96
|
+
- **Silme** isteyebilir → audit log + cookie temizlenir
|
|
97
|
+
- **Onay geri çekme** isteyebilir → widget her zaman açık (`BlakfyCookie.open()`)
|
|
98
|
+
|
|
99
|
+
Site sahibinin yapması gereken:
|
|
100
|
+
|
|
101
|
+
- `data-blakfy-audit-endpoint` ile DSAR taleplerini sorgulayabileceği bir endpoint kurmak
|
|
102
|
+
- Privacy policy sayfasında DSAR talimatları yazmak (örnek README'de)
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Maliyet Özeti
|
|
107
|
+
|
|
108
|
+
| Kalem | Yıllık |
|
|
109
|
+
| -------------------------------- | --------------------------------- |
|
|
110
|
+
| IAB Europe sertifikasyon ücreti | ~€2.000 |
|
|
111
|
+
| Audit hazırlık (developer saati) | bir kerelik, dahil |
|
|
112
|
+
| GVL CDN serving (Cloudflare) | ücretsiz (consensu.org host eder) |
|
|
113
|
+
| **TOPLAM** | **~€2.000/yıl** |
|
|
114
|
+
|
|
115
|
+
Eğer site AdSense/Ad Manager kullanmıyorsa **sertifikasyona gerek yok**, kod yine de hazır kalır.
|
package/package.json
CHANGED
|
@@ -1,61 +1,145 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@blakfy/cookie",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "Blakfy Studio — KVKK + GDPR + CCPA + Google CMv2 + Microsoft UET + Yandex + TCF v2.2 uyumlu cookie consent widget. 23 dil. 18 preset. Tag-gating dahil.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
|
|
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
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@blakfy/cookie",
|
|
3
|
+
"version": "2.2.0",
|
|
4
|
+
"description": "Blakfy Studio — KVKK + GDPR + CCPA + Google CMv2 + Microsoft UET + Yandex + TCF v2.2 uyumlu cookie consent widget. 23 dil. 18 preset. Tag-gating dahil.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=18"
|
|
8
|
+
},
|
|
9
|
+
"workspaces": [
|
|
10
|
+
"packages/*",
|
|
11
|
+
"examples/nextjs"
|
|
12
|
+
],
|
|
13
|
+
"main": "dist/cookie.js",
|
|
14
|
+
"module": "dist/cookie.js",
|
|
15
|
+
"types": "dist/cookie.d.ts",
|
|
16
|
+
"unpkg": "dist/cookie.min.js",
|
|
17
|
+
"jsdelivr": "dist/cookie.min.js",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/cookie.d.ts",
|
|
21
|
+
"browser": "./dist/cookie.js",
|
|
22
|
+
"import": "./dist/cookie.js",
|
|
23
|
+
"default": "./dist/cookie.js"
|
|
24
|
+
},
|
|
25
|
+
"./defaults": {
|
|
26
|
+
"browser": "./dist/cookie-defaults.js",
|
|
27
|
+
"import": "./dist/cookie-defaults.js",
|
|
28
|
+
"default": "./dist/cookie-defaults.js"
|
|
29
|
+
},
|
|
30
|
+
"./status.json": "./status.json",
|
|
31
|
+
"./package.json": "./package.json"
|
|
32
|
+
},
|
|
33
|
+
"sideEffects": [
|
|
34
|
+
"dist/cookie.js",
|
|
35
|
+
"dist/cookie.min.js",
|
|
36
|
+
"dist/cookie-defaults.js",
|
|
37
|
+
"dist/cookie-defaults.min.js"
|
|
38
|
+
],
|
|
39
|
+
"files": [
|
|
40
|
+
"dist/",
|
|
41
|
+
"docs/",
|
|
42
|
+
"status.json",
|
|
43
|
+
"README.md",
|
|
44
|
+
"CHANGELOG.md",
|
|
45
|
+
"SECURITY.md",
|
|
46
|
+
"LICENSE"
|
|
47
|
+
],
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public",
|
|
50
|
+
"provenance": true
|
|
51
|
+
},
|
|
52
|
+
"bugs": {
|
|
53
|
+
"url": "https://github.com/tariktunc/blakfy-cookie/issues"
|
|
54
|
+
},
|
|
55
|
+
"funding": {
|
|
56
|
+
"type": "github",
|
|
57
|
+
"url": "https://github.com/sponsors/tariktunc"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"dev": "node scripts/build.js --watch",
|
|
61
|
+
"build": "node scripts/build.js",
|
|
62
|
+
"build:next": "npm -w @blakfy/cookie-next run build",
|
|
63
|
+
"build:all": "npm run build && npm run build:next",
|
|
64
|
+
"test": "vitest run",
|
|
65
|
+
"test:watch": "vitest",
|
|
66
|
+
"size": "node scripts/build.js --size-check",
|
|
67
|
+
"release:dry": "echo 'Run: git tag v2.x.x && git push --tags'",
|
|
68
|
+
"lint": "eslint .",
|
|
69
|
+
"lint:fix": "eslint . --fix",
|
|
70
|
+
"format": "prettier --write .",
|
|
71
|
+
"format:check": "prettier --check .",
|
|
72
|
+
"test:coverage": "vitest run --coverage",
|
|
73
|
+
"prepare": "husky",
|
|
74
|
+
"changeset": "changeset",
|
|
75
|
+
"version-packages": "changeset version",
|
|
76
|
+
"release": "changeset publish",
|
|
77
|
+
"typecheck": "tsc --noEmit && npm -w @blakfy/cookie-next exec tsc --noEmit",
|
|
78
|
+
"size:report": "size-limit"
|
|
79
|
+
},
|
|
80
|
+
"keywords": [
|
|
81
|
+
"cookie-consent",
|
|
82
|
+
"gdpr",
|
|
83
|
+
"kvkk",
|
|
84
|
+
"ccpa",
|
|
85
|
+
"google-consent-mode",
|
|
86
|
+
"microsoft-uet",
|
|
87
|
+
"yandex-metrica",
|
|
88
|
+
"iab-tcf",
|
|
89
|
+
"tcf-v2.2",
|
|
90
|
+
"gpc",
|
|
91
|
+
"blakfy",
|
|
92
|
+
"vanilla-js",
|
|
93
|
+
"privacy",
|
|
94
|
+
"tag-manager",
|
|
95
|
+
"consent-management"
|
|
96
|
+
],
|
|
97
|
+
"homepage": "https://github.com/tariktunc/blakfy-cookie",
|
|
98
|
+
"repository": {
|
|
99
|
+
"type": "git",
|
|
100
|
+
"url": "https://github.com/tariktunc/blakfy-cookie.git"
|
|
101
|
+
},
|
|
102
|
+
"author": "Blakfy Studio <hello@blakfy.com>",
|
|
103
|
+
"license": "MIT",
|
|
104
|
+
"devDependencies": {
|
|
105
|
+
"@changesets/cli": "^2.31.0",
|
|
106
|
+
"@commitlint/cli": "^20.5.3",
|
|
107
|
+
"@commitlint/config-conventional": "^20.5.3",
|
|
108
|
+
"@eslint/js": "9.39.4",
|
|
109
|
+
"@size-limit/preset-small-lib": "^12.1.0",
|
|
110
|
+
"@typescript-eslint/eslint-plugin": "8.59.2",
|
|
111
|
+
"@typescript-eslint/parser": "8.59.2",
|
|
112
|
+
"@vitest/coverage-v8": "3.2.4",
|
|
113
|
+
"@vitest/ui": "^3.2.0",
|
|
114
|
+
"esbuild": "^0.25.0",
|
|
115
|
+
"eslint": "9.39.4",
|
|
116
|
+
"eslint-config-prettier": "10.1.8",
|
|
117
|
+
"eslint-plugin-import": "2.32.0",
|
|
118
|
+
"eslint-plugin-jsx-a11y": "6.10.2",
|
|
119
|
+
"eslint-plugin-n": "18.0.1",
|
|
120
|
+
"eslint-plugin-promise": "7.3.0",
|
|
121
|
+
"eslint-plugin-react": "7.37.5",
|
|
122
|
+
"eslint-plugin-react-hooks": "7.1.1",
|
|
123
|
+
"globals": "17.6.0",
|
|
124
|
+
"husky": "^9.1.7",
|
|
125
|
+
"jsdom": "^26.0.0",
|
|
126
|
+
"lint-staged": "^17.0.2",
|
|
127
|
+
"prettier": "3.8.3",
|
|
128
|
+
"size-limit": "^12.1.0",
|
|
129
|
+
"typescript": "^5.9.3",
|
|
130
|
+
"vitest": "^3.2.0"
|
|
131
|
+
},
|
|
132
|
+
"overrides": {
|
|
133
|
+
"postcss": "^8.5.10",
|
|
134
|
+
"esbuild": "^0.25.0"
|
|
135
|
+
},
|
|
136
|
+
"lint-staged": {
|
|
137
|
+
"*.{js,ts,tsx,jsx}": [
|
|
138
|
+
"eslint --fix --max-warnings=999",
|
|
139
|
+
"prettier --write"
|
|
140
|
+
],
|
|
141
|
+
"*.{json,md,yml,yaml}": [
|
|
142
|
+
"prettier --write"
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
}
|
package/status.json
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
{
|
|
2
|
-
"active": false,
|
|
3
|
-
"type": "info",
|
|
4
|
-
"expires": null,
|
|
5
|
-
"message": {
|
|
6
|
-
"tr": "",
|
|
7
|
-
"en": "",
|
|
8
|
-
"ar": "",
|
|
9
|
-
"fa": "",
|
|
10
|
-
"ur": "",
|
|
11
|
-
"fr": "",
|
|
12
|
-
"ru": "",
|
|
13
|
-
"de": "",
|
|
14
|
-
"he": "",
|
|
15
|
-
"uk": "",
|
|
16
|
-
"es": "",
|
|
17
|
-
"it": "",
|
|
18
|
-
"pt": "",
|
|
19
|
-
"nl": "",
|
|
20
|
-
"pl": "",
|
|
21
|
-
"sv": "",
|
|
22
|
-
"cs": "",
|
|
23
|
-
"zh": "",
|
|
24
|
-
"zh-TW": "",
|
|
25
|
-
"ja": "",
|
|
26
|
-
"ko": "",
|
|
27
|
-
"id": "",
|
|
28
|
-
"hi": ""
|
|
29
|
-
}
|
|
30
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"active": false,
|
|
3
|
+
"type": "info",
|
|
4
|
+
"expires": null,
|
|
5
|
+
"message": {
|
|
6
|
+
"tr": "",
|
|
7
|
+
"en": "",
|
|
8
|
+
"ar": "",
|
|
9
|
+
"fa": "",
|
|
10
|
+
"ur": "",
|
|
11
|
+
"fr": "",
|
|
12
|
+
"ru": "",
|
|
13
|
+
"de": "",
|
|
14
|
+
"he": "",
|
|
15
|
+
"uk": "",
|
|
16
|
+
"es": "",
|
|
17
|
+
"it": "",
|
|
18
|
+
"pt": "",
|
|
19
|
+
"nl": "",
|
|
20
|
+
"pl": "",
|
|
21
|
+
"sv": "",
|
|
22
|
+
"cs": "",
|
|
23
|
+
"zh": "",
|
|
24
|
+
"zh-TW": "",
|
|
25
|
+
"ja": "",
|
|
26
|
+
"ko": "",
|
|
27
|
+
"id": "",
|
|
28
|
+
"hi": ""
|
|
29
|
+
}
|
|
30
|
+
}
|