@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.
@@ -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
- - Google AdSense
11
- - Google Ad Manager (DV360, Google Ads — re-marketing dahil)
12
- - Major SSP'ler (Magnite, Index Exchange, Xandr...)
13
-
14
- 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.
15
-
16
- ---
17
-
18
- ## Süreç (5 Adım)
19
-
20
- ### 1. Başvuru
21
- - URL: https://iabeurope.eu/cmp-list/
22
- - Form: CMP adı, URL, teknik temas kişisi, audit dokümanları
23
- - Süre: 1 hafta cevap
24
-
25
- ### 2. Teknik Audit
26
- IAB Europe denetçisi şunları kontrol eder:
27
- - `__tcfapi` global fonksiyonun varlığı ve doğru komut yüzeyi (✅ kodda var)
28
- - TC string formatı (Base64URL, doğru segment yapısı) (✅)
29
- - Vendor List senkronizasyonu (GVL fetch) (✅)
30
- - UI'da vendor toggle erişilebilirliği (✅ src/ui/modal.js)
31
- - DSAR (Data Subject Access Request) akışı dokümante edildi mi
32
- - Consent withdrawal her zaman mümkün (✅ widget her zaman erişilebilir)
33
-
34
- ### 3. Ücret
35
- - **Annual fee**: ~€2.000 (CMP boyutuna göre değişir)
36
- - Faturalama: Yıllık peşin
37
-
38
- ### 4. CMP ID Atama
39
- - Audit geçince IAB Europe bir **numeric CMP ID** atar (örn. `123`)
40
- - Bu ID widget'a yazılır:
41
- ```html
42
- <script src="..." data-blakfy-cmp-id="123"></script>
43
- ```
44
- - ID `0` = preview/test mode (audit öncesi)
45
-
46
- ### 5. Yıllık Yenileme
47
- - Her yıl re-audit (kod değişikliği varsa)
48
- - Yenileme ücreti aynı
49
-
50
- ---
51
-
52
- ## Geliştirici Tarafında Yapılacaklar (kullanıcıya talimat)
53
-
54
- ```bash
55
- # Sertifikasyon onayı geldiğinde
56
- 1. CMP ID'yi al (örn. 123)
57
- 2. Site script tag'ine ekle:
58
- data-blakfy-cmp-id="123"
59
- 3. Yeniden deploy.
60
- ```
61
-
62
- 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'ı.
63
-
64
- ---
65
-
66
- ## Preview Mode Davranışı (CMP ID 0)
67
-
68
- - `__tcfapi` çalışır
69
- - TC string üretilir ama `cmpId=0`
70
- - Test ortamlarında ve sertifikasyon beklenirken kullanılır
71
- - Production AdSense kullanımı için **uygun değildir** — Google reddeder
72
-
73
- ---
74
-
75
- ## Vendor List
76
-
77
- - Kaynak: `https://vendor-list.consensu.org/v3/vendor-list.json`
78
- - Boyut: ~500 KB JSON, 1500+ vendor
79
- - Strateji: Lazy fetch + 24 saat cache
80
- - UI'da arama/filtreleme: src/ui/modal.js içinde (vendor toggle paneli)
81
-
82
- ---
83
-
84
- ## DSAR (Data Subject Access Request) Akışı
85
-
86
- GDPR Art. 15 + 17 gereği kullanıcı:
87
- - Verilerine **erişim** isteyebilir site sahibi audit log'tan döndürür
88
- - **Silme** isteyebilir → audit log + cookie temizlenir
89
- - **Onay geri çekme** isteyebilir → widget her zaman açık (`BlakfyCookie.open()`)
90
-
91
- Site sahibinin yapması gereken:
92
- - `data-blakfy-audit-endpoint` ile DSAR taleplerini sorgulayabileceği bir endpoint kurmak
93
- - Privacy policy sayfasında DSAR talimatları yazmak (örnek README'de)
94
-
95
- ---
96
-
97
- ## Maliyet Özeti
98
-
99
- | Kalem | Yıllık |
100
- |---|---|
101
- | IAB Europe sertifikasyon ücreti | ~€2.000 |
102
- | Audit hazırlık (developer saati) | bir kerelik, dahil |
103
- | GVL CDN serving (Cloudflare) | ücretsiz (consensu.org host eder) |
104
- | **TOPLAM** | **~€2.000/yıl** |
105
-
106
- Eğer site AdSense/Ad Manager kullanmıyorsa **sertifikasyona gerek yok**, kod yine de hazır kalır.
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.1.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
- "workspaces": [
7
- "packages/*"
8
- ],
9
- "main": "dist/cookie.js",
10
- "files": [
11
- "dist/",
12
- "status.json",
13
- "README.md",
14
- "ARCHITECTURE.md",
15
- "COMPLIANCE.md",
16
- "TCF-CERTIFICATION.md",
17
- "MIGRATION.md",
18
- "CHANGELOG.md",
19
- "LICENSE"
20
- ],
21
- "scripts": {
22
- "dev": "node scripts/build.js --watch",
23
- "build": "node scripts/build.js",
24
- "build:next": "npm -w @blakfy/cookie-next run build",
25
- "build:all": "npm run build && npm run build:next",
26
- "test": "vitest run",
27
- "test:watch": "vitest",
28
- "size": "node scripts/build.js --size-check",
29
- "release:dry": "echo 'Run: git tag v2.x.x && git push --tags'"
30
- },
31
- "keywords": [
32
- "cookie-consent",
33
- "gdpr",
34
- "kvkk",
35
- "ccpa",
36
- "google-consent-mode",
37
- "microsoft-uet",
38
- "yandex-metrica",
39
- "iab-tcf",
40
- "tcf-v2.2",
41
- "gpc",
42
- "blakfy",
43
- "vanilla-js",
44
- "privacy",
45
- "tag-manager",
46
- "consent-management"
47
- ],
48
- "homepage": "https://github.com/tariktunc/blakfy-cookie",
49
- "repository": {
50
- "type": "git",
51
- "url": "https://github.com/tariktunc/blakfy-cookie.git"
52
- },
53
- "author": "Blakfy Studio <hello@blakfy.com>",
54
- "license": "MIT",
55
- "devDependencies": {
56
- "esbuild": "^0.24.0",
57
- "vitest": "^2.1.0",
58
- "jsdom": "^25.0.0",
59
- "@vitest/ui": "^2.1.0"
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
+ }