diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..32b59c5
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,10 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_style = tab
+indent_size = 4
+insert_final_newline = true
+tab_width = 4
+trim_trailing_whitespace = true
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1f49262
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+.idea/
+.vscode/
+docs/
+tmp/
+node_modules/
+
+.brackets.json
+*.log
+*.env
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..a7feb76
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,10 @@
+**/tsconfig.json
+**/nodemon.json
+**/tslint.json
+**/*.config.js
+.editorconfig
+src
+demo
+example
+docs
+*.png
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000..4044f90
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+12.0.0
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..42e0b81
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Voltra
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index 464457d..85d59b5 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,242 @@
# html-gdpr-guard
-Vanilla JavaScript binding to gdpr-guard as efficiently and easily as possible, based on data provided in the DOM
+
+> Vanilla JavaScript binding to gdpr-guard as efficiently and easily as possible, based on data provided in the DOM
+
+
+
+You can have a look at the [demo](https://voltra.github.io/html-gdpr-guard) to see it in action and inspect the DOM.
+
+## Install
+
+Via NPM: `npm i -S html-gdpr-guard`
+
+Via Yarn: `yarn add html-gdpr-guard`
+
+As a 3rd-party script tag:
+```html
+
+```
+
+## Use
+
+Using modules:
+```javascript
+import {
+ restoreHtmlGdprManager,
+ //
+ HtmlGdprGuardError,
+ NoManagerDefinitionError,
+ NoNameError,
+ NoCheckboxError,
+} from "html-gdpr-guard"
+```
+
+Using commonjs:
+```javascript
+const {
+ restoreHtmlGdprManager,
+ //
+ HtmlGdprGuardError,
+ NoManagerDefinitionError,
+ NoNameError,
+ NoCheckboxError,
+} = require("html-gdpr-guard");
+```
+
+In the browser:
+```javascript
+const {
+ restoreHtmlGdprManager,
+ //
+ HtmlGdprGuardError,
+ NoManagerDefinitionError,
+ NoNameError,
+ NoCheckboxError,
+} = htmlGdprGuard;
+```
+
+## Restore your manager instance
+
+To restore your manager instance, you will need an instance of [`GdprSavior`](https://www.ludwig-guerin.fr/gdpr-guard/interfaces/serde_GdprSavior.GdprSavior.html).
+The simplest one is [gdpr-guard-local](https://www.npmjs.com/package/gdpr-guard-local) which relies on local storage.
+
+The simplest way to restore your manager is to let the library do everything:
+```javascript
+const gdprSavior = getMyGdprSavior();
+const manager = await restoreHtmlGdprManager(gdprSavior);
+```
+
+If it fails, it will throw an instance of `HtmlGdprGuardError` which can be one of the following:
+* `NoManagerDefinitionError`
+* `NoNameError`
+* `NoCheckboxError`
+
+## Create your DOM structure
+
+### A guard's data
+
+#### Guard name (mandatory)
+
+A guard's data is scoped within the root element that is marked using the `data-gdpr-guard` attribute.
+That attribute can contain the name of your guard, otherwise the first element that has a `data-gdpr-guard-name`
+will be used to retrieve the guard's name. **It is mandatory**
+
+#### Guard description (optional)
+
+The guard's description can be added via a `data-gdpr-guard-description` with a value on the root element, or
+you can tag an element with `data-gdpr-guard-description` whose `textContent` will be treated as its description.
+**It is optional**
+
+It will default to an empty string. Note that if the description is the attribute's value it won't be shown to the user.
+
+#### Guard storage (optional)
+
+The guard's storage can be added via a `data-gdpr-guard-storage` attribute whose value should be the key in the [`GdprStorage`](https://www.ludwig-guerin.fr/gdpr-guard/enums/GdprStorage.GdprStorage-1.html) enum. **It is optional**
+
+#### Guard checkbox (mandatory)
+
+The checkbox that controls the guard is resolved (among the guard's children) in the following order based on the guard's name:
+* checkbox whose ID is the guard's name
+* checkbox whose `name` attribute is the guard's name
+* first checkbox marked with the `data-gdpr-checkbox` attribute
+
+#### Guard's required status (optional)
+
+To mark the guard as required you can:
+* Add the `gdpr-guard-required` attribute on the guard's root element
+* Add the `required` attribute on the guard's checkbox
+
+Note that, just like the way `gdpr-guard` handles required guards, if a parent is required
+then all of its children will be as well.
+
+You don't *have* to make your checkbox required and disabled, it will be all synced up as the guard is parsed.
+
+## A group's data
+
+A group behaves exactly like a guard, except that its root is marked using `data-gdpr-group` instead of `data-gdpr-guard`.
+
+### The manager's data
+
+The manager behaves a little bit like a guard, but has specific attributes:
+
+* `data-gdpr` is used to find the root of your manager, unless you provide it in `restoreHtmlGdprManager`'s options. Its value is treated as the manager's name. You don't have to give it a value. You can skip it altogether.
+* `data-gdpr-manager` that can be used to store the name of the manager if you didn't provide a value to the `data-gdpr` attribute (or the attribute itself)
+
+## Customize the restoration process
+
+You can pass a set of options as the second argument of `restoreHtmlGdprManager`. Let's inspect them one by one.
+
+### `gdprEl` HTMLElement
+
+The html element that will serve as root of the manager's definitions. By default, it will use `document.querySelector("[data-gdpr]")`.
+
+If the manager can't be found, it'll throw a `NoManagerDefinitionError`.
+
+### `autoCloseBanner` bool
+
+Whether the banner should be automatically closed once the manager has been restored if the consent banner has already been shown.
+
+### `bindEventHandlersHook` function
+
+A callback that can be used to attach event listeners to the manager's [`GdprManagerEventHub`](https://www.ludwig-guerin.fr/gdpr-guard/classes/GdprManagerEventHub.GdprManagerEventHub-1.html).
+
+The callback's signature is the following:
+```typescript
+type BindEventsCallback = (eventsHub: GdprManagerEventHub) => void;
+```
+
+For instance:
+```javascript
+await restoreHtmlGdprManager(gdprSavior, {
+ bindEventHandlersHook(eventsHub) {
+ eventsHub.onEnable("myGuard", () => {
+ connectToWsApi();
+ });
+
+ eventsHub.onDisable("myGuard", () => {
+ disconnectFromWsApi();
+ });
+ },
+});
+```
+
+### `addGuardsBeforeHook` function
+
+A callback that can be used to add guards' definitions to the [`GdprManagerBuilder`](https://www.ludwig-guerin.fr/gdpr-guard/classes/builders_GdprManagerBuilder.GdprManagerBuilder.html) instance before the library parses data from the DOM.
+
+The callback's signature is the following:
+```typescript
+type AddGuardsCallback = (managerBuilder: GdprManagerBuilder) => void;
+```
+
+### `addGuardsAfterHook` function
+
+A callback that can be used to add guards' definitions to the [`GdprManagerBuilder`](https://www.ludwig-guerin.fr/gdpr-guard/classes/builders_GdprManagerBuilder.GdprManagerBuilder.html) instance after the library parsed data from the DOM.
+
+The callback's signature is the following:
+```typescript
+type AddGuardsCallback = (managerBuilder: GdprManagerBuilder) => void;
+```
+
+### `onDeclineAllErrorHook` function
+
+A callback that can be used to hande/capture errors when the user click on a "decline all" button.
+
+The callback's signature is the following:
+```typescript
+type StoreErrorHandler = (didStore: boolean, error?: Error) => void;
+```
+
+### `onSaveErrorHook` function
+
+A callback that can be used to hande/capture errors when the user saves their preferences.
+
+The callback's signature is the following:
+```typescript
+type StoreErrorHandler = (didStore: boolean, error?: Error) => void;
+```
+
+### `onCancelErrorHook` function
+
+A callback that can be used to hande/capture errors when the user click on a "cancel" button.
+
+The callback's signature is the following:
+```typescript
+type StoreErrorHandler = (didStore: boolean, error?: Error) => void;
+```
+
+### `onBannerClose` function
+
+A callback that can be used to execute code when the GDPR banner is closed.
+
+The callback's signature is the following:
+```typescript
+type BannerCallback = () => void;
+```
+
+For instance:
+```javascript
+await restoreHtmlGdprManager(gdprSavior, {
+ onBannerClose() {
+ hideMyGdprBanner();
+ },
+});
+```
+
+### `onBannerOpen` function
+
+A callback that can be used to execute code when the GDPR banner is closed.
+
+The callback's signature is the following:
+```typescript
+type BannerCallback = () => void;
+```
+
+For instance:
+```javascript
+await restoreHtmlGdprManager(gdprSavior, {
+ onBannerOpen() {
+ showMyGdprBanner();
+ },
+});
+```
diff --git a/dist/index.js b/dist/index.js
new file mode 100644
index 0000000..a089f6c
--- /dev/null
+++ b/dist/index.js
@@ -0,0 +1,2 @@
+!function(r,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.htmlGdprGuard=t():r.htmlGdprGuard=t()}(self,(function(){return(()=>{var r={845:r=>{self,r.exports=(()=>{"use strict";var r={315:(r,t,e)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.makeGuard=void 0;var n=e(670);t.makeGuard=function(r,t,e,o,i){return void 0===e&&(e=n.GdprStorage.Cookie),void 0===o&&(o=!1),void 0===i&&(i=null),{name:r,description:t,storage:e,required:o,enabled:null===i?o:i,enable:function(){return this.enabled||this.toggle(),this},disable:function(){return this.enabled&&this.toggle(),this},toggle:function(){return this.required||(this.enabled=!this.enabled),this},makeRequired:function(){return this.required=!0,this.enabled=!0,this},isEnabled:function(r){return this.name===r&&this.enabled},enableForStorage:function(r){return this.enabled||this.toggleForStorage(r),this},disableForStorage:function(r){return this.enabled&&this.toggleForStorage(r),this},toggleForStorage:function(r){return this.storage!=r||this.required||this.toggle(),this},raw:function(){return JSON.parse(JSON.stringify(this))}}}},822:function(r,t,e){var n=this&&this.__values||function(r){var t="function"==typeof Symbol&&Symbol.iterator,e=t&&r[t],n=0;if(e)return e.call(r);if(r&&"number"==typeof r.length)return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(r,t){var e="function"==typeof Symbol&&r[Symbol.iterator];if(!e)return r;var n,o,i=e.call(r),u=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)u.push(n.value)}catch(r){o={error:r}}finally{try{n&&!n.done&&(e=i.return)&&e.call(i)}finally{if(o)throw o.error}}return u},i=this&&this.__spreadArray||function(r,t,e){if(e||2===arguments.length)for(var n,o=0,i=t.length;o=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(r,t){var e="function"==typeof Symbol&&r[Symbol.iterator];if(!e)return r;var n,o,i=e.call(r),u=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)u.push(n.value)}catch(r){o={error:r}}finally{try{n&&!n.done&&(e=i.return)&&e.call(i)}finally{if(o)throw o.error}}return u},i=this&&this.__spreadArray||function(r,t,e){if(e||2===arguments.length)for(var n,o=0,i=t.length;o{Object.defineProperty(t,"__esModule",{value:!0}),t.GdprManagerEventHub=void 0;var e=function(){function r(){this.eventMap={}}return r.prototype.onEnable=function(r,t){return this.addListener("enable",r,t),this},r.prototype.onDisable=function(r,t){return this.addListener("disable",r,t),this},r.prototype.enable=function(r){return this.executeListeners("enable",r),this},r.prototype.disable=function(r){return this.executeListeners("disable",r),this},r.prototype.tagFor=function(r,t){return"".concat(r,"--").concat(t)},r.prototype.addListener=function(r,t,e){var n=this.tagFor(r,t);n in this.eventMap||(this.eventMap[n]=[]),this.eventMap[n].push(e)},r.prototype.executeListeners=function(r,t){var e,n=this.tagFor(r,t);null===(e=this.eventMap[n])||void 0===e||e.forEach((function(r){return r()}))},r}();t.GdprManagerEventHub=e},670:(r,t)=>{var e;Object.defineProperty(t,"__esModule",{value:!0}),t.GdprStorage=void 0,function(r){r[r.None=1]="None",r[r.Cookie=2]="Cookie",r[r.LocalStorage=4]="LocalStorage",r[r.SessionStorage=8]="SessionStorage",r[r.IndexedDb=16]="IndexedDb",r[r.FileSystem=16]="FileSystem",r[r.ServerStorage=16]="ServerStorage",r[r.All=30]="All"}(e||(e={})),t.GdprStorage=e},860:function(r,t,e){var n,o=this&&this.__extends||(n=function(r,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,t){r.__proto__=t}||function(r,t){for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&(r[e]=t[e])},n(r,t)},function(r,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function e(){this.constructor=r}n(r,t),r.prototype=null===t?Object.create(t):(e.prototype=t.prototype,new e)}),i=this&&this.__read||function(r,t){var e="function"==typeof Symbol&&r[Symbol.iterator];if(!e)return r;var n,o,i=e.call(r),u=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)u.push(n.value)}catch(r){o={error:r}}finally{try{n&&!n.done&&(e=i.return)&&e.call(i)}finally{if(o)throw o.error}}return u},u=this&&this.__spreadArray||function(r,t,e){if(e||2===arguments.length)for(var n,o=0,i=t.length;o{Object.defineProperty(t,"__esModule",{value:!0}),t.GdprGuardBuilder=void 0;var n=e(670),o=e(315),i=function(){function r(r,t,e,n){this.parent=r,this.storage=t,this.enable=e,this.require=n,this.name="",this.description="",n&&(this.enable=!0)}return r.create=function(t,e,o,i){return void 0===e&&(e=n.GdprStorage.Cookie),void 0===o&&(o=!1),void 0===i&&(i=!1),new r(t,e,o,i)},r.prototype.endGuard=function(){var r=this.require||this.enable,t=(0,o.makeGuard)(this.name,this.description,this.storage,this.require,r);return this.require&&t.makeRequired(),this.parent.guards.push(t),this.parent},r.prototype.withName=function(r){return this.edit((function(t){return t.name=r}))},r.prototype.withDescription=function(r){return this.edit((function(t){return t.description=r}))},r.prototype.enabled=function(){return this.edit((function(r){return r.enable=!0}))},r.prototype.disabled=function(){return this.edit((function(r){return r.enable=!1}))},r.prototype.storedIn=function(r){return this.edit((function(t){return t.storage=r}))},r.prototype.required=function(){return this.edit((function(r){return r.require=!0}))},r.prototype.edit=function(r){return r(this),this},r}();t.GdprGuardBuilder=i},237:(r,t,e)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GdprManagerBuilder=void 0;var n=e(670),o=e(777),i=e(171),u=function(){function r(){this.storage=n.GdprStorage.Cookie,this.groups=[],this.bannerWasShown=!1}return r.make=function(){return new r},r.prototype.withBannerShown=function(r){void 0===r&&(r=!0),this.bannerWasShown=r},r.prototype.startGroup=function(r,t,e,n){return void 0===r&&(r=null),void 0===t&&(t=""),void 0===e&&(e=""),void 0===n&&(n=!0),i.GdprGroupBuilder.create(this,t,e,r,n,!1)},r.prototype.startRequiredGroup=function(r,t,e){return void 0===r&&(r=null),void 0===t&&(t=""),void 0===e&&(e=""),this.startEnabledGroup(r,t,e).required()},r.prototype.startEnabledGroup=function(r,t,e){return void 0===r&&(r=null),void 0===t&&(t=""),void 0===e&&(e=""),this.startGroup(r,t,e,!0).enabled()},r.prototype.startDisabledGroup=function(r,t,e){return void 0===r&&(r=null),void 0===t&&(t=""),void 0===e&&(e=""),this.startGroup(r,t,e,!1).disabled()},r.prototype.build=function(){var r=o.GdprManager.create(this.groups);return r.bannerWasShown=this.bannerWasShown,r},r.prototype.endGroup=function(){return this},r}();t.GdprManagerBuilder=u},171:function(r,t,e){var n=this&&this.__createBinding||(Object.create?function(r,t,e,n){void 0===n&&(n=e);var o=Object.getOwnPropertyDescriptor(t,e);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[e]}}),Object.defineProperty(r,n,o)}:function(r,t,e,n){void 0===n&&(n=e),r[n]=t[e]}),o=this&&this.__exportStar||function(r,t){for(var e in r)"default"===e||Object.prototype.hasOwnProperty.call(t,e)||n(t,r,e)};Object.defineProperty(t,"__esModule",{value:!0}),o(e(890),t),o(e(237),t),o(e(860),t)},93:function(r,t,e){var n=this&&this.__createBinding||(Object.create?function(r,t,e,n){void 0===n&&(n=e);var o=Object.getOwnPropertyDescriptor(t,e);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[e]}}),Object.defineProperty(r,n,o)}:function(r,t,e,n){void 0===n&&(n=e),r[n]=t[e]}),o=this&&this.__exportStar||function(r,t){for(var e in r)"default"===e||Object.prototype.hasOwnProperty.call(t,e)||n(t,r,e)};Object.defineProperty(t,"__esModule",{value:!0}),o(e(315),t),o(e(822),t),o(e(777),t),o(e(670),t),o(e(779),t),o(e(171),t),o(e(562),t),o(e(344),t)},562:(r,t,e)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GdprDeserializer=void 0;var n=e(777),o=e(670),i=e(822),u=e(315),a=function(){function r(){}return r.manager=function(r){var t=this;if(!["enabled","groups"].every((function(t){return t in r}))||"boolean"!=typeof r.enabled||!Array.isArray(r.groups))return null;var e=r.groups.map((function(r){return t.group(r)})).filter((function(r){return null!==r})),o=n.GdprManager.create([]);return o.enabled=!!r.enabled,o.bannerWasShown=!!r.bannerWasShown,e.length?(e.forEach((function(r){return o.addGroup(r)})),o):null},r.group=function(r){var t=this,e=this.guard(r);if(null===e)return null;var n=["guards"];if(!n.every((function(t){return t in r}))||!Array.isArray(r.guards))return null;var o=i.GdprGuardGroup.for(e.name,e.description,e.enabled,e.required),u=r.guards.map((function(r){return n.every((function(t){return t in r}))?t.group(r):t.guard(r)})).filter((function(r){return null!==r}));return u.length?(u.forEach((function(r){return o.addGuard(r)})),o):null},r.guard=function(r){return["name","enabled","required","description","storage"].every((function(t){return t in r}))&&"string"==typeof r.name&&"boolean"==typeof r.enabled&&"boolean"==typeof r.required&&"string"==typeof r.description&&"number"==typeof r.storage&&r.storage in o.GdprStorage?(0,u.makeGuard)(r.name,r.description,r.storage,!!r.required,!!r.enabled):null},r}();t.GdprDeserializer=a},344:function(r,t){var e=this&&this.__awaiter||function(r,t,e,n){return new(e||(e=Promise))((function(o,i){function u(r){try{c(n.next(r))}catch(r){i(r)}}function a(r){try{c(n.throw(r))}catch(r){i(r)}}function c(r){var t;r.done?o(r.value):(t=r.value,t instanceof e?t:new e((function(r){r(t)}))).then(u,a)}c((n=n.apply(r,t||[])).next())}))},n=this&&this.__generator||function(r,t){var e,n,o,i,u={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(e)throw new TypeError("Generator is already executing.");for(;u;)try{if(e=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return u.label++,{value:i[1],done:!1};case 5:u.label++,n=i[1],i=[0];continue;case 7:i=u.ops.pop(),u.trys.pop();continue;default:if(!((o=(o=u.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]{Object.defineProperty(t,"__esModule",{value:!0}),t.visitGdpr=void 0;var n=e(777),o=e(822);t.visitGdpr=function(r,e){var i=void 0===e?{}:e,u=i.onManager,a=void 0===u?function(){}:u,c=i.onGroup,s=void 0===c?function(){}:c,l=i.onGuard,d=void 0===l?function(){}:l,f=i.onEach,p=void 0===f?function(){}:f,h={onManager:a,onGroup:s,onGuard:d,onEach:p};r instanceof n.GdprManager?(a(r),p(r),r.getGroups().forEach((function(r){return(0,t.visitGdpr)(r,h)}))):r instanceof o.GdprGuardGroup?(s(r),p(r),r.getGuards().forEach((function(r){return(0,t.visitGdpr)(r,h)}))):(d(r),p(r))}}},t={};return function e(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return r[n].call(i.exports,i,i.exports,e),i.exports}(93)})()}},t={};function e(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return r[n](i,i.exports,e),i.exports}e.d=(r,t)=>{for(var n in t)e.o(t,n)&&!e.o(r,n)&&Object.defineProperty(r,n,{enumerable:!0,get:t[n]})},e.o=(r,t)=>Object.prototype.hasOwnProperty.call(r,t),e.r=r=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})};var n={};return(()=>{"use strict";e.r(n),e.d(n,{HtmlGdprGuardError:()=>o,NoCheckboxError:()=>d,NoManagerDefinitionError:()=>u,NoNameError:()=>s,restoreHtmlGdprManager:()=>O});var r,t=(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,t){r.__proto__=t}||function(r,t){for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&(r[e]=t[e])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=function(r){function e(t){return r.call(this,t)||this}return t(e,r),e}(Error),i=function(){var r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,t){r.__proto__=t}||function(r,t){for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&(r[e]=t[e])},r(t,e)};return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}}(),u=function(r){function t(e){return void 0===e&&(e=t.defaultMessage),r.call(this,e)||this}return i(t,r),t.defaultMessage="No definition found for the GDPR manager",t}(o),a=e(845),c=function(){var r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,t){r.__proto__=t}||function(r,t){for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&(r[e]=t[e])},r(t,e)};return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}}(),s=function(r){function t(e){return void 0===e&&(e=t.defaultMessage),r.call(this,e)||this}return c(t,r),t.defaultMessage="Guard definition is missing the guard's name",t}(o),l=function(){var r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,t){r.__proto__=t}||function(r,t){for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&(r[e]=t[e])},r(t,e)};return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}}(),d=function(r){function t(e){return void 0===e&&(e=t.defaultMessage),r.call(this,e)||this}return l(t,r),t.defaultMessage="No checkbox found for that guard",t}(o),f=function(r){return!!r&&!/^\s*$/.test(r)},p=function(r,t,e){void 0===e&&(e="gdpr-guard-name");var n=r.dataset[function(r){return r.replace(/-(\w)/g,(function(r,t){return t.toUpperCase()}))}(t)];if(f(n))return n.trim();var o,i,u=(o=r,i="[data-".concat(e,"]"),function(r,t){for(var e=0;e=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}(i),a=u.next();!a.done;a=u.next()){var c=(0,a.value)();if(null===(o=null==c?void 0:c.matches)||void 0===o?void 0:o.call(c,"input[type='checkbox']"))return c}}catch(r){e={error:r}}finally{try{a&&!a.done&&(n=u.return)&&n.call(u)}finally{if(e)throw e.error}}throw new d},v=function(r){var t;if(r.hasAttribute("data-gdpr-guard-description"))return r.dataset.gdprGuardDescription;var e=r.querySelector("[data-gdpr-guard-description]");return null!==(t=null==e?void 0:e.textContent)&&void 0!==t?t:null},y=function(r){if(r.hasAttribute("data-gdpr-guard-storage")){var t=r.dataset.gdprGuardStorage;if(t&&t in a.GdprStorage)return a.GdprStorage[t]}return null},b=function(r,t){return t.required||r.hasAttribute("data-gdpr-guard-required")},g=function(r,t,e){void 0===e&&(e=!1);var n=function(){t.setAttribute("checked","checked"),t.setAttribute("disabled","disabled")},o=function(){t.setAttribute("required","required")},i=function(){r.setAttribute("data-gdpr-guard-required","")};e?(i(),n(),o()):t.required?(i(),n()):r.hasAttribute("data-gdpr-guard-required")&&(n(),o())},G=function(r,t){var e="function"==typeof Symbol&&r[Symbol.iterator];if(!e)return r;var n,o,i=e.call(r),u=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)u.push(n.value)}catch(r){o={error:r}}finally{try{n&&!n.done&&(e=i.return)&&e.call(i)}finally{if(o)throw o.error}}return u},w=function(r,t,e){if(e||2===arguments.length)for(var n,o=0,i=t.length;o0)&&!(n=i.next()).done;)u.push(n.value)}catch(r){o={error:r}}finally{try{n&&!n.done&&(e=i.return)&&e.call(i)}finally{if(o)throw o.error}}return u}(r,2),o=n[0],i=n[1],u=t.target;(null===(e=null==u?void 0:u.matches)||void 0===e?void 0:e.call(u,o))&&i.forEach((function(r){return r(t)}))}))}))}},E=function(r,t,e){document.querySelectorAll(t).forEach((function(t){var n=t.dataset.gdprOnEnable;r.hasGuard(n)?r.events.onEnable(n,(function(){var r=t.matches("script"),n=r?document.createElement("script"):t.cloneNode(!0);r&&t.getAttributeNames().forEach((function(r){var e=t.getAttribute(r);n.setAttribute(r,e)})),e(n),n.removeAttribute("data-gdpr-on-enable"),t.remove(),document.head.appendChild(n)})):t.remove()}))},x=function(r,t,e,n){return new(e||(e=Promise))((function(o,i){function u(r){try{c(n.next(r))}catch(r){i(r)}}function a(r){try{c(n.throw(r))}catch(r){i(r)}}function c(r){var t;r.done?o(r.value):(t=r.value,t instanceof e?t:new e((function(r){r(t)}))).then(u,a)}c((n=n.apply(r,t||[])).next())}))},k=function(r,t){var e,n,o,i,u={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(e)throw new TypeError("Generator is already executing.");for(;u;)try{if(e=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return u.label++,{value:i[1],done:!1};case 5:u.label++,n=i[1],i=[0];continue;case 7:i=u.ops.pop(),u.trys.pop();continue;default:if(!((o=(o=u.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]{\"use strict\";var t={315:(t,r,e)=>{Object.defineProperty(r,\"__esModule\",{value:!0}),r.makeGuard=void 0;var n=e(670);r.makeGuard=function(t,r,e,o,i){return void 0===e&&(e=n.GdprStorage.Cookie),void 0===o&&(o=!1),void 0===i&&(i=null),{name:t,description:r,storage:e,required:o,enabled:null===i?o:i,enable:function(){return this.enabled||this.toggle(),this},disable:function(){return this.enabled&&this.toggle(),this},toggle:function(){return this.required||(this.enabled=!this.enabled),this},makeRequired:function(){return this.required=!0,this.enabled=!0,this},isEnabled:function(t){return this.name===t&&this.enabled},enableForStorage:function(t){return this.enabled||this.toggleForStorage(t),this},disableForStorage:function(t){return this.enabled&&this.toggleForStorage(t),this},toggleForStorage:function(t){return this.storage!=t||this.required||this.toggle(),this},raw:function(){return JSON.parse(JSON.stringify(this))}}}},822:function(t,r,e){var n=this&&this.__values||function(t){var r=\"function\"==typeof Symbol&&Symbol.iterator,e=r&&t[r],n=0;if(e)return e.call(t);if(t&&\"number\"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(r?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},o=this&&this.__read||function(t,r){var e=\"function\"==typeof Symbol&&t[Symbol.iterator];if(!e)return t;var n,o,i=e.call(t),u=[];try{for(;(void 0===r||r-- >0)&&!(n=i.next()).done;)u.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(e=i.return)&&e.call(i)}finally{if(o)throw o.error}}return u},i=this&&this.__spreadArray||function(t,r,e){if(e||2===arguments.length)for(var n,o=0,i=r.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(r?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},o=this&&this.__read||function(t,r){var e=\"function\"==typeof Symbol&&t[Symbol.iterator];if(!e)return t;var n,o,i=e.call(t),u=[];try{for(;(void 0===r||r-- >0)&&!(n=i.next()).done;)u.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(e=i.return)&&e.call(i)}finally{if(o)throw o.error}}return u},i=this&&this.__spreadArray||function(t,r,e){if(e||2===arguments.length)for(var n,o=0,i=r.length;o{Object.defineProperty(r,\"__esModule\",{value:!0}),r.GdprManagerEventHub=void 0;var e=function(){function t(){this.eventMap={}}return t.prototype.onEnable=function(t,r){return this.addListener(\"enable\",t,r),this},t.prototype.onDisable=function(t,r){return this.addListener(\"disable\",t,r),this},t.prototype.enable=function(t){return this.executeListeners(\"enable\",t),this},t.prototype.disable=function(t){return this.executeListeners(\"disable\",t),this},t.prototype.tagFor=function(t,r){return\"\".concat(t,\"--\").concat(r)},t.prototype.addListener=function(t,r,e){var n=this.tagFor(t,r);n in this.eventMap||(this.eventMap[n]=[]),this.eventMap[n].push(e)},t.prototype.executeListeners=function(t,r){var e,n=this.tagFor(t,r);null===(e=this.eventMap[n])||void 0===e||e.forEach((function(t){return t()}))},t}();r.GdprManagerEventHub=e},670:(t,r)=>{var e;Object.defineProperty(r,\"__esModule\",{value:!0}),r.GdprStorage=void 0,function(t){t[t.None=1]=\"None\",t[t.Cookie=2]=\"Cookie\",t[t.LocalStorage=4]=\"LocalStorage\",t[t.SessionStorage=8]=\"SessionStorage\",t[t.IndexedDb=16]=\"IndexedDb\",t[t.FileSystem=16]=\"FileSystem\",t[t.ServerStorage=16]=\"ServerStorage\",t[t.All=30]=\"All\"}(e||(e={})),r.GdprStorage=e},860:function(t,r,e){var n,o=this&&this.__extends||(n=function(t,r){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,r){t.__proto__=r}||function(t,r){for(var e in r)Object.prototype.hasOwnProperty.call(r,e)&&(t[e]=r[e])},n(t,r)},function(t,r){if(\"function\"!=typeof r&&null!==r)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");function e(){this.constructor=t}n(t,r),t.prototype=null===r?Object.create(r):(e.prototype=r.prototype,new e)}),i=this&&this.__read||function(t,r){var e=\"function\"==typeof Symbol&&t[Symbol.iterator];if(!e)return t;var n,o,i=e.call(t),u=[];try{for(;(void 0===r||r-- >0)&&!(n=i.next()).done;)u.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(e=i.return)&&e.call(i)}finally{if(o)throw o.error}}return u},u=this&&this.__spreadArray||function(t,r,e){if(e||2===arguments.length)for(var n,o=0,i=r.length;o{Object.defineProperty(r,\"__esModule\",{value:!0}),r.GdprGuardBuilder=void 0;var n=e(670),o=e(315),i=function(){function t(t,r,e,n){this.parent=t,this.storage=r,this.enable=e,this.require=n,this.name=\"\",this.description=\"\",n&&(this.enable=!0)}return t.create=function(r,e,o,i){return void 0===e&&(e=n.GdprStorage.Cookie),void 0===o&&(o=!1),void 0===i&&(i=!1),new t(r,e,o,i)},t.prototype.endGuard=function(){var t=this.require||this.enable,r=(0,o.makeGuard)(this.name,this.description,this.storage,this.require,t);return this.require&&r.makeRequired(),this.parent.guards.push(r),this.parent},t.prototype.withName=function(t){return this.edit((function(r){return r.name=t}))},t.prototype.withDescription=function(t){return this.edit((function(r){return r.description=t}))},t.prototype.enabled=function(){return this.edit((function(t){return t.enable=!0}))},t.prototype.disabled=function(){return this.edit((function(t){return t.enable=!1}))},t.prototype.storedIn=function(t){return this.edit((function(r){return r.storage=t}))},t.prototype.required=function(){return this.edit((function(t){return t.require=!0}))},t.prototype.edit=function(t){return t(this),this},t}();r.GdprGuardBuilder=i},237:(t,r,e)=>{Object.defineProperty(r,\"__esModule\",{value:!0}),r.GdprManagerBuilder=void 0;var n=e(670),o=e(777),i=e(171),u=function(){function t(){this.storage=n.GdprStorage.Cookie,this.groups=[],this.bannerWasShown=!1}return t.make=function(){return new t},t.prototype.withBannerShown=function(t){void 0===t&&(t=!0),this.bannerWasShown=t},t.prototype.startGroup=function(t,r,e,n){return void 0===t&&(t=null),void 0===r&&(r=\"\"),void 0===e&&(e=\"\"),void 0===n&&(n=!0),i.GdprGroupBuilder.create(this,r,e,t,n,!1)},t.prototype.startRequiredGroup=function(t,r,e){return void 0===t&&(t=null),void 0===r&&(r=\"\"),void 0===e&&(e=\"\"),this.startEnabledGroup(t,r,e).required()},t.prototype.startEnabledGroup=function(t,r,e){return void 0===t&&(t=null),void 0===r&&(r=\"\"),void 0===e&&(e=\"\"),this.startGroup(t,r,e,!0).enabled()},t.prototype.startDisabledGroup=function(t,r,e){return void 0===t&&(t=null),void 0===r&&(r=\"\"),void 0===e&&(e=\"\"),this.startGroup(t,r,e,!1).disabled()},t.prototype.build=function(){var t=o.GdprManager.create(this.groups);return t.bannerWasShown=this.bannerWasShown,t},t.prototype.endGroup=function(){return this},t}();r.GdprManagerBuilder=u},171:function(t,r,e){var n=this&&this.__createBinding||(Object.create?function(t,r,e,n){void 0===n&&(n=e);var o=Object.getOwnPropertyDescriptor(r,e);o&&!(\"get\"in o?!r.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return r[e]}}),Object.defineProperty(t,n,o)}:function(t,r,e,n){void 0===n&&(n=e),t[n]=r[e]}),o=this&&this.__exportStar||function(t,r){for(var e in t)\"default\"===e||Object.prototype.hasOwnProperty.call(r,e)||n(r,t,e)};Object.defineProperty(r,\"__esModule\",{value:!0}),o(e(890),r),o(e(237),r),o(e(860),r)},93:function(t,r,e){var n=this&&this.__createBinding||(Object.create?function(t,r,e,n){void 0===n&&(n=e);var o=Object.getOwnPropertyDescriptor(r,e);o&&!(\"get\"in o?!r.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return r[e]}}),Object.defineProperty(t,n,o)}:function(t,r,e,n){void 0===n&&(n=e),t[n]=r[e]}),o=this&&this.__exportStar||function(t,r){for(var e in t)\"default\"===e||Object.prototype.hasOwnProperty.call(r,e)||n(r,t,e)};Object.defineProperty(r,\"__esModule\",{value:!0}),o(e(315),r),o(e(822),r),o(e(777),r),o(e(670),r),o(e(779),r),o(e(171),r),o(e(562),r),o(e(344),r)},562:(t,r,e)=>{Object.defineProperty(r,\"__esModule\",{value:!0}),r.GdprDeserializer=void 0;var n=e(777),o=e(670),i=e(822),u=e(315),a=function(){function t(){}return t.manager=function(t){var r=this;if(![\"enabled\",\"groups\"].every((function(r){return r in t}))||\"boolean\"!=typeof t.enabled||!Array.isArray(t.groups))return null;var e=t.groups.map((function(t){return r.group(t)})).filter((function(t){return null!==t})),o=n.GdprManager.create([]);return o.enabled=!!t.enabled,o.bannerWasShown=!!t.bannerWasShown,e.length?(e.forEach((function(t){return o.addGroup(t)})),o):null},t.group=function(t){var r=this,e=this.guard(t);if(null===e)return null;var n=[\"guards\"];if(!n.every((function(r){return r in t}))||!Array.isArray(t.guards))return null;var o=i.GdprGuardGroup.for(e.name,e.description,e.enabled,e.required),u=t.guards.map((function(t){return n.every((function(r){return r in t}))?r.group(t):r.guard(t)})).filter((function(t){return null!==t}));return u.length?(u.forEach((function(t){return o.addGuard(t)})),o):null},t.guard=function(t){return[\"name\",\"enabled\",\"required\",\"description\",\"storage\"].every((function(r){return r in t}))&&\"string\"==typeof t.name&&\"boolean\"==typeof t.enabled&&\"boolean\"==typeof t.required&&\"string\"==typeof t.description&&\"number\"==typeof t.storage&&t.storage in o.GdprStorage?(0,u.makeGuard)(t.name,t.description,t.storage,!!t.required,!!t.enabled):null},t}();r.GdprDeserializer=a},344:function(t,r){var e=this&&this.__awaiter||function(t,r,e,n){return new(e||(e=Promise))((function(o,i){function u(t){try{s(n.next(t))}catch(t){i(t)}}function a(t){try{s(n.throw(t))}catch(t){i(t)}}function s(t){var r;t.done?o(t.value):(r=t.value,r instanceof e?r:new e((function(t){t(r)}))).then(u,a)}s((n=n.apply(t,r||[])).next())}))},n=this&&this.__generator||function(t,r){var e,n,o,i,u={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},\"function\"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(e)throw new TypeError(\"Generator is already executing.\");for(;u;)try{if(e=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return u.label++,{value:i[1],done:!1};case 5:u.label++,n=i[1],i=[0];continue;case 7:i=u.ops.pop(),u.trys.pop();continue;default:if(!((o=(o=u.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]{Object.defineProperty(r,\"__esModule\",{value:!0}),r.visitGdpr=void 0;var n=e(777),o=e(822);r.visitGdpr=function(t,e){var i=void 0===e?{}:e,u=i.onManager,a=void 0===u?function(){}:u,s=i.onGroup,d=void 0===s?function(){}:s,c=i.onGuard,p=void 0===c?function(){}:c,l=i.onEach,f=void 0===l?function(){}:l,h={onManager:a,onGroup:d,onGuard:p,onEach:f};t instanceof n.GdprManager?(a(t),f(t),t.getGroups().forEach((function(t){return(0,r.visitGdpr)(t,h)}))):t instanceof o.GdprGuardGroup?(d(t),f(t),t.getGuards().forEach((function(t){return(0,r.visitGdpr)(t,h)}))):(p(t),f(t))}}},r={};return function e(n){var o=r[n];if(void 0!==o)return o.exports;var i=r[n]={exports:{}};return t[n].call(i.exports,i,i.exports,e),i.exports}(93)})()}));","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export class HtmlGdprGuardError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t}\n}\n","import { HtmlGdprGuardError } from \"@/errors/HtmlGdprGuardError\";\n\n/**\n * Error thrown when the library does not find\n * a root {@link HTMLElement} to get the manager's\n * data from\n */\nexport class NoManagerDefinitionError extends HtmlGdprGuardError {\n\tstatic defaultMessage: string = \"No definition found for the GDPR manager\";\n\n\tconstructor(message = NoManagerDefinitionError.defaultMessage) {\n\t\tsuper(message);\n\t}\n}\n","import { HtmlGdprGuardError } from \"@/errors/HtmlGdprGuardError\";\n\nexport class NoNameError extends HtmlGdprGuardError {\n\tstatic defaultMessage: string = \"Guard definition is missing the guard's name\";\n\n\tconstructor(message: string = NoNameError.defaultMessage) {\n\t\tsuper(message);\n\t}\n}\n","import { HtmlGdprGuardError } from \"@/errors/HtmlGdprGuardError\";\n\nexport class NoCheckboxError extends HtmlGdprGuardError {\n\tstatic defaultMessage: string = \"No checkbox found for that guard\";\n\n\tconstructor(message: string = NoCheckboxError.defaultMessage) {\n\t\tsuper(message);\n\t}\n}\n","export const isMeaningfulStr = (str?: string|null): str is string => {\n\treturn !!str && !/^\\s*$/.test(str);\n};\n\nexport const toCamelCase = (str: string): string => {\n\treturn str.replace(/-(\\w)/g, (_, letter: string) => letter.toUpperCase());\n};\n","import { childSelector } from \"@/utils/dom\";\nimport { NoNameError } from \"@/errors/NoNameError\";\nimport { NoCheckboxError } from \"@/errors/NoCheckboxError\";\nimport { GdprStorage } from \"gdpr-guard\";\nimport { isMeaningfulStr, toCamelCase } from \"@/utils/misc\";\nimport { NoManagerDefinitionError } from \"@/errors/NoManagerDefinitionError\";\n\n/**\n * Get the guard's name from the DOM\n * @param guardEl - The guard element to query\n * @param guardDataKey - The key in the dataset of {@link guardEl} where the name could be\n * @param nameDataKey - The name of the data attribute that can be found in child nodes to parse the name\n * @throws {NoNameError} - If it can't find the guard's name\n */\nexport const nameFromDOM = (guardEl: HTMLElement, guardDataKey: string, nameDataKey: string = \"gdpr-guard-name\"): string => {\n\tconst str = guardEl.dataset[toCamelCase(guardDataKey)];\n\n\tif (isMeaningfulStr(str)) {\n\t\treturn str.trim();\n\t}\n\n\t// const nameHolder: HTMLElement|null = guardEl.querySelector(`[data-${nameDataKey}]`);\n\tconst nameHolder: HTMLElement|null = childSelector(guardEl, `[data-${nameDataKey}]`);\n\n\tconst name = nameHolder?.dataset[nameDataKey];\n\tif (!isMeaningfulStr(name)) {\n\t\tconst textName = nameHolder?.textContent;\n\n\t\tif (isMeaningfulStr(textName)) {\n\t\t\treturn textName.trim();\n\t\t}\n\n\t\tthrow new NoNameError();\n\t}\n\n\treturn name.trim();\n};\n\n/**\n * Get the guard's checkbox from the DOM\n * @param guardEl - The root of the guard's tree\n * @param guardName - The guard's name\n */\nexport const checkboxFromDOM = (guardEl: HTMLElement, guardName: string) => {\n\tconst strategies = [\n\t\t() => document.getElementById(guardName), // by ID\n\t\t() => guardEl.querySelector(`[type=\"checkbox\"][name=\"${guardName}\"]`), // by name\n\t\t() => guardEl.querySelector(`[type=\"checkbox\"][data-gdpr-checkbox]`), // by specific attribute\n\t];\n\n\tfor (const strategy of strategies) {\n\t\tconst checkbox = strategy();\n\n\t\tif (checkbox?.matches?.(\"input[type='checkbox']\")) {\n\t\t\treturn checkbox as HTMLInputElement;\n\t\t}\n\t}\n\n\tthrow new NoCheckboxError();\n};\n\n/**\n * Retrieve the guard's description from the DOM\n * @param guardEl - The root of the guard's state tree\n */\nexport const descriptionFromDOM = (guardEl: HTMLElement) => {\n\tif (guardEl.hasAttribute(\"data-gdpr-guard-description\")) {\n\t\treturn guardEl.dataset.gdprGuardDescription;\n\t}\n\n\tconst descriptionEl = guardEl.querySelector(\"[data-gdpr-guard-description]\");\n\n\treturn descriptionEl?.textContent ?? null;\n};\n\n/**\n * Get the {@link GdprStorage} from the DOM\n * @param guardEl - The root the guard's state tree\n */\nexport const storageFromDOM = (guardEl: HTMLElement): GdprStorage|null => {\n\tif (guardEl.hasAttribute(\"data-gdpr-guard-storage\")) {\n\t\tconst rawStorage = guardEl.dataset.gdprGuardStorage;\n\n\t\tif (rawStorage && rawStorage in GdprStorage) {\n\t\t\treturn GdprStorage[rawStorage];\n\t\t}\n\t}\n\n\treturn null;\n};\n\n/**\n * Check whether the guard is marked as required in the DOM\n * @param guardEl - The root of the guard's state tree\n * @param checkbox - The guard's checkbox\n */\nexport const guardIsRequiredInDOM = (guardEl: HTMLElement, checkbox: HTMLInputElement) => {\n\treturn checkbox.required || guardEl.hasAttribute(\"data-gdpr-guard-required\");\n};\n\n/**\n * Sync the required status across all attributes in the DOM\n * @param guardEl - The root of the guard's state tree\n * @param checkbox - The guard's checkbox\n * @param isRequired - Whether the guard is already marked as required\n */\nexport const syncRequiredInDOM = (guardEl: HTMLElement, checkbox: HTMLInputElement, isRequired: boolean = false) => {\n\tconst makeCheckedDisabled = () => {\n\t\tcheckbox.setAttribute(\"checked\", \"checked\");\n\t\tcheckbox.setAttribute(\"disabled\", \"disabled\");\n\t};\n\n\tconst makeRequired = () => {\n\t\tcheckbox.setAttribute(\"required\", \"required\");\n\t};\n\n\tconst addGdprRequiredAttr = () => {\n\t\tguardEl.setAttribute(\"data-gdpr-guard-required\", \"\");\n\t};\n\n\tif(isRequired) {\n\t\taddGdprRequiredAttr();\n\t\tmakeCheckedDisabled();\n\t\tmakeRequired();\n\t} else if (checkbox.required) {\n\t\taddGdprRequiredAttr();\n\t\tmakeCheckedDisabled();\n\t} else if (guardEl.hasAttribute(\"data-gdpr-guard-required\")) {\n\t\tmakeCheckedDisabled();\n\t\tmakeRequired();\n\t}\n}\n\n/**\n * Extract the manager's own details from the DOM\n * @param gdprEl - The root of the GDPR state tree\n */\nexport const parseManagerDetails = (gdprEl: HTMLElement) => {\n\tlet managerEl = gdprEl;\n\tconst { gdpr } = gdprEl.dataset;\n\tlet managerName: string = \"\";\n\n\tif (isMeaningfulStr(gdpr)) {\n\t\tmanagerName = gdpr;\n\t} else {\n\t\tconst el = gdprEl.querySelector(\"[data-gdpr-manager]\");\n\n\t\tif (!el) {\n\t\t\tthrow new NoManagerDefinitionError();\n\t\t}\n\n\t\tmanagerEl = el as HTMLElement;\n\t\tmanagerName = nameFromDOM(managerEl, \"gdpr-manager\");\n\t}\n\n\tconst managerCheckbox = checkboxFromDOM(managerEl, managerName);\n\n\treturn {\n\t\tmanagerEl,\n\t\tmanagerCheckbox,\n\t\tmanagerName,\n\t};\n};\n","/**\n * Execute an action/callback on each child\n * @param rootEl - The parent element\n * @param action - The action/callback to execute on each child\n */\nexport const forEachChild = (rootEl: HTMLElement, action: (el: HTMLElement) => void) => {\n\tfor (let i = 0; i < rootEl.childElementCount; i += 1) {\n\t\tconst el = rootEl.children.item(i);\n\n\t\tif (el) {\n\t\t\taction(el as HTMLElement);\n\t\t}\n\t}\n}\n\nexport const findChild = (rootEl: HTMLElement, predicate: (el: HTMLElement) => boolean) => {\n\tfor (let i = 0; i < rootEl.childElementCount; i += 1) {\n\t\tconst el = rootEl.children.item(i);\n\n\t\tif (el && predicate(el as HTMLElement)) {\n\t\t\treturn el as HTMLElement;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Find all the children that satisfy the given predicate\n * @param rootEl - The parent element\n * @param predicate - The predicate to satisfy\n */\nexport const findAllChildren = (rootEl: HTMLElement, predicate: (el: HTMLElement) => boolean) => {\n\tconst ret = [] as HTMLElement[];\n\n\tfor (let i = 0; i < rootEl.childElementCount; i += 1) {\n\t\tconst el = rootEl.children.item(i);\n\n\t\tif (el && predicate(el as HTMLElement)) {\n\t\t\tret.push(el as HTMLElement);\n\t\t}\n\t}\n\n\treturn ret;\n};\n\n/**\n * Get the first child that matches the given selector\n * @param rootEl - The parent element\n * @param selector - The children selector\n */\nexport const childSelector = (rootEl: HTMLElement, selector: string) => {\n\treturn findChild(rootEl, el => el.matches(selector));\n}\n\n/**\n * Get all the children of the given root that match the given selector\n * @param rootEl - The parent element\n * @param selector - The children selector\n */\nexport const childSelectorAll = (rootEl: HTMLElement, selector: string) => {\n\treturn findAllChildren(rootEl, el => el.matches(selector));\n};\n","import { GdprGroupBuilder, GdprManagerBuilder } from \"gdpr-guard\";\nimport {\n\tcheckboxFromDOM,\n\tdescriptionFromDOM,\n\tguardIsRequiredInDOM,\n\tnameFromDOM,\n\tstorageFromDOM, syncRequiredInDOM\n} from \"@/domainLogic/dataExtractors\";\nimport { childSelectorAll, forEachChild } from \"@/utils/dom\";\n\nexport interface GuardParseResult {\n\tname: string;\n\tcheckbox: HTMLInputElement;\n}\n\n/**\n * Parse a guard's data and add it to the manager\n * @param guardEl - The root element of the gaurd's data\n * @param groupBuilder - The current group builder's state\n * @param parentRequired - Whether the group is required\n */\nconst addGuard = (guardEl: HTMLElement, groupBuilder: GdprGroupBuilder, parentRequired: boolean): GuardParseResult => {\n\tconst guardBuilder = groupBuilder.startGuard();\n\n\tconst name = nameFromDOM(guardEl, \"gdpr-guard\");\n\tguardBuilder.withName(name);\n\n\tconst checkbox = checkboxFromDOM(guardEl, name);\n\n\tconst isRequired = parentRequired || guardIsRequiredInDOM(guardEl, checkbox);\n\tsyncRequiredInDOM(guardEl, checkbox, isRequired);\n\n\tif (isRequired) {\n\t\tguardBuilder.required().enabled();\n\t} else if (checkbox.checked) {\n\t\tguardBuilder.enabled();\n\t} else {\n\t\tguardBuilder.disabled();\n\t}\n\n\tconst description = descriptionFromDOM(guardEl);\n\n\tif (description) {\n\t\tguardBuilder.withDescription(description);\n\t}\n\n\tconst storage = storageFromDOM(guardEl);\n\n\tif (storage !== null) {\n\t\tguardBuilder.storedIn(storage);\n\t}\n\n\tguardBuilder.endGuard();\n\n\treturn {\n\t\tname,\n\t\tcheckbox,\n\t};\n};\n\n/**\n * Get the data for a group and add it to the manager\n * @param groupEl - The root of the group's data\n * @param managerBuilder - The current manager (or group) builder's state\n * @param parentRequired - Whether the manager (or parent group) is required\n * @throws {NoNameError} - If the group's name or a guard's name cannot be parsed\n */\nconst addGroup = (groupEl: HTMLElement, managerBuilder: GdprManagerBuilder, parentRequired: boolean): GuardParseResult[] => {\n\tconst groupBuilder = managerBuilder.startGroup();\n\n\t// The name is mandatory, if it can't parse it then it'll throw\n\tconst name = nameFromDOM(groupEl, \"gdpr-group\");\n\tgroupBuilder.withName(name);\n\n\tconst checkbox = checkboxFromDOM(groupEl, name);\n\n\tconst parsedGuards = [{\n\t\tname,\n\t\tcheckbox,\n\t}];\n\n\tconst isRequired = parentRequired || guardIsRequiredInDOM(groupEl, checkbox);\n\tsyncRequiredInDOM(groupEl, checkbox, isRequired);\n\n\tif (isRequired) {\n\t\tgroupBuilder.required().enabled();\n\t} else if (checkbox.checked) {\n\t\tgroupBuilder.enabled();\n\t} else {\n\t\tgroupBuilder.disabled();\n\t}\n\n\tconst description = descriptionFromDOM(groupEl);\n\n\tif (description) {\n\t\tgroupBuilder.withDescription(description);\n\t}\n\n\tconst storage = storageFromDOM(groupEl);\n\n\tif (storage !== null) {\n\t\tgroupBuilder.storedIn(storage);\n\t}\n\n\t// Recursively parse child guards from there\n\tconst guards = addChildGuards(groupEl, groupBuilder, isRequired);\n\tgroupBuilder.endGroup();\n\n\n\tparsedGuards.push(...guards);\n\treturn parsedGuards;\n};\n\n/**\n * Recursively add the child guards of a group to the manager\n * @param rootEl - The root element for that group\n * @param groupBuilder - The current group builder's state\n * @param required - Whether the group is required\n */\nconst addChildGuards = (rootEl: HTMLElement, groupBuilder: GdprGroupBuilder, required: boolean = false): GuardParseResult[] => {\n\tconst parsedGuards = [] as GuardParseResult[];\n\n\tforEachChild(rootEl, el => {\n\t\tif (el?.matches(\"[data-gdpr-group]\")) {\n\t\t\tconst guards = addGroup(el as HTMLElement, groupBuilder, required);\n\t\t\tparsedGuards.push(...guards);\n\t\t} else if (el?.matches(\"[data-gdpr-guard]\")) {\n\t\t\tconst guard = addGuard(el as HTMLElement, groupBuilder, required);\n\t\t\tparsedGuards.push(guard);\n\t\t}\n\t});\n\n\treturn parsedGuards;\n};\n\n/**\n * Get the guards from the DOM and add them all to the manager\n * @param managerEl - The root element of the manager's definition\n * @param managerBuilder - The current manager builder's state\n */\nexport const addGuardsFromDOM = (managerEl: HTMLElement, managerBuilder: GdprManagerBuilder): GuardParseResult[] => {\n\treturn childSelectorAll(managerEl, \"[data-gdpr-group]\")\n\t\t.flatMap(el => {\n\t\t\treturn addGroup(el as HTMLElement, managerBuilder, false);\n\t\t});\n};\n","/**\n * Type for event listeners used in the {@link GlobalEventBus}\n */\ntype Listener = (e: Event) => void;\ntype EventName = string;\ntype Selector = string;\n\nexport const GlobalEventBus = {\n\t/**\n\t * Store the event managers and their listeners\n\t */\n\tevents: {} as Record>,\n\n\t/**\n\t * Add an event listener on the given selector as a live listener (i.e. is not limited to the current matching set of {@link HTMLElement})\n\t * @param event - The name of the event\n\t * @param selector - The selector to match against\n\t * @param listener - The listener to call when the event is triggered on an element that matches the given selector\n\t */\n\ton(event: EventName, selector: Selector, listener: Listener) {\n\t\tif (!(event in this.events)) { // This event had no selectors or listeners attached yet\n\t\t\tthis.events[event] = {\n\t\t\t\t[selector]: [listener],\n\t\t\t};\n\n\t\t\twindow.addEventListener(event, e => {\n\t\t\t\tObject.entries(this.events[event])\n\t\t\t\t\t.forEach(([selector, listeners]: [Selector, Listener[]]) => {\n\t\t\t\t\t\tconst target = e.target as HTMLElement|null;\n\n\t\t\t\t\t\tif (target?.matches?.(selector)) {\n\t\t\t\t\t\t\tlisteners.forEach(listener => listener(e));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\tconst eventManager = this.events[event];\n\n\t\t\tif (!(selector in eventManager)) { // This event didn't have the selector registered yet\n\t\t\t\teventManager[selector] = [];\n\t\t\t}\n\n\t\t\teventManager[selector].push(listener);\n\t\t}\n\n\t}\n};\n","import { GdprGuard, GdprManager, GdprManagerFactory, GdprSavior } from \"gdpr-guard\";\nimport { GdprManagerEventHub } from \"gdpr-guard/dist/GdprManagerEventHub\";\nimport { GlobalEventBus } from \"@/utils/eventBus\";\nimport { GuardParseResult } from \"@/domainLogic/guardsParsing\";\n\n/**\n * Add listeners to the change event of the manager's and guards' checkboxes\n * @param manager - The manager to handle state changes for\n * @param managerCheckbox - The global manager toggle checkbox\n * @param parsedGuards - The guards that have been parsed from the DOM\n * @param hadManager - Whether the manager came from the savior instead of the factory\n */\nexport const setupCheckboxListeners = (manager: GdprManager, managerCheckbox: HTMLInputElement, parsedGuards: GuardParseResult[], hadManager: boolean) => {\n\tconst handleInitialSync = (checkbox: HTMLInputElement, guard: GdprGuard) => {\n\t\tif (hadManager) {\n\t\t\tif ((checkbox.checked && !guard.enabled) || (!checkbox.checked && guard.enabled)) {\n\t\t\t\tcheckbox.click();\n\t\t\t}\n\t\t}\n\t};\n\n\thandleInitialSync(managerCheckbox, manager);\n\n\tmanagerCheckbox.addEventListener(\"click\", () => {\n\t\tmanager.toggle();\n\t});\n\n\tparsedGuards.forEach(({ name, checkbox }) => {\n\t\tconst guard = manager.getGuard(name)!;\n\n\t\thandleInitialSync(checkbox, guard);\n\n\t\tcheckbox.addEventListener(\"click\", () => {\n\t\t\tguard.toggle();\n\t\t});\n\t});\n};\n\n/**\n * Setup item activation in the `` tag (i.e. to execute code when the corresponding guard is enabled)\n * @param manager - The manager to attach the activation logic to\n * @param itemSelector - The selector to query all the related items (must include `[data-gdpr-on-enable]`)\n * @param setupItemHook - The function to call to set up the item before putting it in the DOM\n */\nexport const setupInHeadActivation = (\n\tmanager: GdprManager,\n\titemSelector: string,\n\tsetupItemHook: (item: ItemType) => void\n) => {\n\tdocument.querySelectorAll(itemSelector)\n\t\t.forEach(item => {\n\t\t\tconst guardName = item.dataset.gdprOnEnable!;\n\n\t\t\tif (manager.hasGuard(guardName)) {\n\t\t\t\tmanager.events.onEnable(guardName, () => {\n\t\t\t\t\t/*\n\t\t\t\t\t\tScript tags have an internal attribute checking whether\n\t\t\t\t\t\tthey have already been loaded. Cloning a script will\n\t\t\t\t\t\talways clone that flag as well (which is unwanted).\n\t\t\t\t\t */\n\n\t\t\t\t\tconst isScript = item.matches(\"script\");\n\n\t\t\t\t\tconst clonedItem = (\n\t\t\t\t\t\tisScript\n\t\t\t\t\t\t\t? document.createElement(\"script\")\n\t\t\t\t\t\t\t: item.cloneNode(true)\n\t\t\t\t\t) as ItemType;\n\n\t\t\t\t\tif (isScript) {\n\t\t\t\t\t\t// Copy attributes over\n\t\t\t\t\t\titem.getAttributeNames().forEach(attrName => {\n\t\t\t\t\t\t\tconst attrValue = item.getAttribute(attrName)!;\n\t\t\t\t\t\t\tclonedItem.setAttribute(attrName, attrValue);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tsetupItemHook(clonedItem);\n\t\t\t\t\tclonedItem.removeAttribute(\"data-gdpr-on-enable\");\n\t\t\t\t\titem.remove();\n\t\t\t\t\tdocument.head.appendChild(clonedItem);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\titem.remove();\n\t\t\t}\n\t\t});\n};\n\n\n/**\n * Setup scripts activation logic to load them when the corresponding guard is enabled (type must initially be text and the src attribute mst be present)\n * @param manager - The manager to attach the activation logic to\n */\nexport const setupScriptActivation = (manager: GdprManager) => {\n\tsetupInHeadActivation(\n\t\tmanager,\n\t\t\"script[type='text'][src][data-gdpr-on-enable]\",\n\t\tactualScript => {\n\t\t\tactualScript.setAttribute(\"type\", \"text/javascript\");\n\t\t}\n\t);\n};\n\n/**\n * Setup stylesheets activation logic to load them when the corresponding guard is enabled (rel attribute must be different from stylesheet and the href attribute must be present)\n * @param manager - The manager to attach the activation logic to\n */\nexport const setupStyleSheetsActivation = (manager: GdprManager) => {\n\tsetupInHeadActivation(\n\t\tmanager,\n\t\t\"link[href][data-gdpr-on-enable]\",\n\t\tactualStyleSheet => {\n\t\t\tactualStyleSheet.setAttribute(\"rel\", \"stylesheet\");\n\t\t}\n\t);\n};\n\nexport type BindEventsCallback = (eventsHub: GdprManagerEventHub) => void;\n\nexport type StoreErrorHandler = (didStore: boolean, error?: Error) => void;\n\nexport interface SetupButtonListenersHooks {\n\tonDeclineAllErrorHook: StoreErrorHandler;\n\tonAllowAllErrorHook: StoreErrorHandler;\n\tonCancelErrorHook: StoreErrorHandler;\n\tonSaveErrorHook: StoreErrorHandler;\n\tonBannerClose: () => void;\n\tonBannerOpen: () => void;\n}\n\n/**\n * Bind event listeners to the general buttons\n * @param manager\n * @param gdprSavior\n * @param hooks\n * @param restoreFactory\n */\nexport const setupButtonsListeners = (\n\tmanager: GdprManager,\n\tgdprSavior: GdprSavior,\n\thooks: SetupButtonListenersHooks,\n\trestoreFactory: GdprManagerFactory\n) => {\n\tconst doClose = () => {\n\t\tmanager.closeBanner();\n\t\thooks.onBannerClose();\n\t};\n\n\tGlobalEventBus.on(\"click\", \"[data-gdpr-open]\", e => {\n\t\te.preventDefault();\n\n\t\tmanager.resetAndShowBanner();\n\t\thooks.onBannerOpen();\n\t});\n\n\tGlobalEventBus.on(\"click\", \"[data-gdpr-decline-all]\", e => {\n\t\te.preventDefault();\n\n\t\tmanager.disable();\n\n\t\tgdprSavior.store(manager.raw())\n\t\t\t.then(didStore => {\n\t\t\t\tif (!didStore) {\n\t\t\t\t\thooks.onDeclineAllErrorHook(didStore);\n\t\t\t\t} else {\n\t\t\t\t\tdoClose();\n\t\t\t\t}\n\t\t\t}).catch(e => hooks.onDeclineAllErrorHook(false, e));\n\t});\n\n\tGlobalEventBus.on(\"click\", \"[data-gdpr-allow-all]\", e => {\n\t\te.preventDefault();\n\n\t\tmanager.enable();\n\n\t\tgdprSavior.store(manager.raw())\n\t\t\t.then(didStore => {\n\t\t\t\tif (!didStore) {\n\t\t\t\t\thooks.onAllowAllErrorHook(didStore);\n\t\t\t\t} else {\n\t\t\t\t\tdoClose();\n\t\t\t\t}\n\t\t\t}).catch(e => hooks.onAllowAllErrorHook(false, e));\n\t});\n\n\tGlobalEventBus.on(\"click\", \"[data-gdpr-cancel]\", e => {\n\t\te.preventDefault();\n\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tconst hadManager = await gdprSavior.exists(false);\n\n\t\t\t\tif (hadManager) {\n\t\t\t\t\tawait gdprSavior.restore(true);\n\t\t\t\t} else {\n\t\t\t\t\tawait gdprSavior.restoreOrCreate(restoreFactory);\n\t\t\t\t\t//TODO: Use save/restore new API (when it's out, for now the savior API has to suffice)\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t\thooks.onCancelErrorHook(true, e as Error);\n\t\t\t}\n\t\t})();\n\t});\n\n\tGlobalEventBus.on(\"click\", \"[data-gdpr-save]\", e => {\n\t\te.preventDefault();\n\n\t\tgdprSavior.store(manager.raw())\n\t\t\t.then(didStore => {\n\t\t\t\tif (!didStore) {\n\t\t\t\t\thooks.onSaveErrorHook(didStore);\n\t\t\t\t} else {\n\t\t\t\t\tdoClose();\n\t\t\t\t}\n\t\t\t}).catch(e => hooks.onSaveErrorHook(e));\n\t});\n};\n","import { NoManagerDefinitionError } from \"@/errors/NoManagerDefinitionError\";\nimport { GdprManager, GdprManagerBuilder, GdprSavior } from \"gdpr-guard\";\nimport { parseManagerDetails } from \"@/domainLogic/dataExtractors\";\nimport { GdprManagerEventHub } from \"gdpr-guard/dist/GdprManagerEventHub\";\nimport { addGuardsFromDOM } from \"@/domainLogic/guardsParsing\";\nimport {\n\tBindEventsCallback,\n\tsetupButtonsListeners,\n\tsetupCheckboxListeners,\n\tsetupScriptActivation,\n\tsetupStyleSheetsActivation,\n\tStoreErrorHandler,\n} from \"@/domainLogic/listeners\";\n\nexport type AddGuardsCallback = (managerBuilder: GdprManagerBuilder) => void;\n\nexport interface GdprHtmlManagerOptions {\n\t/**\n\t * The element that serves as the root of the GDPR manager's definition in the DOM\n\t * @default document.querySelector(\"[data-gdpr]\")\n\t */\n\tgdprEl?: HTMLElement;\n\n\t/**\n\t * Whether to auto close the banner (only if it has already been displayed to the user)\n\t * @default true\n\t */\n\tautoCloseBanner?: boolean;\n\n\t/**\n\t * A callback to attach event listeners to the {@link GdprManagerEventHub} before finalizing the setup\n\t * @default () => {}\n\t */\n\tbindEventHandlersHook?: BindEventsCallback;\n\n\t/**\n\t * Add guards before the ones parsed from the DOM\n\t * @param managerBuilder\n\t * @default () => {}\n\t */\n\taddGuardsBeforeHook?: AddGuardsCallback;\n\n\t/**\n\t * Add guards after the ones parsed from the DOM\n\t * @param managerBuilder\n\t * @default () => {}\n\t */\n\taddGuardsAfterHook?: AddGuardsCallback;\n\n\t/**\n\t * Handle failure of declining all\n\t */\n\tonDeclineAllErrorHook?: StoreErrorHandler;\n\n\t/**\n\t * Handle failure of allowing all\n\t */\n\tonAllowAllErrorHook?: StoreErrorHandler;\n\n\t/**\n\t * Handle failure of saving\n\t */\n\tonSaveErrorHook?: StoreErrorHandler;\n\n\t/**\n\t * Handle failure of cancelling\n\t */\n\tonCancelErrorHook?: StoreErrorHandler;\n\n\t/**\n\t * Execute code when closing the banner\n\t */\n\tonBannerClose?: () => void;\n\n\t/**\n\t * Execute code when opening the banner\n\t */\n\tonBannerOpen?: () => void;\n}\n\n// TODO: Reset API in gdpr-guard?\n\n/**\n * Initialize the gdpr-guard logic from the DOM or the provided {@link GdprSavior}\n * @param gdprSavior - The savior to use to restore and save the {@link GdprManager} data\n * @param {GdprHtmlManagerOptions} [options] - The setup's options\n * @returns {Promise} The restored GDPR manager\n * @throws {NoManagerDefinitionError} - If no manager definition can be found\n * (either {@link gdprEl} is `undefined` or `document.querySelector(\"[data-gdpr]\")` returned `null`)\n */\nexport const restoreHtmlGdprManager = async (gdprSavior: GdprSavior, {\n\tgdprEl = undefined,\n\tautoCloseBanner = true,\n\n\tbindEventHandlersHook = () => {},\n\taddGuardsBeforeHook = () => {},\n\taddGuardsAfterHook = () => {},\n\n\tonDeclineAllErrorHook = (didStore, err) => console.error(\"[HtmlGdprGuard @ onDeclineAllErrorHook]\", {didStore, err}),\n\tonAllowAllErrorHook = (didStore, err) => console.error(\"[HtmlGdprGuard @ onAllowAllErrorHook]\", {didStore, err}),\n\tonSaveErrorHook = (didStore, err) => console.error(\"[HtmlGdprGuard @ onSaveErrorHook]\", {didStore, err}),\n\tonCancelErrorHook = (didStore, err) => console.error(\"[HtmlGdprGuard @ onCancelErrorHook]\", {didStore, err}),\n\n\tonBannerClose = () => {},\n\tonBannerOpen = () => {},\n}: GdprHtmlManagerOptions = {}): Promise => {\n\tif (typeof gdprEl === \"undefined\") {\n\t\tgdprEl = document.querySelector(\"[data-gdpr]\") ?? undefined;\n\n\t\tif (typeof gdprEl === \"undefined\") {\n\t\t\tthrow new NoManagerDefinitionError();\n\t\t}\n\t}\n\n\tconst { managerEl, managerCheckbox } = parseManagerDetails(gdprEl);\n\n\tconst managerBuilder = GdprManagerBuilder.make();\n\n\taddGuardsBeforeHook(managerBuilder);\n\tconst parsedGuards = addGuardsFromDOM(managerEl, managerBuilder);\n\taddGuardsAfterHook(managerBuilder);\n\n\tconst managerFactory = async () => managerBuilder.build();\n\tconst hadManager = await gdprSavior.exists(false);\n\tconst manager = await gdprSavior.restoreOrCreate(managerFactory);\n\n\tsetupScriptActivation(manager);\n\tsetupStyleSheetsActivation(manager);\n\tsetupCheckboxListeners(manager, managerCheckbox, parsedGuards, hadManager);\n\tsetupButtonsListeners(manager, gdprSavior, {\n\t\tonDeclineAllErrorHook,\n\t\tonAllowAllErrorHook,\n\t\tonSaveErrorHook,\n\t\tonCancelErrorHook,\n\t\tonBannerClose,\n\t\tonBannerOpen,\n\t}, managerFactory);\n\n\tbindEventHandlersHook(manager.events);\n\n\tif (autoCloseBanner && manager.bannerWasShown) {\n\t\tmanager.closeBanner();\n\t\tonBannerClose();\n\t} else { // Allows banner to be in closed state by default and open it when JS is ready\n\t\tmanager.resetAndShowBanner();\n\t\tonBannerOpen();\n\t}\n\n\treturn manager;\n};\n\nexport * from \"./errors\";\n"],"names":["root","factory","exports","module","define","amd","self","t","r","e","Object","defineProperty","value","makeGuard","n","o","i","GdprStorage","Cookie","name","description","storage","required","enabled","enable","this","toggle","disable","makeRequired","isEnabled","enableForStorage","toggleForStorage","disableForStorage","raw","JSON","parse","stringify","__values","Symbol","iterator","call","length","next","done","TypeError","__read","u","push","error","return","__spreadArray","arguments","Array","prototype","slice","concat","GdprGuardGroup","a","None","bindings","Map","for","addGuard","set","hasGuard","has","getGuard","get","s","doForEachGuard","guards","map","forEach","getGuards","values","GdprManager","d","c","bannerWasShown","events","GdprManagerEventHub","groups","create","addGroup","closeBanner","visitGdpr","onEach","resetAndShowBanner","createGroup","reduceGroupsPred","hasGroup","getGroup","forEachGroup","getGroups","eventMap","onEnable","addListener","onDisable","executeListeners","tagFor","LocalStorage","SessionStorage","IndexedDb","FileSystem","ServerStorage","All","__extends","setPrototypeOf","__proto__","hasOwnProperty","String","constructor","GdprGroupBuilder","p","parent","require","startGroup","startRequiredGroup","endGroup","withName","edit","withDescription","storedIn","disabled","startGuard","GdprGuardBuilder","startRequiredGuard","withEnabledGuard","endGuard","withDisabledGuard","GdprManagerBuilder","make","withBannerShown","startEnabledGroup","startDisabledGroup","build","__createBinding","getOwnPropertyDescriptor","__esModule","writable","configurable","enumerable","__exportStar","GdprDeserializer","manager","every","isArray","group","filter","guard","__awaiter","Promise","throw","then","apply","__generator","label","sent","trys","ops","pop","GdprSaviorAdapter","exists","restore","storeIfNotExists","store","restoreOrCreate","updateSharedManager","check","resolve","setTimeout","onManager","onGroup","onGuard","l","f","h","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","definition","key","obj","prop","toStringTag","message","Error","NoManagerDefinitionError","defaultMessage","HtmlGdprGuardError","NoNameError","NoCheckboxError","isMeaningfulStr","str","test","nameFromDOM","guardEl","guardDataKey","nameDataKey","dataset","replace","_","letter","toUpperCase","toCamelCase","trim","rootEl","selector","nameHolder","predicate","childElementCount","el","children","item","findChild","matches","textName","textContent","checkboxFromDOM","guardName","strategies","document","getElementById","querySelector","checkbox","strategy","descriptionFromDOM","hasAttribute","gdprGuardDescription","descriptionEl","storageFromDOM","rawStorage","gdprGuardStorage","guardIsRequiredInDOM","syncRequiredInDOM","isRequired","makeCheckedDisabled","setAttribute","addGdprRequiredAttr","groupEl","managerBuilder","parentRequired","groupBuilder","parsedGuards","checked","addChildGuards","action","forEachChild","guardBuilder","GlobalEventBus","on","event","listener","eventManager","window","addEventListener","entries","listeners","target","setupInHeadActivation","itemSelector","setupItemHook","querySelectorAll","gdprOnEnable","isScript","clonedItem","createElement","cloneNode","getAttributeNames","attrName","attrValue","getAttribute","removeAttribute","remove","head","appendChild","restoreHtmlGdprManager","gdprSavior","gdprEl","autoCloseBanner","bindEventHandlersHook","addGuardsBeforeHook","addGuardsAfterHook","onDeclineAllErrorHook","didStore","err","console","onAllowAllErrorHook","onSaveErrorHook","onCancelErrorHook","onBannerClose","onBannerOpen","managerEl","gdpr","managerName","managerCheckbox","parseManagerDetails","ret","findAllChildren","flatMap","addGuardsFromDOM","managerFactory","hadManager","actualScript","setupScriptActivation","actualStyleSheet","setupStyleSheetsActivation","handleInitialSync","click","setupCheckboxListeners","hooks","restoreFactory","doClose","preventDefault","catch","setupButtonsListeners"],"sourceRoot":""}
\ No newline at end of file
diff --git a/example/3rd-party.css b/example/3rd-party.css
new file mode 100644
index 0000000..c3ebd4c
--- /dev/null
+++ b/example/3rd-party.css
@@ -0,0 +1,3 @@
+body {
+ background-color: lightcoral;
+}
diff --git a/example/3rd-party.js b/example/3rd-party.js
new file mode 100644
index 0000000..d6e5aea
--- /dev/null
+++ b/example/3rd-party.js
@@ -0,0 +1 @@
+alert("3rd-party script loaded");
diff --git a/example/index.html b/example/index.html
new file mode 100644
index 0000000..0d44a22
--- /dev/null
+++ b/example/index.html
@@ -0,0 +1,179 @@
+
+
+
+
+ html-gdpr-guard DEMO
+
+
+
+
+
+
+
+
+
+
+
+
+ Some random nav and stuff
+
+
+
+
+ lorem ipsum
+
+
+
+
+
+
+
+
+ GDPR Settings
+
+
+
+
+
+ Description from DOM
+
+
+
+
+
+
+
+
+
+
+ Solo guard at the top level
+
+
+
+
+
+ Yet another description from the DOM
+
+
+
+
+
+ First group
+
+
+
+
+
+
+ My guard name from the DOM
+
+
+
+
+
+
+
+ 3rd party
+
+
+
+
+
+
+
+
+ My required group
+
+
+
+
+
+
+ My guard name from the DOM (look I'm required even though I didn't make it so!)
+