April 30, 2026
b3f8e93d72da2f7e93da161e4435245e86fcdf685a9569403c4904ba5bca2406 Previous:
e35faefd Bundle: 88.7 KB Internal refactoring of private field utilities with a minor defensive hasOwnProperty improvement.
Highlights
- The private field access guard in _utilities.js was updated to use {}.hasOwnProperty.call instead of Object.prototype.hasOwnProperty.call, making it more resilient to prototype pollution.
- Internal private field helpers were renamed and reorganized in _utilities.js: the counter variable and key-creation and field-check functions swapped names.
- _bootstrap.js was updated to call the renamed private field helpers privateKeyCounter and checkPrivateField consistently.
Infrastructure Changes
REPORT.md +3 -3
@@ -1,6 +1,6 @@
# Shopify App Bridge — Unminification Report
Generated: 2026-04-22T08:31:20.292Z
Generated: 2026-04-30T08:43:10.147Z
## Files
@@ -8,7 +8,7 @@ Generated: 2026-04-22T08:31:20.292Z
|------|------|-------|------|
| _bootstrap.js | 31.8KB | 1119 | Infrastructure |
| _remote-ui.js | 6.0KB | 255 | Infrastructure |
| _utilities.js | 69.2KB | 2574 | Infrastructure |
| _utilities.js | 69.1KB | 2574 | Infrastructure |
| _web-vitals.js | 11.6KB | 527 | Infrastructure |
| analytics.js | 211B | 11 | Module |
| app.js | 346B | 15 | Module |
@@ -46,7 +46,7 @@ Generated: 2026-04-22T08:31:20.292Z
| user.js | 940B | 37 | Module |
| visibility.js | 973B | 34 | Module |
| web-vitals.js | 1.8KB | 64 | Module |
| **Total** | **169.7KB** | **6449** | |
| **Total** | **169.6KB** | **6449** | |
## Pipeline Stages
modules/_bootstrap.js +9 -9
@@ -171,8 +171,8 @@
const c = (function (t = false) {
let n = null;
let e = t ? null : new Set();
var i = createPrivateKey('value');
var i = checkPrivateField('value');
var o = createPrivateKey('callbacks');
var o = checkPrivateField('callbacks');
class r {
constructor(t) {
var n;
@@ -184,24 +184,24 @@
writable: true,
value: new Set(),
});
checkPrivateField(this, i)[i] = t;
privateKeyCounter(this, i)[i] = t;
if (!((n = e) == null)) {
n.add(this);
}
}
get value() {
return checkPrivateField(this, i)[i];
return privateKeyCounter(this, i)[i];
}
set value(t) {
if (t !== checkPrivateField(this, i)[i]) {
if (t !== privateKeyCounter(this, i)[i]) {
checkPrivateField(this, i)[i] = t;
privateKeyCounter(this, i)[i] = t;
checkPrivateField(this, o)[o].forEach((n) => n(t));
privateKeyCounter(this, o)[o].forEach((n) => n(t));
}
}
subscribe(t) {
checkPrivateField(this, o)[o].add(t);
privateKeyCounter(this, o)[o].add(t);
return () => {
checkPrivateField(this, o)[o].delete(t);
privateKeyCounter(this, o)[o].delete(t);
};
}
}
modules/_utilities.js +6 -6
@@ -558,15 +558,15 @@ function gt(t) {
}
}
}
var privateKeyCounter = 0;
function privateKeyCounter(t, n) {
function createPrivateKey(t) {
if (!{}.hasOwnProperty.call(t, n))
return `__private_${privateKeyCounter++}_${t}`;
}
function checkPrivateField(t, n) {
if (!Object.prototype.hasOwnProperty.call(t, n))
throw new TypeError('attempted to use private field on non-instance');
return t;
}
var createPrivateKey = 0;
function checkPrivateField(t) {
return `__private_${createPrivateKey++}_${t}`;
}
const interceptProperty = Symbol();
function ORIGINAL_SYMBOL(t, n, e) {
const i = t[n];