@owlmeans/marketing-consent 0.1.18-rc.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/README.md +15 -0
- package/agent-meta/manifest.json +16 -0
- package/agent-meta/skills/marketing-consent/SKILL.md +169 -0
- package/build/consts.d.ts +32 -0
- package/build/consts.d.ts.map +1 -0
- package/build/consts.js +125 -0
- package/build/consts.js.map +1 -0
- package/build/entrypoints.d.ts +13 -0
- package/build/entrypoints.d.ts.map +1 -0
- package/build/entrypoints.js +36 -0
- package/build/entrypoints.js.map +1 -0
- package/build/errors.d.ts +14 -0
- package/build/errors.d.ts.map +1 -0
- package/build/errors.js +21 -0
- package/build/errors.js.map +1 -0
- package/build/i18n/be.json +62 -0
- package/build/i18n/de.json +62 -0
- package/build/i18n/en.json +62 -0
- package/build/i18n/es.json +62 -0
- package/build/i18n/fr.json +62 -0
- package/build/i18n/pl.json +62 -0
- package/build/i18n/ru.json +62 -0
- package/build/i18n/uk.json +62 -0
- package/build/i18n.d.ts +2 -0
- package/build/i18n.d.ts.map +1 -0
- package/build/i18n.js +21 -0
- package/build/i18n.js.map +1 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +7 -0
- package/build/index.js.map +1 -0
- package/build/resolve.d.ts +21 -0
- package/build/resolve.d.ts.map +1 -0
- package/build/resolve.js +96 -0
- package/build/resolve.js.map +1 -0
- package/build/schemas.d.ts +5 -0
- package/build/schemas.d.ts.map +1 -0
- package/build/schemas.js +46 -0
- package/build/schemas.js.map +1 -0
- package/build/types.d.ts +147 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/package.json +49 -0
- package/src/consts.ts +136 -0
- package/src/entrypoints.ts +65 -0
- package/src/errors.ts +25 -0
- package/src/i18n/be.json +62 -0
- package/src/i18n/de.json +62 -0
- package/src/i18n/en.json +62 -0
- package/src/i18n/es.json +62 -0
- package/src/i18n/fr.json +62 -0
- package/src/i18n/pl.json +62 -0
- package/src/i18n/ru.json +62 -0
- package/src/i18n/uk.json +62 -0
- package/src/i18n.ts +23 -0
- package/src/index.ts +7 -0
- package/src/resolve.ts +117 -0
- package/src/schemas.ts +50 -0
- package/src/types.ts +144 -0
- package/tests/entrypoints.spec.ts +56 -0
- package/tests/i18n.spec.ts +37 -0
- package/tests/resolve.spec.ts +62 -0
- package/tests/status.spec.ts +118 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"group": {
|
|
3
|
+
"communications": {
|
|
4
|
+
"title": "Communications",
|
|
5
|
+
"description": "How we contact you."
|
|
6
|
+
},
|
|
7
|
+
"data": {
|
|
8
|
+
"title": "Data use",
|
|
9
|
+
"description": "How your data is used and shared."
|
|
10
|
+
},
|
|
11
|
+
"trackers": {
|
|
12
|
+
"title": "Trackers",
|
|
13
|
+
"description": "Analytics and advertising technologies."
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"consent": {
|
|
17
|
+
"marketing": {
|
|
18
|
+
"email": {
|
|
19
|
+
"label": "Email offers and updates",
|
|
20
|
+
"description": "Product news, offers and updates by email."
|
|
21
|
+
},
|
|
22
|
+
"sms": {
|
|
23
|
+
"label": "SMS messages",
|
|
24
|
+
"description": "Offers and updates by text message."
|
|
25
|
+
},
|
|
26
|
+
"phone": {
|
|
27
|
+
"label": "Phone calls",
|
|
28
|
+
"description": "Offers and updates by phone call."
|
|
29
|
+
},
|
|
30
|
+
"push": {
|
|
31
|
+
"label": "Push notifications",
|
|
32
|
+
"description": "Offers and updates as push notifications."
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"data": {
|
|
36
|
+
"profiling": {
|
|
37
|
+
"label": "Personalization",
|
|
38
|
+
"description": "Using your activity to personalize what you see."
|
|
39
|
+
},
|
|
40
|
+
"partners": {
|
|
41
|
+
"label": "Sharing with partners",
|
|
42
|
+
"description": "Sharing your data with selected partners for their own marketing."
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"trackers": {
|
|
46
|
+
"analytics": {
|
|
47
|
+
"label": "Analytics cookies",
|
|
48
|
+
"description": "Cookies that help us understand how the product is used."
|
|
49
|
+
},
|
|
50
|
+
"advertising": {
|
|
51
|
+
"label": "Advertising cookies",
|
|
52
|
+
"description": "Cookies used to measure and personalize ads."
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"link": {
|
|
57
|
+
"default": "Learn more"
|
|
58
|
+
},
|
|
59
|
+
"errors": {
|
|
60
|
+
"unknown": "Unknown consent: {{key}}"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"group": {
|
|
3
|
+
"communications": {
|
|
4
|
+
"title": "Comunicaciones",
|
|
5
|
+
"description": "Cómo nos ponemos en contacto contigo."
|
|
6
|
+
},
|
|
7
|
+
"data": {
|
|
8
|
+
"title": "Uso de datos",
|
|
9
|
+
"description": "Cómo se usan y comparten tus datos."
|
|
10
|
+
},
|
|
11
|
+
"trackers": {
|
|
12
|
+
"title": "Rastreadores",
|
|
13
|
+
"description": "Tecnologías de análisis y publicidad."
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"consent": {
|
|
17
|
+
"marketing": {
|
|
18
|
+
"email": {
|
|
19
|
+
"label": "Ofertas y novedades por email",
|
|
20
|
+
"description": "Novedades del producto, ofertas y actualizaciones por correo electrónico."
|
|
21
|
+
},
|
|
22
|
+
"sms": {
|
|
23
|
+
"label": "Mensajes SMS",
|
|
24
|
+
"description": "Ofertas y actualizaciones por mensaje de texto."
|
|
25
|
+
},
|
|
26
|
+
"phone": {
|
|
27
|
+
"label": "Llamadas telefónicas",
|
|
28
|
+
"description": "Ofertas y actualizaciones por llamada telefónica."
|
|
29
|
+
},
|
|
30
|
+
"push": {
|
|
31
|
+
"label": "Notificaciones push",
|
|
32
|
+
"description": "Ofertas y actualizaciones como notificaciones push."
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"data": {
|
|
36
|
+
"profiling": {
|
|
37
|
+
"label": "Personalización",
|
|
38
|
+
"description": "Usar tu actividad para personalizar lo que ves."
|
|
39
|
+
},
|
|
40
|
+
"partners": {
|
|
41
|
+
"label": "Compartir con socios",
|
|
42
|
+
"description": "Compartir tus datos con socios seleccionados para su propio marketing."
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"trackers": {
|
|
46
|
+
"analytics": {
|
|
47
|
+
"label": "Cookies analíticas",
|
|
48
|
+
"description": "Cookies que nos ayudan a entender cómo se usa el producto."
|
|
49
|
+
},
|
|
50
|
+
"advertising": {
|
|
51
|
+
"label": "Cookies publicitarias",
|
|
52
|
+
"description": "Cookies usadas para medir y personalizar anuncios."
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"link": {
|
|
57
|
+
"default": "Más información"
|
|
58
|
+
},
|
|
59
|
+
"errors": {
|
|
60
|
+
"unknown": "Consentimiento desconocido: {{key}}"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"group": {
|
|
3
|
+
"communications": {
|
|
4
|
+
"title": "Communications",
|
|
5
|
+
"description": "Comment nous vous contactons."
|
|
6
|
+
},
|
|
7
|
+
"data": {
|
|
8
|
+
"title": "Utilisation des données",
|
|
9
|
+
"description": "Comment vos données sont utilisées et partagées."
|
|
10
|
+
},
|
|
11
|
+
"trackers": {
|
|
12
|
+
"title": "Traceurs",
|
|
13
|
+
"description": "Technologies d'analyse et de publicité."
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"consent": {
|
|
17
|
+
"marketing": {
|
|
18
|
+
"email": {
|
|
19
|
+
"label": "Offres et actualités par email",
|
|
20
|
+
"description": "Actualités produit, offres et mises à jour par email."
|
|
21
|
+
},
|
|
22
|
+
"sms": {
|
|
23
|
+
"label": "Messages SMS",
|
|
24
|
+
"description": "Offres et mises à jour par message texte."
|
|
25
|
+
},
|
|
26
|
+
"phone": {
|
|
27
|
+
"label": "Appels téléphoniques",
|
|
28
|
+
"description": "Offres et mises à jour par appel téléphonique."
|
|
29
|
+
},
|
|
30
|
+
"push": {
|
|
31
|
+
"label": "Notifications push",
|
|
32
|
+
"description": "Offres et mises à jour sous forme de notifications push."
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"data": {
|
|
36
|
+
"profiling": {
|
|
37
|
+
"label": "Personnalisation",
|
|
38
|
+
"description": "Utiliser votre activité pour personnaliser ce que vous voyez."
|
|
39
|
+
},
|
|
40
|
+
"partners": {
|
|
41
|
+
"label": "Partage avec des partenaires",
|
|
42
|
+
"description": "Partage de vos données avec des partenaires sélectionnés pour leur propre marketing."
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"trackers": {
|
|
46
|
+
"analytics": {
|
|
47
|
+
"label": "Cookies analytiques",
|
|
48
|
+
"description": "Cookies qui nous aident à comprendre comment le produit est utilisé."
|
|
49
|
+
},
|
|
50
|
+
"advertising": {
|
|
51
|
+
"label": "Cookies publicitaires",
|
|
52
|
+
"description": "Cookies utilisés pour mesurer et personnaliser les publicités."
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"link": {
|
|
57
|
+
"default": "En savoir plus"
|
|
58
|
+
},
|
|
59
|
+
"errors": {
|
|
60
|
+
"unknown": "Consentement inconnu : {{key}}"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"group": {
|
|
3
|
+
"communications": {
|
|
4
|
+
"title": "Komunikacja",
|
|
5
|
+
"description": "Jak się z Tobą kontaktujemy."
|
|
6
|
+
},
|
|
7
|
+
"data": {
|
|
8
|
+
"title": "Wykorzystanie danych",
|
|
9
|
+
"description": "Jak Twoje dane są wykorzystywane i udostępniane."
|
|
10
|
+
},
|
|
11
|
+
"trackers": {
|
|
12
|
+
"title": "Narzędzia śledzące",
|
|
13
|
+
"description": "Technologie analityczne i reklamowe."
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"consent": {
|
|
17
|
+
"marketing": {
|
|
18
|
+
"email": {
|
|
19
|
+
"label": "Oferty i aktualności e-mail",
|
|
20
|
+
"description": "Nowości o produkcie, oferty i aktualności e-mailem."
|
|
21
|
+
},
|
|
22
|
+
"sms": {
|
|
23
|
+
"label": "Wiadomości SMS",
|
|
24
|
+
"description": "Oferty i aktualności w wiadomościach tekstowych."
|
|
25
|
+
},
|
|
26
|
+
"phone": {
|
|
27
|
+
"label": "Połączenia telefoniczne",
|
|
28
|
+
"description": "Oferty i aktualności podczas rozmowy telefonicznej."
|
|
29
|
+
},
|
|
30
|
+
"push": {
|
|
31
|
+
"label": "Powiadomienia push",
|
|
32
|
+
"description": "Oferty i aktualności w formie powiadomień push."
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"data": {
|
|
36
|
+
"profiling": {
|
|
37
|
+
"label": "Personalizacja",
|
|
38
|
+
"description": "Wykorzystanie Twojej aktywności do personalizacji tego, co widzisz."
|
|
39
|
+
},
|
|
40
|
+
"partners": {
|
|
41
|
+
"label": "Udostępnianie partnerom",
|
|
42
|
+
"description": "Udostępnianie Twoich danych wybranym partnerom do ich własnych celów marketingowych."
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"trackers": {
|
|
46
|
+
"analytics": {
|
|
47
|
+
"label": "Pliki cookie analityczne",
|
|
48
|
+
"description": "Pliki cookie pomagające zrozumieć, jak korzysta się z produktu."
|
|
49
|
+
},
|
|
50
|
+
"advertising": {
|
|
51
|
+
"label": "Pliki cookie reklamowe",
|
|
52
|
+
"description": "Pliki cookie służące do mierzenia i personalizowania reklam."
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"link": {
|
|
57
|
+
"default": "Dowiedz się więcej"
|
|
58
|
+
},
|
|
59
|
+
"errors": {
|
|
60
|
+
"unknown": "Nieznana zgoda: {{key}}"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"group": {
|
|
3
|
+
"communications": {
|
|
4
|
+
"title": "Коммуникации",
|
|
5
|
+
"description": "Как мы с вами связываемся."
|
|
6
|
+
},
|
|
7
|
+
"data": {
|
|
8
|
+
"title": "Использование данных",
|
|
9
|
+
"description": "Как используются и передаются ваши данные."
|
|
10
|
+
},
|
|
11
|
+
"trackers": {
|
|
12
|
+
"title": "Трекеры",
|
|
13
|
+
"description": "Аналитические и рекламные технологии."
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"consent": {
|
|
17
|
+
"marketing": {
|
|
18
|
+
"email": {
|
|
19
|
+
"label": "Предложения и новости по email",
|
|
20
|
+
"description": "Новости о продукте, предложения и обновления по электронной почте."
|
|
21
|
+
},
|
|
22
|
+
"sms": {
|
|
23
|
+
"label": "SMS-сообщения",
|
|
24
|
+
"description": "Предложения и обновления в виде текстовых сообщений."
|
|
25
|
+
},
|
|
26
|
+
"phone": {
|
|
27
|
+
"label": "Телефонные звонки",
|
|
28
|
+
"description": "Предложения и обновления по телефону."
|
|
29
|
+
},
|
|
30
|
+
"push": {
|
|
31
|
+
"label": "Push-уведомления",
|
|
32
|
+
"description": "Предложения и обновления в виде push-уведомлений."
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"data": {
|
|
36
|
+
"profiling": {
|
|
37
|
+
"label": "Персонализация",
|
|
38
|
+
"description": "Использование вашей активности для персонализации того, что вы видите."
|
|
39
|
+
},
|
|
40
|
+
"partners": {
|
|
41
|
+
"label": "Передача партнёрам",
|
|
42
|
+
"description": "Передача ваших данных отдельным партнёрам для их собственного маркетинга."
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"trackers": {
|
|
46
|
+
"analytics": {
|
|
47
|
+
"label": "Аналитические cookie",
|
|
48
|
+
"description": "Cookie, помогающие понять, как используется продукт."
|
|
49
|
+
},
|
|
50
|
+
"advertising": {
|
|
51
|
+
"label": "Рекламные cookie",
|
|
52
|
+
"description": "Cookie, используемые для измерения и персонализации рекламы."
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"link": {
|
|
57
|
+
"default": "Подробнее"
|
|
58
|
+
},
|
|
59
|
+
"errors": {
|
|
60
|
+
"unknown": "Неизвестное согласие: {{key}}"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"group": {
|
|
3
|
+
"communications": {
|
|
4
|
+
"title": "Комунікації",
|
|
5
|
+
"description": "Як ми з вами зв'язуємося."
|
|
6
|
+
},
|
|
7
|
+
"data": {
|
|
8
|
+
"title": "Використання даних",
|
|
9
|
+
"description": "Як використовуються та передаються ваші дані."
|
|
10
|
+
},
|
|
11
|
+
"trackers": {
|
|
12
|
+
"title": "Трекери",
|
|
13
|
+
"description": "Аналітичні та рекламні технології."
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"consent": {
|
|
17
|
+
"marketing": {
|
|
18
|
+
"email": {
|
|
19
|
+
"label": "Пропозиції та новини на email",
|
|
20
|
+
"description": "Новини про продукт, пропозиції та оновлення електронною поштою."
|
|
21
|
+
},
|
|
22
|
+
"sms": {
|
|
23
|
+
"label": "SMS-повідомлення",
|
|
24
|
+
"description": "Пропозиції та оновлення у вигляді текстових повідомлень."
|
|
25
|
+
},
|
|
26
|
+
"phone": {
|
|
27
|
+
"label": "Телефонні дзвінки",
|
|
28
|
+
"description": "Пропозиції та оновлення телефоном."
|
|
29
|
+
},
|
|
30
|
+
"push": {
|
|
31
|
+
"label": "Push-сповіщення",
|
|
32
|
+
"description": "Пропозиції та оновлення у вигляді push-сповіщень."
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"data": {
|
|
36
|
+
"profiling": {
|
|
37
|
+
"label": "Персоналізація",
|
|
38
|
+
"description": "Використання вашої активності для персоналізації того, що ви бачите."
|
|
39
|
+
},
|
|
40
|
+
"partners": {
|
|
41
|
+
"label": "Передача партнерам",
|
|
42
|
+
"description": "Передача ваших даних обраним партнерам для їхнього власного маркетингу."
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"trackers": {
|
|
46
|
+
"analytics": {
|
|
47
|
+
"label": "Аналітичні cookie",
|
|
48
|
+
"description": "Cookie, які допомагають зрозуміти, як використовується продукт."
|
|
49
|
+
},
|
|
50
|
+
"advertising": {
|
|
51
|
+
"label": "Рекламні cookie",
|
|
52
|
+
"description": "Cookie, які використовуються для вимірювання та персоналізації реклами."
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"link": {
|
|
57
|
+
"default": "Дізнатися більше"
|
|
58
|
+
},
|
|
59
|
+
"errors": {
|
|
60
|
+
"unknown": "Невідома згода: {{key}}"
|
|
61
|
+
}
|
|
62
|
+
}
|
package/build/i18n.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":""}
|
package/build/i18n.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { addI18nLib } from '@owlmeans/i18n';
|
|
2
|
+
import { MARKETING_CONSENT_I18N } from './consts.js';
|
|
3
|
+
import en from './i18n/en.json' with { type: 'json' };
|
|
4
|
+
import pl from './i18n/pl.json' with { type: 'json' };
|
|
5
|
+
import ru from './i18n/ru.json' with { type: 'json' };
|
|
6
|
+
import be from './i18n/be.json' with { type: 'json' };
|
|
7
|
+
import uk from './i18n/uk.json' with { type: 'json' };
|
|
8
|
+
import es from './i18n/es.json' with { type: 'json' };
|
|
9
|
+
import de from './i18n/de.json' with { type: 'json' };
|
|
10
|
+
import fr from './i18n/fr.json' with { type: 'json' };
|
|
11
|
+
/**
|
|
12
|
+
* Group and consent labels under `lib:marketing-consent.*`, in the 8 languages this domain shares
|
|
13
|
+
* with `@owlmeans/consent` (`CONSENT_LOCALES` — one more than `@owlmeans/i18n`'s own
|
|
14
|
+
* `SUPPORTED_LNGS`, because the sibling cookie-consent bundle already carries `fr` and this
|
|
15
|
+
* catalogue's `trackers.*` rows describe the same cookies).
|
|
16
|
+
*/
|
|
17
|
+
const LANGUAGES = { en, pl, ru, be, uk, es, de, fr };
|
|
18
|
+
Object.entries(LANGUAGES).forEach(([lng, data]) => {
|
|
19
|
+
addI18nLib(lng, MARKETING_CONSENT_I18N, data);
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAErD;;;;;GAKG;AACH,MAAM,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAA;AAEpD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IAChD,UAAU,CAAC,GAAG,EAAE,sBAAsB,EAAE,IAAI,CAAC,CAAA;AAC/C,CAAC,CAAC,CAAA"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,mBAAmB,YAAY,CAAA"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MarketingConsentConfig, MarketingConsentDecision, MarketingConsentDefinition, MarketingConsentStatusOptions, MarketingConsentStatusView } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build the effective consent catalogue for one application: the standard 8, narrowed and
|
|
4
|
+
* reworded by `cfg.standard`, extended by `cfg.custom`, with `cfg.links` folded in.
|
|
5
|
+
*
|
|
6
|
+
* `key` and `group` are fixed identity — neither a standard override nor a custom entry moves a
|
|
7
|
+
* consent between groups or renames it; only `resolveMarketingConsents` itself decides the group
|
|
8
|
+
* a key lives under.
|
|
9
|
+
*/
|
|
10
|
+
export declare const resolveMarketingConsents: (cfg?: MarketingConsentConfig) => MarketingConsentDefinition[];
|
|
11
|
+
/**
|
|
12
|
+
* Fold a person's saved decisions against a resolved catalogue into what a consent screen shows
|
|
13
|
+
* and what should be treated as granted right now.
|
|
14
|
+
*
|
|
15
|
+
* Only the LATEST decision per key counts — `decisions` may carry a full history. A definition
|
|
16
|
+
* with no saved decision is `'new'`; one whose saved `revisedAt`/`mode` no longer match the
|
|
17
|
+
* definition is `'revised'` (the wording or the opt-in/opt-out shape changed under the person);
|
|
18
|
+
* otherwise it is `'current'`.
|
|
19
|
+
*/
|
|
20
|
+
export declare const consentStatus: (defs: MarketingConsentDefinition[], decisions: MarketingConsentDecision[], opts?: MarketingConsentStatusOptions) => MarketingConsentStatusView;
|
|
21
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EAAE,wBAAwB,EAAE,0BAA0B,EAChD,6BAA6B,EAAE,0BAA0B,EACtF,MAAM,YAAY,CAAA;AAEnB;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,SAAU,sBAAsB,KAAG,0BAA0B,EA+CjG,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,SAClB,0BAA0B,EAAE,aACvB,wBAAwB,EAAE,SAC9B,6BAA6B,KACnC,0BAwCF,CAAA"}
|
package/build/resolve.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { STANDARD_MARKETING_CONSENTS, STANDARD_REVISION } from './consts.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build the effective consent catalogue for one application: the standard 8, narrowed and
|
|
4
|
+
* reworded by `cfg.standard`, extended by `cfg.custom`, with `cfg.links` folded in.
|
|
5
|
+
*
|
|
6
|
+
* `key` and `group` are fixed identity — neither a standard override nor a custom entry moves a
|
|
7
|
+
* consent between groups or renames it; only `resolveMarketingConsents` itself decides the group
|
|
8
|
+
* a key lives under.
|
|
9
|
+
*/
|
|
10
|
+
export const resolveMarketingConsents = (cfg) => {
|
|
11
|
+
const revisedAt = cfg?.revisedAt ?? STANDARD_REVISION;
|
|
12
|
+
const byKey = new Map();
|
|
13
|
+
STANDARD_MARKETING_CONSENTS.forEach(definition => {
|
|
14
|
+
const override = cfg?.standard?.[definition.key];
|
|
15
|
+
if (override === false) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
byKey.set(definition.key, override == null
|
|
19
|
+
? { ...definition }
|
|
20
|
+
: { ...definition, ...override, key: definition.key, group: definition.group });
|
|
21
|
+
});
|
|
22
|
+
cfg?.custom?.forEach(entry => {
|
|
23
|
+
const existing = byKey.get(entry.key);
|
|
24
|
+
const base = existing ?? {
|
|
25
|
+
key: entry.key,
|
|
26
|
+
group: entry.group,
|
|
27
|
+
mode: 'opt-in',
|
|
28
|
+
enabled: true,
|
|
29
|
+
revisedAt,
|
|
30
|
+
};
|
|
31
|
+
byKey.set(entry.key, { ...base, ...entry });
|
|
32
|
+
});
|
|
33
|
+
if (cfg?.links != null) {
|
|
34
|
+
Object.entries(cfg.links).forEach(([key, links]) => {
|
|
35
|
+
const definition = byKey.get(key);
|
|
36
|
+
if (definition == null || links.length === 0) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const seen = new Set();
|
|
40
|
+
const merged = [...(definition.links ?? []), ...links].filter(link => {
|
|
41
|
+
if (seen.has(link.href)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
seen.add(link.href);
|
|
45
|
+
return true;
|
|
46
|
+
});
|
|
47
|
+
byKey.set(key, { ...definition, links: merged });
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return Array.from(byKey.values())
|
|
51
|
+
.filter(definition => definition.enabled !== false)
|
|
52
|
+
.sort((a, b) => (a.order ?? 1000) - (b.order ?? 1000));
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Fold a person's saved decisions against a resolved catalogue into what a consent screen shows
|
|
56
|
+
* and what should be treated as granted right now.
|
|
57
|
+
*
|
|
58
|
+
* Only the LATEST decision per key counts — `decisions` may carry a full history. A definition
|
|
59
|
+
* with no saved decision is `'new'`; one whose saved `revisedAt`/`mode` no longer match the
|
|
60
|
+
* definition is `'revised'` (the wording or the opt-in/opt-out shape changed under the person);
|
|
61
|
+
* otherwise it is `'current'`.
|
|
62
|
+
*/
|
|
63
|
+
export const consentStatus = (defs, decisions, opts) => {
|
|
64
|
+
const latestByKey = new Map();
|
|
65
|
+
decisions.forEach(decision => {
|
|
66
|
+
const current = latestByKey.get(decision.key);
|
|
67
|
+
if (current == null || decision.decidedAt > current.decidedAt) {
|
|
68
|
+
latestByKey.set(decision.key, decision);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
const hasHistory = decisions.length > 0;
|
|
72
|
+
const gpc = opts?.gpc ?? false;
|
|
73
|
+
const items = defs.map(definition => {
|
|
74
|
+
const saved = latestByKey.get(definition.key);
|
|
75
|
+
const suppressedByGpc = definition.honorGpc === true && gpc;
|
|
76
|
+
if (saved == null) {
|
|
77
|
+
const granted = definition.mode === 'opt-out' && !suppressedByGpc;
|
|
78
|
+
return { definition, status: 'new', granted, updated: hasHistory };
|
|
79
|
+
}
|
|
80
|
+
const revised = saved.revisedAt !== definition.revisedAt || saved.mode !== definition.mode;
|
|
81
|
+
if (!revised) {
|
|
82
|
+
return { definition, status: 'current', granted: saved.granted, updated: false, saved };
|
|
83
|
+
}
|
|
84
|
+
const granted = definition.mode === 'opt-in' ? false : (suppressedByGpc ? false : saved.granted);
|
|
85
|
+
return { definition, status: 'revised', granted, updated: true, saved };
|
|
86
|
+
});
|
|
87
|
+
const view = {
|
|
88
|
+
pending: items.some(item => item.status !== 'current'),
|
|
89
|
+
items,
|
|
90
|
+
};
|
|
91
|
+
if (opts?.termsAcceptedAt != null) {
|
|
92
|
+
view.terms = { version: opts.termsVersion ?? '', acceptedAt: opts.termsAcceptedAt };
|
|
93
|
+
}
|
|
94
|
+
return view;
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { JSONSchemaType } from 'ajv';
|
|
2
|
+
import type { SaveMarketingConsentRequest, TermsAcceptance } from './types.js';
|
|
3
|
+
export declare const SaveMarketingConsentSchema: JSONSchemaType<SaveMarketingConsentRequest>;
|
|
4
|
+
export declare const TermsAcceptanceSchema: JSONSchemaType<TermsAcceptance>;
|
|
5
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAA;AACzC,OAAO,KAAK,EAAE,2BAA2B,EAAE,eAAe,EAAoB,MAAM,YAAY,CAAA;AAahG,eAAO,MAAM,0BAA0B,EAAE,cAAc,CAAC,2BAA2B,CAuBlF,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,eAAe,CAUjE,CAAA"}
|
package/build/schemas.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const TermsDocumentRefSchema = {
|
|
2
|
+
type: 'object',
|
|
3
|
+
properties: {
|
|
4
|
+
key: { type: 'string', minLength: 1, maxLength: 128 },
|
|
5
|
+
href: { type: 'string', minLength: 1, maxLength: 2048 },
|
|
6
|
+
revisedAt: { type: 'string', nullable: true },
|
|
7
|
+
},
|
|
8
|
+
required: ['key', 'href'],
|
|
9
|
+
additionalProperties: false,
|
|
10
|
+
};
|
|
11
|
+
export const SaveMarketingConsentSchema = {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
decisions: {
|
|
15
|
+
type: 'array',
|
|
16
|
+
minItems: 1,
|
|
17
|
+
maxItems: 64,
|
|
18
|
+
items: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {
|
|
21
|
+
key: { type: 'string', pattern: '^[a-z][a-z0-9]*(\\.[a-z][a-z0-9-]*)*$', maxLength: 64 },
|
|
22
|
+
granted: { type: 'boolean' },
|
|
23
|
+
},
|
|
24
|
+
required: ['key', 'granted'],
|
|
25
|
+
additionalProperties: false,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
source: { type: 'string', enum: ['sign-in', 'settings', 'cookie'] },
|
|
29
|
+
locale: { type: 'string', maxLength: 16, nullable: true },
|
|
30
|
+
gpc: { type: 'boolean', nullable: true },
|
|
31
|
+
},
|
|
32
|
+
required: ['decisions', 'source'],
|
|
33
|
+
additionalProperties: false,
|
|
34
|
+
};
|
|
35
|
+
export const TermsAcceptanceSchema = {
|
|
36
|
+
type: 'object',
|
|
37
|
+
properties: {
|
|
38
|
+
documents: { type: 'array', minItems: 0, maxItems: 16, items: TermsDocumentRefSchema },
|
|
39
|
+
notices: { type: 'array', minItems: 0, maxItems: 16, items: TermsDocumentRefSchema, nullable: true },
|
|
40
|
+
version: { type: 'string', minLength: 1, maxLength: 128 },
|
|
41
|
+
locale: { type: 'string', nullable: true },
|
|
42
|
+
},
|
|
43
|
+
required: ['documents', 'version'],
|
|
44
|
+
additionalProperties: false,
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAGA,MAAM,sBAAsB,GAAqC;IAC/D,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;QACrD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;QACvD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC9C;IACD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,KAAK;CAC5B,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAgD;IACrF,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,SAAS,EAAE;YACT,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,uCAAuC,EAAE,SAAS,EAAE,EAAE,EAAE;oBACxF,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;iBAC7B;gBACD,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;gBAC5B,oBAAoB,EAAE,KAAK;aAC5B;SACF;QACD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE;QACnE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzD,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;KACzC;IACD,QAAQ,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;IACjC,oBAAoB,EAAE,KAAK;CAC5B,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAoC;IACpE,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE;QACtF,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE;QACpG,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC3C;IACD,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;IAClC,oBAAoB,EAAE,KAAK;CAC5B,CAAA"}
|