From e4dbaff3ff0bd854d417624f9f0ef6bf4ef1dad1 Mon Sep 17 00:00:00 2001 From: npgiano-macbook Date: Fri, 24 Oct 2025 16:57:04 -0400 Subject: [PATCH 1/5] Use inmem check box to help determine embedded ecard visibility --- packages/scripts/src/embedded-ecard.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/scripts/src/embedded-ecard.ts b/packages/scripts/src/embedded-ecard.ts index 7803f120..10484b12 100644 --- a/packages/scripts/src/embedded-ecard.ts +++ b/packages/scripts/src/embedded-ecard.ts @@ -141,12 +141,22 @@ export class EmbeddedEcard { } private addEventListeners() { + const inMemoryCheckbox = document.getElementById( + "en__field_transaction_inmem" + ) as HTMLInputElement; const sendEcardCheckbox = document.getElementById( "en__field_embedded-ecard" ) as HTMLInputElement; - this.toggleEcardForm(sendEcardCheckbox.checked); + this.toggleEcardForm((inMemoryCheckbox?.checked ?? true) && sendEcardCheckbox.checked); + inMemoryCheckbox?.addEventListener("change", (e) => { + const checkbox = e.target as HTMLInputElement; + if( !checkbox.checked ) { + sendEcardCheckbox.checked = false; + } + }); + sendEcardCheckbox?.addEventListener("change", (e) => { const checkbox = e.target as HTMLInputElement; this.toggleEcardForm(checkbox.checked); From fba77de17bd2e8c980ea2ace0f48db37fd4a639a Mon Sep 17 00:00:00 2001 From: npgiano Date: Fri, 14 Nov 2025 17:12:38 -0500 Subject: [PATCH 2/5] DataLayer, save values in LocalStorage and use sha256 --- packages/scripts/dist/data-layer.d.ts | 3 + packages/scripts/dist/data-layer.js | 108 ++- packages/scripts/package-lock.json | 926 +++++++++++++------------- packages/scripts/src/data-layer.ts | 42 +- 4 files changed, 583 insertions(+), 496 deletions(-) diff --git a/packages/scripts/dist/data-layer.d.ts b/packages/scripts/dist/data-layer.d.ts index b9107d1e..af235c3e 100644 --- a/packages/scripts/dist/data-layer.d.ts +++ b/packages/scripts/dist/data-layer.d.ts @@ -3,9 +3,11 @@ export declare class DataLayer { private dataLayer; private _form; private static instance; + private encoder; private endOfGiftProcessStorageKey; private excludedFields; private hashedFields; + private retainedFields; constructor(); static getInstance(): DataLayer; private transformJSON; @@ -14,6 +16,7 @@ export declare class DataLayer { private attachEventListeners; private handleFieldValueChange; private hash; + private shaHash; private getFieldLabel; addEndOfGiftProcessEvent(eventName: string, eventProperties?: object): void; addEndOfGiftProcessVariable(variableName: string, variableValue?: any): void; diff --git a/packages/scripts/dist/data-layer.js b/packages/scripts/dist/data-layer.js index 5d70e82d..8f0983d3 100644 --- a/packages/scripts/dist/data-layer.js +++ b/packages/scripts/dist/data-layer.js @@ -7,12 +7,22 @@ // are replayed after a successful gift process load. // Sensitive payment/bank fields are excluded; selected PII fields are Base64 “hashed” (btoa — not cryptographic). // Replace with a real hash (e.g., SHA‑256) if required. +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; import { EngridLogger, ENGrid, EnForm, RememberMeEvents } from "."; export class DataLayer { constructor() { this.logger = new EngridLogger("DataLayer", "#f1e5bc", "#009cdc", "📊"); this.dataLayer = window.dataLayer || []; this._form = EnForm.getInstance(); + this.encoder = new TextEncoder(); this.endOfGiftProcessStorageKey = "ENGRID_END_OF_GIFT_PROCESS_EVENTS"; this.excludedFields = [ // Credit Card @@ -45,6 +55,14 @@ export class DataLayer { "supporter.billingAddress2", "supporter.billingAddress3", ]; + this.retainedFields = [ + // Supporter Address, Phone Numbers, and Address + "supporter.emailAddress", + "supporter.phoneNumber2", + "supporter.address1", + "supporter.address2", + "supporter.address3", + ]; if (ENGrid.getOption("RememberMe")) { RememberMeEvents.getInstance().onLoad.subscribe((hasData) => { this.logger.log("Remember me - onLoad", hasData); @@ -102,6 +120,13 @@ export class DataLayer { dataLayerData[`EN_URLPARAM_${key.toUpperCase()}`] = this.transformJSON(value); }); + this.retainedFields.forEach((fieldName) => { + const storedValue = localStorage.getItem(`EN_RETAINED_FIELD_${fieldName.toUpperCase()}`); + if (storedValue) { + dataLayerData[`EN_RETAINED_FIELD_${fieldName.toUpperCase()}`] = + storedValue; + } + }); if (ENGrid.getPageType() === "DONATION") { const recurrFreqEls = document.querySelectorAll('[name="transaction.recurrfreq"]'); const recurrValues = [...recurrFreqEls].map((el) => el.value); @@ -151,45 +176,64 @@ export class DataLayer { } handleFieldValueChange(el) { var _a, _b, _c; - if (el.value === "" || this.excludedFields.includes(el.name)) - return; - const value = this.hashedFields.includes(el.name) - ? this.hash(el.value) - : el.value; - if (["checkbox", "radio"].includes(el.type)) { - if (el.checked) { - if (el.name === "en__pg") { - //Premium gift handling - this.dataLayer.push({ - event: "EN_FORM_VALUE_UPDATED", - enFieldName: el.name, - enFieldLabel: "Premium Gift", - enFieldValue: (_b = (_a = el - .closest(".en__pg__body")) === null || _a === void 0 ? void 0 : _a.querySelector(".en__pg__name")) === null || _b === void 0 ? void 0 : _b.textContent, - enProductId: (_c = document.querySelector('[name="transaction.selprodvariantid"]')) === null || _c === void 0 ? void 0 : _c.value, - }); - } - else { - this.dataLayer.push({ - event: "EN_FORM_VALUE_UPDATED", - enFieldName: el.name, - enFieldLabel: this.getFieldLabel(el), - enFieldValue: value, - }); + return __awaiter(this, void 0, void 0, function* () { + if (el.value === "" || this.excludedFields.includes(el.name)) + return; + const value = this.hashedFields.includes(el.name) + ? this.hash(el.value) + : el.value; + if (["checkbox", "radio"].includes(el.type)) { + if (el.checked) { + if (el.name === "en__pg") { + //Premium gift handling + this.dataLayer.push({ + event: "EN_FORM_VALUE_UPDATED", + enFieldName: el.name, + enFieldLabel: "Premium Gift", + enFieldValue: (_b = (_a = el + .closest(".en__pg__body")) === null || _a === void 0 ? void 0 : _a.querySelector(".en__pg__name")) === null || _b === void 0 ? void 0 : _b.textContent, + enProductId: (_c = document.querySelector('[name="transaction.selprodvariantid"]')) === null || _c === void 0 ? void 0 : _c.value, + }); + } + else { + this.dataLayer.push({ + event: "EN_FORM_VALUE_UPDATED", + enFieldName: el.name, + enFieldLabel: this.getFieldLabel(el), + enFieldValue: value, + }); + } } + return; } - return; - } - this.dataLayer.push({ - event: "EN_FORM_VALUE_UPDATED", - enFieldName: el.name, - enFieldLabel: this.getFieldLabel(el), - enFieldValue: value, + if (this.retainedFields.includes(el.name)) { + const sha256value = yield this.shaHash(el.value); + localStorage.setItem(`EN_RETAINED_FIELD_${el.name.toUpperCase()}`, sha256value); + } + this.dataLayer.push({ + event: "EN_FORM_VALUE_UPDATED", + enFieldName: el.name, + enFieldLabel: this.getFieldLabel(el), + enFieldValue: value, + }); }); } hash(value) { return btoa(value); } + // TODO: Replace the hash function with this secure SHA-256 implementation later + shaHash(value) { + return __awaiter(this, void 0, void 0, function* () { + const data = this.encoder.encode(value); + const hashBuffer = yield crypto.subtle.digest('SHA-256', data); + return Array.from(new Uint8Array(hashBuffer)) + .map((byte) => { + const hex = byte.toString(16); + return hex.length === 1 ? "0" + hex : hex; + }) + .join(""); + }); + } getFieldLabel(el) { var _a, _b; return ((_b = (_a = el.closest(".en__field")) === null || _a === void 0 ? void 0 : _a.querySelector("label")) === null || _b === void 0 ? void 0 : _b.textContent) || ""; diff --git a/packages/scripts/package-lock.json b/packages/scripts/package-lock.json index fe39f45e..31360678 100644 --- a/packages/scripts/package-lock.json +++ b/packages/scripts/package-lock.json @@ -1,465 +1,465 @@ { - "name": "@4site/engrid-scripts", - "version": "0.23.4", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@4site/engrid-scripts", - "version": "0.22.6", - "license": "Unlicense", - "dependencies": { - "shuffle-seed": "^1.1.6", - "strongly-typed-events": "^2.0.9" - }, - "devDependencies": { - "nodemon": "^2.0.20" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/seedrandom": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", - "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==" - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/shuffle-seed": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/shuffle-seed/-/shuffle-seed-1.1.6.tgz", - "integrity": "sha512-Vr9wlwMKJVUeFNGyc4aNbrzkI568gkve7ykyJ+1/cz78j3yRlJODWU0CuJ/fmk3MCjvAClpnqlycd/Y53UG3UA==", - "dependencies": { - "seedrandom": "^2.4.2" - } - }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, - "dependencies": { - "semver": "~7.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/ste-core": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/ste-core/-/ste-core-2.1.16.tgz", - "integrity": "sha512-GgwwDFSDWbS2Ps1QliUHJPXeomvwZFfG5B10ggp+INmBD618MxwbA1qwFXdXjYGaS8JfiEC6NlpT3fp9PwfNHw==", - "engines": { - "node": ">=4.2.4" - } - }, - "node_modules/ste-events": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/ste-events/-/ste-events-2.1.16.tgz", - "integrity": "sha512-DFTYyuiCaNC4rY8td1UB9zfsCtcUE9iy5PdKlkQJ8+7Yv/mjVKqKusfmmfbI9BfjTgawinixypInsc+LWx67HA==", - "dependencies": { - "ste-core": "^2.1.16" - }, - "engines": { - "node": ">=4.2.4" - } - }, - "node_modules/ste-promise-events": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/ste-promise-events/-/ste-promise-events-2.1.16.tgz", - "integrity": "sha512-An/jUYfuhdj4k0ROwPi+x4UabRlCM8iN4EcmhgkKwKUA0v26dKx2eZ4NtaNEmddV77M3D01mXfE5Ddq+o69ulQ==", - "dependencies": { - "ste-core": "^2.1.16" - }, - "engines": { - "node": ">=4.2.4" - } - }, - "node_modules/ste-promise-signals": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/ste-promise-signals/-/ste-promise-signals-2.1.16.tgz", - "integrity": "sha512-op/OvmTVeq4t4X7+5qTqcFTHgCVdRLNcqgamOfK4t1oeSVNZsxtODqJ7+fJqh4RCx27y4xMWqpB3p9vvdetzEw==", - "dependencies": { - "ste-core": "^2.1.16" - }, - "engines": { - "node": ">=4.2.4" - } - }, - "node_modules/ste-promise-simple-events": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/ste-promise-simple-events/-/ste-promise-simple-events-2.1.16.tgz", - "integrity": "sha512-jAI0z8oCvcsVQ94kKz2pVtzskI8ODhM4jYJMP4U+K9InONcicKleA+5EKrzGzLjn0WKBd3hegJfM6Vy/Cv5HNA==", - "dependencies": { - "ste-core": "^2.1.16" - }, - "engines": { - "node": ">=4.2.4" - } - }, - "node_modules/ste-signals": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/ste-signals/-/ste-signals-2.1.16.tgz", - "integrity": "sha512-odMJ3xG4AIKIyBCL3to4BIBgEpIzpQsyJgt9MbgOAmyUD3FZBMymM8x5QkW0qXXH9RnHnKcaEOOMw6+DUgx77w==", - "dependencies": { - "ste-core": "^2.1.16" - }, - "engines": { - "node": ">=4.2.4" - } - }, - "node_modules/ste-simple-events": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/ste-simple-events/-/ste-simple-events-2.1.16.tgz", - "integrity": "sha512-B4gdrRg9jnbJE8sICjbx9NFb04KJn1WYWiXoon/YsD+3DWii4XyE3rMU6ZeJI6GG2s9mNExloNZMGcC9zSKh8A==", - "dependencies": { - "ste-core": "^2.1.16" - }, - "engines": { - "node": ">=4.2.4" - } - }, - "node_modules/strongly-typed-events": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/strongly-typed-events/-/strongly-typed-events-2.1.16.tgz", - "integrity": "sha512-y3wh36XtzAg0gWEOnVGloWthmUrdLmeGSddkV1yFHrNHBGAtcjTMvp0ESRVIvKWC8+IVyqzacDPuNPmDTXly0g==", - "dependencies": { - "ste-core": "^2.1.16", - "ste-events": "^2.1.16", - "ste-promise-events": "^2.1.16", - "ste-promise-signals": "^2.1.16", - "ste-promise-simple-events": "^2.1.16", - "ste-signals": "^2.1.16", - "ste-simple-events": "^2.1.16" - }, - "engines": { - "node": ">=4.2.4" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - } - } + "name": "@4site/engrid-scripts", + "version": "0.23.4", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@4site/engrid-scripts", + "version": "0.23.4", + "license": "Unlicense", + "dependencies": { + "shuffle-seed": "^1.1.6", + "strongly-typed-events": "^2.0.9" + }, + "devDependencies": { + "nodemon": "^2.0.20" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/seedrandom": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", + "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==" + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/shuffle-seed": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/shuffle-seed/-/shuffle-seed-1.1.6.tgz", + "integrity": "sha512-Vr9wlwMKJVUeFNGyc4aNbrzkI568gkve7ykyJ+1/cz78j3yRlJODWU0CuJ/fmk3MCjvAClpnqlycd/Y53UG3UA==", + "dependencies": { + "seedrandom": "^2.4.2" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/ste-core": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/ste-core/-/ste-core-2.1.16.tgz", + "integrity": "sha512-GgwwDFSDWbS2Ps1QliUHJPXeomvwZFfG5B10ggp+INmBD618MxwbA1qwFXdXjYGaS8JfiEC6NlpT3fp9PwfNHw==", + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-events": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/ste-events/-/ste-events-2.1.16.tgz", + "integrity": "sha512-DFTYyuiCaNC4rY8td1UB9zfsCtcUE9iy5PdKlkQJ8+7Yv/mjVKqKusfmmfbI9BfjTgawinixypInsc+LWx67HA==", + "dependencies": { + "ste-core": "^2.1.16" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-promise-events": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/ste-promise-events/-/ste-promise-events-2.1.16.tgz", + "integrity": "sha512-An/jUYfuhdj4k0ROwPi+x4UabRlCM8iN4EcmhgkKwKUA0v26dKx2eZ4NtaNEmddV77M3D01mXfE5Ddq+o69ulQ==", + "dependencies": { + "ste-core": "^2.1.16" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-promise-signals": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/ste-promise-signals/-/ste-promise-signals-2.1.16.tgz", + "integrity": "sha512-op/OvmTVeq4t4X7+5qTqcFTHgCVdRLNcqgamOfK4t1oeSVNZsxtODqJ7+fJqh4RCx27y4xMWqpB3p9vvdetzEw==", + "dependencies": { + "ste-core": "^2.1.16" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-promise-simple-events": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/ste-promise-simple-events/-/ste-promise-simple-events-2.1.16.tgz", + "integrity": "sha512-jAI0z8oCvcsVQ94kKz2pVtzskI8ODhM4jYJMP4U+K9InONcicKleA+5EKrzGzLjn0WKBd3hegJfM6Vy/Cv5HNA==", + "dependencies": { + "ste-core": "^2.1.16" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-signals": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/ste-signals/-/ste-signals-2.1.16.tgz", + "integrity": "sha512-odMJ3xG4AIKIyBCL3to4BIBgEpIzpQsyJgt9MbgOAmyUD3FZBMymM8x5QkW0qXXH9RnHnKcaEOOMw6+DUgx77w==", + "dependencies": { + "ste-core": "^2.1.16" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-simple-events": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/ste-simple-events/-/ste-simple-events-2.1.16.tgz", + "integrity": "sha512-B4gdrRg9jnbJE8sICjbx9NFb04KJn1WYWiXoon/YsD+3DWii4XyE3rMU6ZeJI6GG2s9mNExloNZMGcC9zSKh8A==", + "dependencies": { + "ste-core": "^2.1.16" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/strongly-typed-events": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/strongly-typed-events/-/strongly-typed-events-2.1.16.tgz", + "integrity": "sha512-y3wh36XtzAg0gWEOnVGloWthmUrdLmeGSddkV1yFHrNHBGAtcjTMvp0ESRVIvKWC8+IVyqzacDPuNPmDTXly0g==", + "dependencies": { + "ste-core": "^2.1.16", + "ste-events": "^2.1.16", + "ste-promise-events": "^2.1.16", + "ste-promise-signals": "^2.1.16", + "ste-promise-simple-events": "^2.1.16", + "ste-signals": "^2.1.16", + "ste-simple-events": "^2.1.16" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + } + } } diff --git a/packages/scripts/src/data-layer.ts b/packages/scripts/src/data-layer.ts index 8a706123..ecc90ce1 100644 --- a/packages/scripts/src/data-layer.ts +++ b/packages/scripts/src/data-layer.ts @@ -20,6 +20,7 @@ export class DataLayer { private dataLayer = (window as any).dataLayer || []; private _form: EnForm = EnForm.getInstance(); private static instance: DataLayer; + private encoder = new TextEncoder(); private endOfGiftProcessStorageKey = "ENGRID_END_OF_GIFT_PROCESS_EVENTS"; private excludedFields = [ @@ -58,6 +59,15 @@ export class DataLayer { "supporter.billingAddress3", ]; + private retainedFields = [ + // Supporter Address, Phone Numbers, and Address + "supporter.emailAddress", + "supporter.phoneNumber2", + "supporter.address1", + "supporter.address2", + "supporter.address3", + ]; + constructor() { if (ENGrid.getOption("RememberMe")) { RememberMeEvents.getInstance().onLoad.subscribe((hasData) => { @@ -125,6 +135,16 @@ export class DataLayer { this.transformJSON(value); }); + this.retainedFields.forEach((fieldName) => { + const storedValue = localStorage.getItem( + `EN_RETAINED_FIELD_${fieldName.toUpperCase()}` + ); + if (storedValue) { + dataLayerData[`EN_RETAINED_FIELD_${fieldName.toUpperCase()}`] = + storedValue; + } + }); + if (ENGrid.getPageType() === "DONATION") { const recurrFreqEls = document.querySelectorAll( '[name="transaction.recurrfreq"]' @@ -193,7 +213,7 @@ export class DataLayer { }); } - private handleFieldValueChange(el: HTMLInputElement | HTMLSelectElement) { + private async handleFieldValueChange(el: HTMLInputElement | HTMLSelectElement) { if (el.value === "" || this.excludedFields.includes(el.name)) return; const value = this.hashedFields.includes(el.name) @@ -229,6 +249,14 @@ export class DataLayer { return; } + if (this.retainedFields.includes(el.name)) { + const sha256value = await this.shaHash(el.value); + localStorage.setItem( + `EN_RETAINED_FIELD_${el.name.toUpperCase()}`, + sha256value + ); + } + this.dataLayer.push({ event: "EN_FORM_VALUE_UPDATED", enFieldName: el.name, @@ -241,6 +269,18 @@ export class DataLayer { return btoa(value); } + // TODO: Replace the hash function with this secure SHA-256 implementation later + private async shaHash(value: string): Promise { + const data = this.encoder.encode(value); + const hashBuffer = await crypto.subtle.digest('SHA-256', data); + return Array.from(new Uint8Array(hashBuffer)) + .map((byte) => { + const hex = byte.toString(16); + return hex.length === 1 ? "0" + hex : hex; + }) + .join(""); + } + private getFieldLabel( el: HTMLInputElement | HTMLSelectElement ): string | null { From 8e0ed88c8893d7559f44064420f9f473b601039b Mon Sep 17 00:00:00 2001 From: npgiano Date: Fri, 14 Nov 2025 17:22:46 -0500 Subject: [PATCH 3/5] Revert stale ecard changes --- packages/scripts/src/embedded-ecard.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/scripts/src/embedded-ecard.ts b/packages/scripts/src/embedded-ecard.ts index 1866186c..196184be 100644 --- a/packages/scripts/src/embedded-ecard.ts +++ b/packages/scripts/src/embedded-ecard.ts @@ -141,9 +141,6 @@ export class EmbeddedEcard { } private addEventListeners() { - const inMemoryCheckbox = document.getElementById( - "en__field_transaction_inmem" - ) as HTMLInputElement; const sendEcardCheckbox = document.getElementById( "en__field_embedded-ecard" ) as HTMLInputElement; From ceba15a5b02387580c06cedc8fb8e97c39b318e5 Mon Sep 17 00:00:00 2001 From: npgiano Date: Wed, 19 Nov 2025 00:56:10 -0500 Subject: [PATCH 4/5] Properly send sha256 value to datalayer --- packages/scripts/src/data-layer.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/scripts/src/data-layer.ts b/packages/scripts/src/data-layer.ts index ecc90ce1..36353e15 100644 --- a/packages/scripts/src/data-layer.ts +++ b/packages/scripts/src/data-layer.ts @@ -255,6 +255,12 @@ export class DataLayer { `EN_RETAINED_FIELD_${el.name.toUpperCase()}`, sha256value ); + this.dataLayer.push({ + event: "EN_RETAINED_VALUE_UPDATED", + enFieldName: el.name, + enFieldLabel: this.getFieldLabel(el), + enFieldValue: sha256value, + }); } this.dataLayer.push({ From 8602eeb1b13340a1d36fb811bcfbe39b6b6cd800 Mon Sep 17 00:00:00 2001 From: npgiano Date: Wed, 19 Nov 2025 01:19:30 -0500 Subject: [PATCH 5/5] Build ceba15a5b02387580c06cedc8fb8e97c39b318e5 --- packages/scripts/dist/data-layer.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/scripts/dist/data-layer.js b/packages/scripts/dist/data-layer.js index 8f0983d3..c2dd1812 100644 --- a/packages/scripts/dist/data-layer.js +++ b/packages/scripts/dist/data-layer.js @@ -209,6 +209,12 @@ export class DataLayer { if (this.retainedFields.includes(el.name)) { const sha256value = yield this.shaHash(el.value); localStorage.setItem(`EN_RETAINED_FIELD_${el.name.toUpperCase()}`, sha256value); + this.dataLayer.push({ + event: "EN_RETAINED_VALUE_UPDATED", + enFieldName: el.name, + enFieldLabel: this.getFieldLabel(el), + enFieldValue: sha256value, + }); } this.dataLayer.push({ event: "EN_FORM_VALUE_UPDATED",