@4site/engrid-scripts 0.22.17 → 0.22.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/app.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { DonationAmount, DonationFrequency, EnForm, ProcessingFees, Country, } from "./events";
2
- import { AmountLabel, Loader, ProgressBar, UpsellLightbox, ENGrid, OptionsDefaults, setRecurrFreq, PageBackground, MediaAttribution, ApplePay, A11y, CapitalizeFields, Ecard, ClickToExpand, Advocacy, DataAttributes, LiveVariables, iFrame, InputPlaceholders, InputHasValueAndFocus, ShowHideRadioCheckboxes, AutoCountrySelect, SkipToMainContentLink, SrcDefer, NeverBounce, AutoYear, Autocomplete, RememberMe, TranslateFields, ShowIfAmount, EngridLogger, OtherAmount, MinMaxAmount, Ticker, DataReplace, DataHide, AddNameToMessage, ExpandRegionName, AppVersion, UrlToForm, RequiredIfVisible, TidyContact, DataLayer, LiveCurrency, Autosubmit, EventTickets, SwapAmounts, DebugPanel, DebugHiddenFields, FreshAddress, BrandingHtml, CountryDisable, PremiumGift, DigitalWallets, MobileCTA, LiveFrequency, UniversalOptIn, Plaid, GiveBySelect, UrlParamsToBodyAttrs, ExitIntentLightbox, SupporterHub, FastFormFill, SetAttr, ShowIfPresent, ENValidators, CustomCurrency, VGS, PostalCodeValidator, CountryRedirect, WelcomeBack, EcardToTarget, UsOnlyForm, ThankYouPageConditionalContent, EmbeddedEcard, CheckboxLabel, UpsellCheckbox, PostDonationEmbed, FrequencyUpsell, } from ".";
2
+ import { AmountLabel, Loader, ProgressBar, UpsellLightbox, ENGrid, OptionsDefaults, setRecurrFreq, PageBackground, MediaAttribution, ApplePay, A11y, CapitalizeFields, Ecard, ClickToExpand, Advocacy, DataAttributes, LiveVariables, iFrame, InputPlaceholders, InputHasValueAndFocus, ShowHideRadioCheckboxes, AutoCountrySelect, SkipToMainContentLink, SrcDefer, NeverBounce, AutoYear, Autocomplete, RememberMe, TranslateFields, ShowIfAmount, EngridLogger, OtherAmount, MinMaxAmount, Ticker, DataReplace, DataHide, AddNameToMessage, ExpandRegionName, AppVersion, UrlToForm, RequiredIfVisible, TidyContact, DataLayer, LiveCurrency, Autosubmit, EventTickets, SwapAmounts, DebugPanel, DebugHiddenFields, FreshAddress, BrandingHtml, CountryDisable, PremiumGift, DigitalWallets, MobileCTA, LiveFrequency, UniversalOptIn, Plaid, GiveBySelect, UrlParamsToBodyAttrs, ExitIntentLightbox, SupporterHub, FastFormFill, SetAttr, ShowIfPresent, ENValidators, CustomCurrency, VGS, PostalCodeValidator, CountryRedirect, WelcomeBack, EcardToTarget, UsOnlyForm, ThankYouPageConditionalContent, EmbeddedEcard, CheckboxLabel, UpsellCheckbox, PostDonationEmbed, FrequencyUpsell, CustomPremium, } from ".";
3
3
  export class App extends ENGrid {
4
4
  constructor(options) {
5
5
  super();
@@ -246,6 +246,8 @@ export class App extends ENGrid {
246
246
  new CountryDisable();
247
247
  // Premium Gift Features
248
248
  new PremiumGift();
249
+ // Custom Premium filtering (frequency/amount-based visibility)
250
+ new CustomPremium();
249
251
  // Supporter Hub Features
250
252
  new SupporterHub();
251
253
  // Digital Wallets Features
@@ -16,15 +16,15 @@ export class CheckboxLabel {
16
16
  }
17
17
  run() {
18
18
  this.checkBoxesLabels.forEach((checkboxLabel) => {
19
- var _a;
20
- const labelText = (_a = checkboxLabel.textContent) === null || _a === void 0 ? void 0 : _a.trim();
19
+ const labelHTML = checkboxLabel.innerHTML.trim();
21
20
  const checkboxContainer = checkboxLabel.nextElementSibling;
22
21
  const checkboxLabelElement = checkboxContainer.querySelector("label:last-child");
23
- if (!checkboxLabelElement || !labelText)
22
+ if (!checkboxLabelElement || !labelHTML)
24
23
  return;
25
- checkboxLabelElement.textContent = labelText;
24
+ checkboxLabelElement.innerHTML = `<div class="engrid-custom-checkbox-label">${labelHTML}</div>`;
25
+ // Remove the original label element
26
26
  checkboxLabel.remove();
27
- this.logger.log(`Set checkbox label to "${labelText}"`);
27
+ this.logger.log(`Set checkbox label to "${labelHTML}"`);
28
28
  });
29
29
  }
30
30
  }
@@ -0,0 +1,30 @@
1
+ export declare class CustomPremium {
2
+ private logger;
3
+ private _amount;
4
+ private _frequency;
5
+ private _enForm;
6
+ private debounceTimer;
7
+ private stylesInjected;
8
+ private pendingFrequencyChange;
9
+ constructor();
10
+ private shouldRun;
11
+ private get config();
12
+ private get premiumContainer();
13
+ private get giftItems();
14
+ private getFrequencyConfig;
15
+ private getProductsMap;
16
+ private getConfiguredDefaultPid;
17
+ private injectStyles;
18
+ private startProcessingVisual;
19
+ private endProcessingVisual;
20
+ private scheduleRun;
21
+ private getCurrentFreq;
22
+ private getCurrentAmount;
23
+ private getAllowedProductIds;
24
+ private getProductId;
25
+ private showItem;
26
+ private selectByProductId;
27
+ private clearVariantField;
28
+ private hasVisiblePremiumItems;
29
+ private run;
30
+ }
@@ -0,0 +1,264 @@
1
+ // ENgrid component: CustomPremium
2
+ // Filters premium gifts based on window.EngridPageOptions.CustomPremium configuration
3
+ // Rules:
4
+ // - Config shape: window.EngridPageOptions.CustomPremium[frequency][productId] = minimumAmount
5
+ // - On frequency or amount change, wait 500ms (allow EN to re-render), then:
6
+ // - Show only gifts whose minimumAmount <= current amount; hide others
7
+ // - If none visible, hide entire .en__component--premiumgiftblock
8
+ // - If current selection becomes invalid, select default; if default not visible, select "No Premium" and clear transaction.selprodvariantid
9
+ // - Run once 500ms after page load
10
+ // - Add EnForm onSubmit hook to clear transaction.selprodvariantid when no visible premium items
11
+ import { ENGrid, DonationAmount, DonationFrequency, EnForm, EngridLogger, } from ".";
12
+ export class CustomPremium {
13
+ constructor() {
14
+ this.logger = new EngridLogger("CustomPremium", "teal", "white", "🧩");
15
+ this._amount = DonationAmount.getInstance();
16
+ this._frequency = DonationFrequency.getInstance();
17
+ this._enForm = EnForm.getInstance();
18
+ this.stylesInjected = false;
19
+ this.pendingFrequencyChange = false;
20
+ if (!this.shouldRun())
21
+ return;
22
+ this.injectStyles();
23
+ // Initial run: execute once after 500ms
24
+ window.setTimeout(() => this.run(), 500);
25
+ // On changes, schedule processing and fade out immediately
26
+ this._amount.onAmountChange.subscribe(() => this.scheduleRun());
27
+ this._frequency.onFrequencyChange.subscribe(() => {
28
+ this.pendingFrequencyChange = true;
29
+ this.scheduleRun();
30
+ });
31
+ // Clear hidden variant field on submit if there are no visible premium items
32
+ this._enForm.onSubmit.subscribe(() => {
33
+ if (!this.hasVisiblePremiumItems()) {
34
+ this.clearVariantField();
35
+ }
36
+ });
37
+ }
38
+ shouldRun() {
39
+ const isPremiumPage = "pageJson" in window &&
40
+ "pageType" in window.pageJson &&
41
+ window.pageJson.pageType === "premiumgift";
42
+ const hasConfig = !!ENGrid.getOption("CustomPremium");
43
+ return isPremiumPage && hasConfig;
44
+ }
45
+ get config() {
46
+ const cfg = ENGrid.getOption("CustomPremium");
47
+ return cfg || null;
48
+ }
49
+ get premiumContainer() {
50
+ return document.querySelector(".en__component--premiumgiftblock");
51
+ }
52
+ get giftItems() {
53
+ return Array.from(document.querySelectorAll(".en__pg"));
54
+ }
55
+ getFrequencyConfig(frequency) {
56
+ const customPremiumConfig = this.config;
57
+ if (!customPremiumConfig)
58
+ return null;
59
+ const frequencyConfig = customPremiumConfig[frequency];
60
+ if (frequencyConfig && typeof frequencyConfig === "object")
61
+ return frequencyConfig;
62
+ return null;
63
+ }
64
+ getProductsMap(frequency) {
65
+ const frequencyConfig = this.getFrequencyConfig(frequency);
66
+ const productsMap = {};
67
+ if (!frequencyConfig)
68
+ return productsMap;
69
+ // If explicit products object exists, use it
70
+ if (frequencyConfig.products &&
71
+ typeof frequencyConfig.products === "object") {
72
+ Object.entries(frequencyConfig.products).forEach(([productId, min]) => {
73
+ const id = String(productId);
74
+ const minAmount = Number(min);
75
+ if (!isNaN(minAmount))
76
+ productsMap[id] = minAmount;
77
+ });
78
+ return productsMap;
79
+ }
80
+ // Otherwise, treat own numeric-value keys as products, ignore 'default'
81
+ Object.entries(frequencyConfig).forEach(([key, value]) => {
82
+ if (key === "default")
83
+ return;
84
+ const minAmount = Number(value);
85
+ if (!isNaN(minAmount))
86
+ productsMap[String(key)] = minAmount;
87
+ });
88
+ return productsMap;
89
+ }
90
+ getConfiguredDefaultPid(frequency) {
91
+ const frequencyConfig = this.getFrequencyConfig(frequency);
92
+ if (!frequencyConfig)
93
+ return null;
94
+ const defaultValue = frequencyConfig.default;
95
+ if (defaultValue === undefined || defaultValue === null)
96
+ return "0"; // not set => No Premium by spec
97
+ const id = String(defaultValue);
98
+ return id;
99
+ }
100
+ injectStyles() {
101
+ if (this.stylesInjected)
102
+ return;
103
+ const id = "engrid-custom-premium-style";
104
+ if (document.getElementById(id)) {
105
+ this.stylesInjected = true;
106
+ return;
107
+ }
108
+ const style = document.createElement("style");
109
+ style.id = id;
110
+ style.innerHTML = `
111
+ .en__component--premiumgiftblock { transition: opacity 200ms ease-in-out; }
112
+ .en__component--premiumgiftblock.engrid-premium-processing { opacity: 0; pointer-events: none; }
113
+ .en__component--premiumgiftblock.engrid-premium-hidden { display: none !important; }
114
+ .en__component--premiumgiftblock.engrid-premium-ready { opacity: 1; }
115
+ `;
116
+ document.head.appendChild(style);
117
+ this.stylesInjected = true;
118
+ }
119
+ startProcessingVisual() {
120
+ const container = this.premiumContainer;
121
+ if (container) {
122
+ container.classList.add("engrid-premium-processing");
123
+ container.classList.remove("engrid-premium-ready");
124
+ }
125
+ }
126
+ endProcessingVisual(hasVisible) {
127
+ const container = this.premiumContainer;
128
+ if (!container)
129
+ return;
130
+ container.classList.remove("engrid-premium-processing");
131
+ if (hasVisible) {
132
+ container.classList.remove("engrid-premium-hidden");
133
+ container.classList.add("engrid-premium-ready");
134
+ }
135
+ else {
136
+ container.classList.add("engrid-premium-hidden");
137
+ container.classList.remove("engrid-premium-ready");
138
+ }
139
+ }
140
+ scheduleRun() {
141
+ // Immediately fade out while we wait for EN to re-render
142
+ this.startProcessingVisual();
143
+ if (this.debounceTimer)
144
+ window.clearTimeout(this.debounceTimer);
145
+ this.debounceTimer = window.setTimeout(() => this.run(), 500);
146
+ }
147
+ getCurrentFreq() {
148
+ return (this._frequency.frequency || "onetime").toLowerCase();
149
+ }
150
+ getCurrentAmount() {
151
+ return this._amount.amount || 0;
152
+ }
153
+ getAllowedProductIds(freq, amount) {
154
+ const cfg = this.config;
155
+ const allowed = new Set();
156
+ if (!cfg)
157
+ return allowed;
158
+ const products = this.getProductsMap(freq);
159
+ Object.keys(products).forEach((pid) => {
160
+ const min = Number(products[pid]);
161
+ if (!isNaN(min) && amount >= min)
162
+ allowed.add(String(pid));
163
+ });
164
+ return allowed;
165
+ }
166
+ getProductId(item) {
167
+ const input = item.querySelector('input[name="en__pg"]');
168
+ return input ? input.value : null;
169
+ }
170
+ showItem(item, show) {
171
+ item.style.display = show ? "" : "none";
172
+ }
173
+ selectByProductId(productId) {
174
+ const radio = document.querySelector('input[name="en__pg"][value="' + productId + '"]');
175
+ if (radio) {
176
+ radio.checked = true;
177
+ radio.dispatchEvent(new Event("change", { bubbles: true, cancelable: true }));
178
+ // Update EN's selected class if necessary
179
+ const prev = document.querySelector(".en__pg--selected");
180
+ const pg = radio.closest(".en__pg");
181
+ if (prev && prev !== pg)
182
+ prev.classList.remove("en__pg--selected");
183
+ if (pg)
184
+ pg.classList.add("en__pg--selected");
185
+ }
186
+ }
187
+ clearVariantField() {
188
+ ENGrid.setFieldValue("transaction.selprodvariantid", "");
189
+ }
190
+ hasVisiblePremiumItems() {
191
+ // Exclude the "No Premium" (value 0) from count
192
+ return this.giftItems.some((item) => {
193
+ const pid = this.getProductId(item);
194
+ const visible = ENGrid.isVisible(item);
195
+ return visible && pid !== "0";
196
+ });
197
+ }
198
+ run() {
199
+ const container = this.premiumContainer;
200
+ if (!container)
201
+ return this.logger.log("No premium container found.");
202
+ const frequency = this.getCurrentFreq();
203
+ const amount = this.getCurrentAmount();
204
+ const allowedProductIds = this.getAllowedProductIds(frequency, amount);
205
+ // Iterate items and toggle visibility
206
+ let anyVisible = false;
207
+ const items = this.giftItems;
208
+ const noPremiumItems = [];
209
+ items.forEach((item) => {
210
+ const productId = this.getProductId(item);
211
+ if (!productId)
212
+ return;
213
+ if (productId === "0") {
214
+ // track no-premium items but don't decide visibility here — it's always available
215
+ noPremiumItems.push(item);
216
+ this.showItem(item, true);
217
+ return;
218
+ }
219
+ const visible = allowedProductIds.has(productId);
220
+ this.showItem(item, visible);
221
+ if (visible)
222
+ anyVisible = true;
223
+ });
224
+ // If nothing visible (besides no-premium), hide whole container
225
+ const hasVisibleGifts = anyVisible;
226
+ this.endProcessingVisual(hasVisibleGifts);
227
+ // Selection handling
228
+ const current = document.querySelector('input[name="en__pg"]:checked');
229
+ const currentProductId = (current === null || current === void 0 ? void 0 : current.value) || null;
230
+ const defaultProductId = this.getConfiguredDefaultPid(frequency); // may be "0"
231
+ // If current selection is invalid after filtering, apply default logic
232
+ const currentIsValid = currentProductId === "0" ||
233
+ (currentProductId ? allowedProductIds.has(currentProductId) : false);
234
+ if (!currentIsValid) {
235
+ if (defaultProductId &&
236
+ defaultProductId !== "0" &&
237
+ allowedProductIds.has(defaultProductId)) {
238
+ this.selectByProductId(defaultProductId);
239
+ }
240
+ else {
241
+ this.selectByProductId("0");
242
+ this.clearVariantField();
243
+ }
244
+ }
245
+ else {
246
+ // Current selection is valid; only force No Premium if frequency changed and default is 0/missing
247
+ if (this.pendingFrequencyChange &&
248
+ (!defaultProductId || defaultProductId === "0")) {
249
+ if (currentProductId !== "0") {
250
+ this.selectByProductId("0");
251
+ this.clearVariantField();
252
+ }
253
+ }
254
+ }
255
+ // If container hidden (no visible gifts), select No Premium and clear hidden
256
+ if (!hasVisibleGifts) {
257
+ this.selectByProductId("0");
258
+ this.clearVariantField();
259
+ }
260
+ this.logger.log(`Processed gifts for freq=${frequency}, amount=${amount}. Visible gifts: ${hasVisibleGifts ? "yes" : "no"}`);
261
+ // Reset frequency-change flag after processing
262
+ this.pendingFrequencyChange = false;
263
+ }
264
+ }
package/dist/index.d.ts CHANGED
@@ -58,6 +58,7 @@ export * from "./debug-hidden-fields";
58
58
  export * from "./branding-html";
59
59
  export * from "./country-disable";
60
60
  export * from "./premium-gift";
61
+ export * from "./custom-premium";
61
62
  export * from "./digital-wallets";
62
63
  export * from "./mobile-cta";
63
64
  export * from "./live-frequency";
package/dist/index.js CHANGED
@@ -58,6 +58,7 @@ export * from "./debug-hidden-fields";
58
58
  export * from "./branding-html";
59
59
  export * from "./country-disable";
60
60
  export * from "./premium-gift";
61
+ export * from "./custom-premium";
61
62
  export * from "./digital-wallets";
62
63
  export * from "./mobile-cta";
63
64
  export * from "./live-frequency";
@@ -22,6 +22,7 @@ export interface Options {
22
22
  NeverBounceDateField?: string | null;
23
23
  NeverBounceDateFormat?: string;
24
24
  NeverBounceStatusField?: string | null;
25
+ NeverBounceTimeout?: number | null;
25
26
  FreshAddress?: false | {
26
27
  dateField?: string;
27
28
  dateFieldFormat?: string;
@@ -151,6 +152,16 @@ export interface Options {
151
152
  placementQuerySelector?: string | null;
152
153
  excludePageIDs?: string[];
153
154
  };
155
+ CustomPremium?: false | {
156
+ [frequency: string]: ({
157
+ products?: {
158
+ [productId: string]: number;
159
+ };
160
+ default?: number | string;
161
+ } & {
162
+ [productId: string]: number;
163
+ });
164
+ };
154
165
  onLoad?: () => void;
155
166
  onResize?: () => void;
156
167
  onSubmit?: () => void;
@@ -21,6 +21,7 @@ export const OptionsDefaults = {
21
21
  NeverBounceDateField: null,
22
22
  NeverBounceStatusField: null,
23
23
  NeverBounceDateFormat: "MM/DD/YYYY",
24
+ NeverBounceTimeout: 10000,
24
25
  FreshAddress: false,
25
26
  ProgressBar: false,
26
27
  AutoYear: false,
@@ -35,6 +36,7 @@ export const OptionsDefaults = {
35
36
  ENValidators: false,
36
37
  MobileCTA: false,
37
38
  CustomCurrency: false,
39
+ CustomPremium: false,
38
40
  VGS: false,
39
41
  PostalCodeValidator: false,
40
42
  CountryRedirect: false,
@@ -13,6 +13,8 @@ export declare class NeverBounce {
13
13
  private shouldRun;
14
14
  private nbLoaded;
15
15
  private bypassEmails;
16
+ private neverBounceTimeout;
17
+ private neverBounceTimeoutFunc;
16
18
  constructor(apiKey: string, dateField: string | null, statusField: string | null, dateFormat: string | undefined);
17
19
  private init;
18
20
  private clearStatus;
@@ -22,4 +24,9 @@ export declare class NeverBounce {
22
24
  private wrap;
23
25
  private isBypassEmail;
24
26
  private validate;
27
+ /**
28
+ * Clears the backup timeout function if it exists.
29
+ * @private
30
+ */
31
+ private clearTimeout;
25
32
  }
@@ -17,6 +17,8 @@ export class NeverBounce {
17
17
  this.bypassEmails = [
18
18
  "noaddress.ea",
19
19
  ];
20
+ this.neverBounceTimeout = ENGrid.getOption("NeverBounceTimeout") || 10000;
21
+ this.neverBounceTimeoutFunc = null;
20
22
  const searchParams = new URLSearchParams(window.location.search);
21
23
  if (searchParams.has("bypassemailvalidation")) {
22
24
  this.logger.log("Bypass Email Validation Enabled - not running NeverBounce");
@@ -32,6 +34,8 @@ export class NeverBounce {
32
34
  softRejectMessage: "Invalid email",
33
35
  acceptedMessage: "Email validated!",
34
36
  feedback: false,
37
+ // Set NB timeout 1 second than our timeout. Ensures NB response will always be before our timeout if there is not a server error.
38
+ timeout: Math.floor((this.neverBounceTimeout - 1000) / 1000),
35
39
  };
36
40
  ENGrid.loadJS("https://cdn.neverbounce.com/widget/dist/NeverBounce.js");
37
41
  if (this.emailField) {
@@ -94,9 +98,27 @@ export class NeverBounce {
94
98
  const field = document.querySelector('[data-nb-id="' + event.detail.id + '"]');
95
99
  field.addEventListener("nb:loading", function (e) {
96
100
  ENGrid.disableSubmit("Validating Your Email");
101
+ NBClass.setEmailStatus("loading");
102
+ NBClass.clearTimeout();
103
+ NBClass.neverBounceTimeoutFunc = setTimeout(() => {
104
+ NBClass.setEmailStatus("unknown");
105
+ if (NBClass.nbDate) {
106
+ NBClass.nbDate.value = ENGrid.formatDate(new Date(), NBClass.dateFormat);
107
+ }
108
+ if (NBClass.nbStatus) {
109
+ NBClass.nbStatus.value = "unknown";
110
+ }
111
+ ENGrid.enableSubmit();
112
+ window._nb.fields.unregisterListener(NBClass.emailField);
113
+ NBClass.nbLoaded = false;
114
+ NBClass.logger.log("NeverBounce Timeout Reached. Bypassing validation, setting unknown status and removing NB.");
115
+ }, NBClass.neverBounceTimeout);
97
116
  });
98
117
  // Never Bounce: Do work when input changes or when API responds with an error
99
118
  field.addEventListener("nb:clear", function (e) {
119
+ if (!NBClass.nbLoaded)
120
+ return;
121
+ NBClass.clearTimeout();
100
122
  NBClass.setEmailStatus("clear");
101
123
  ENGrid.enableSubmit();
102
124
  if (NBClass.nbDate)
@@ -106,6 +128,9 @@ export class NeverBounce {
106
128
  });
107
129
  // Never Bounce: Do work when results have an input that does not look like an email (i.e. missing @ or no .com/.net/etc...)
108
130
  field.addEventListener("nb:soft-result", function (e) {
131
+ if (!NBClass.nbLoaded)
132
+ return;
133
+ NBClass.clearTimeout();
109
134
  NBClass.setEmailStatus("soft-result");
110
135
  if (NBClass.nbDate)
111
136
  NBClass.nbDate.value = "";
@@ -115,6 +140,9 @@ export class NeverBounce {
115
140
  });
116
141
  // Never Bounce: When results have been received
117
142
  field.addEventListener("nb:result", function (e) {
143
+ if (!NBClass.nbLoaded)
144
+ return;
145
+ NBClass.clearTimeout();
118
146
  if (e.detail.result.is(window._nb.settings.getAcceptedStatusCodes())) {
119
147
  NBClass.setEmailStatus("valid");
120
148
  if (NBClass.nbDate)
@@ -263,4 +291,14 @@ export class NeverBounce {
263
291
  this.form.validate = false;
264
292
  }
265
293
  }
294
+ /**
295
+ * Clears the backup timeout function if it exists.
296
+ * @private
297
+ */
298
+ clearTimeout() {
299
+ if (this.neverBounceTimeoutFunc) {
300
+ clearTimeout(this.neverBounceTimeoutFunc);
301
+ this.neverBounceTimeoutFunc = null;
302
+ }
303
+ }
266
304
  }
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const AppVersion = "0.22.17";
1
+ export declare const AppVersion = "0.22.19";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const AppVersion = "0.22.17";
1
+ export const AppVersion = "0.22.19";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@4site/engrid-scripts",
3
- "version": "0.22.17",
3
+ "version": "0.22.19",
4
4
  "description": "Scripts for the ENGRID Project",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -25,7 +25,7 @@
25
25
  "strongly-typed-events": "^2.0.9"
26
26
  },
27
27
  "homepage": "https://github.com/4site-interactive-studios/engrid#readme",
28
- "gitHead": "e5c02e6aa5b48df75e149d7fbf4a0a864beb16cb",
28
+ "gitHead": "e89f60c9d2dda8c1d2f42eb611a0a10c835f6e88",
29
29
  "devDependencies": {
30
30
  "nodemon": "^2.0.20"
31
31
  }