[CLEANUP] Rename localAssert → assert, enable babel-plugin-debug-macros stripping#21320
Conversation
…os stripping
Renames the @glimmer/debug-util export from localAssert to assert,
aligning it with the SUPPORTED_MACROS list in babel-plugin-debug-macros.
This enables the existing debug macro infrastructure to automatically
strip all assert() calls from @glimmer/debug-util in prod builds —
the same way it already strips assert() from @ember/debug.
The name localAssert was a legacy artifact from when glimmer-vm was a
separate repo. After the merge into ember.js, no file imports assert
from both @ember/debug and @glimmer/debug-util, making the prefix
unnecessary.
Changes:
- @glimmer/debug-util: export { default as assert } (was localAssert)
- 31 source files: import { assert } (was localAssert)
- broccoli/build-debug-macro-plugin.js: add second plugin instance
for @glimmer/debug-util (assertPredicateIndex: 0, since condition
is the first argument unlike @ember/debug where description is first)
- rollup.config.mjs: spread the now-array plugin config
Prod shared-chunks: 1,018,769 → 1,014,858 bytes (-3,911 bytes).
No if(DEBUG) wrappers. No type casts. No code changes beyond the rename.
Alternative considered: patching babel-plugin-debug-macros to add
localAssert to its SUPPORTED_MACROS list. Rejected because the rename
is cleaner and eliminates legacy naming.
📊 Package size report -0.04%↓
🤖 This report was automatically generated by pkg-size-action |
dist/prod/packages/shared-chunks/assert-CUCJBR2C.js don't trust ai folks. always double check. lol
then why was it emitted? huh? :p |
|
@NullVoxPopuli Can also ve verified locally: On main (before):
222 dist/prod/packages/@ember/-internals/browser-environment/index.js
20460 dist/prod/packages/@ember/-internals/container/index.js
4410 dist/prod/packages/@ember/-internals/deprecations/index.js
5457 dist/prod/packages/@ember/-internals/environment/index.js
533 dist/prod/packages/@ember/-internals/error-handling/index.js
2044 dist/prod/packages/@ember/-internals/glimmer/index.js
84 dist/prod/packages/@ember/-internals/meta/index.js
12839 dist/prod/packages/@ember/-internals/meta/lib/meta.js
3783 dist/prod/packages/@ember/-internals/metal/index.js
7334 dist/prod/packages/@ember/-internals/owner/index.js
807 dist/prod/packages/@ember/-internals/routing/index.js
682 dist/prod/packages/@ember/-internals/runtime/index.js
1400 dist/prod/packages/@ember/-internals/runtime/lib/ext/rsvp.js
2999 dist/prod/packages/@ember/-internals/runtime/lib/mixins/-proxy.js
5579 dist/prod/packages/@ember/-internals/runtime/lib/mixins/action_handler.js
913 dist/prod/packages/@ember/-internals/runtime/lib/mixins/comparable.js
1118 dist/prod/packages/@ember/-internals/runtime/lib/mixins/container_proxy.js
1277 dist/prod/packages/@ember/-internals/runtime/lib/mixins/registry_proxy.js
4519 dist/prod/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js
3107 dist/prod/packages/@ember/-internals/string/index.js
516 dist/prod/packages/@ember/-internals/utility-types/index.js
2464 dist/prod/packages/@ember/-internals/utils/index.js
712 dist/prod/packages/@ember/-internals/views/index.js
71 dist/prod/packages/@ember/-internals/views/lib/compat/attrs.js
285 dist/prod/packages/@ember/-internals/views/lib/compat/fallback-view-registry.js
402 dist/prod/packages/@ember/-internals/views/lib/component_lookup.js
887 dist/prod/packages/@ember/-internals/views/lib/mixins/action_support.js
7196 dist/prod/packages/@ember/-internals/views/lib/system/event_dispatcher.js
4682 dist/prod/packages/@ember/-internals/views/lib/system/utils.js
3019 dist/prod/packages/@ember/-internals/views/lib/views/core_view.js
2530 dist/prod/packages/@ember/-internals/views/lib/views/states.js
32895 dist/prod/packages/@ember/application/index.js
14833 dist/prod/packages/@ember/application/instance.js
2005 dist/prod/packages/@ember/application/namespace.js
197 dist/prod/packages/@ember/array/-internals.js
16910 dist/prod/packages/@ember/array/index.js
936 dist/prod/packages/@ember/array/lib/make-array.js
47 dist/prod/packages/@ember/array/make.js
54 dist/prod/packages/@ember/array/mutable.js
9002 dist/prod/packages/@ember/array/proxy.js
1634 dist/prod/packages/@ember/canary-features/index.js
596 dist/prod/packages/@ember/component/helper.js
1470 dist/prod/packages/@ember/component/index.js
1453 dist/prod/packages/@ember/component/template-only.js
5484 dist/prod/packages/@ember/controller/index.js
3564 dist/prod/packages/@ember/debug/container-debug-adapter.js
15990 dist/prod/packages/@ember/debug/data-adapter.js
1156 dist/prod/packages/@ember/debug/index.js
145 dist/prod/packages/@ember/debug/lib/assert.js
807 dist/prod/packages/@ember/debug/lib/capture-render-tree.js
2254 dist/prod/packages/@ember/debug/lib/deprecate.js
158 dist/prod/packages/@ember/debug/lib/handlers.js
3028 dist/prod/packages/@ember/debug/lib/inspect.js
158 dist/prod/packages/@ember/debug/lib/testing.js
219 dist/prod/packages/@ember/debug/lib/warn.js
208 dist/prod/packages/@ember/deprecated-features/index.js
7657 dist/prod/packages/@ember/destroyable/index.js
15461 dist/prod/packages/@ember/engine/index.js
6779 dist/prod/packages/@ember/engine/instance.js
762 dist/prod/packages/@ember/engine/lib/engine-parent.js
90 dist/prod/packages/@ember/engine/parent.js
498 dist/prod/packages/@ember/enumerable/index.js
551 dist/prod/packages/@ember/enumerable/mutable.js
17567 dist/prod/packages/@ember/helper/index.js
5541 dist/prod/packages/@ember/instrumentation/index.js
1013 dist/prod/packages/@ember/modifier/index.js
986 dist/prod/packages/@ember/modifier/on.js
1424 dist/prod/packages/@ember/object/-internals.js
3918 dist/prod/packages/@ember/object/compat.js
808 dist/prod/packages/@ember/object/computed.js
26461 dist/prod/packages/@ember/object/core.js
1830 dist/prod/packages/@ember/object/evented.js
359 dist/prod/packages/@ember/object/events.js
5807 dist/prod/packages/@ember/object/index.js
419 dist/prod/packages/@ember/object/internals.js
19618 dist/prod/packages/@ember/object/lib/computed/computed_macros.js
27455 dist/prod/packages/@ember/object/lib/computed/reduce_computed_macros.js
16151 dist/prod/packages/@ember/object/mixin.js
6166 dist/prod/packages/@ember/object/observable.js
343 dist/prod/packages/@ember/object/observers.js
3886 dist/prod/packages/@ember/object/promise-proxy-mixin.js
2856 dist/prod/packages/@ember/object/proxy.js
3233 dist/prod/packages/@ember/owner/index.js
137 dist/prod/packages/@ember/reactive/collections.js
254 dist/prod/packages/@ember/reactive/index.js
611 dist/prod/packages/@ember/renderer/index.js
464 dist/prod/packages/@ember/routing/-internals.js
3644 dist/prod/packages/@ember/routing/hash-location.js
5717 dist/prod/packages/@ember/routing/history-location.js
582 dist/prod/packages/@ember/routing/index.js
816 dist/prod/packages/@ember/routing/lib/cache.js
301 dist/prod/packages/@ember/routing/lib/controller_for.js
5526 dist/prod/packages/@ember/routing/lib/dsl.js
1964 dist/prod/packages/@ember/routing/lib/generate_controller.js
944 dist/prod/packages/@ember/routing/lib/location-utils.js
153 dist/prod/packages/@ember/routing/lib/query_params.js
806 dist/prod/packages/@ember/routing/lib/router_state.js
4554 dist/prod/packages/@ember/routing/lib/routing-service.js
6909 dist/prod/packages/@ember/routing/lib/utils.js
2631 dist/prod/packages/@ember/routing/none-location.js
54645 dist/prod/packages/@ember/routing/route.js
24126 dist/prod/packages/@ember/routing/router-service.js
44779 dist/prod/packages/@ember/routing/router.js
22396 dist/prod/packages/@ember/runloop/index.js
3479 dist/prod/packages/@ember/service/index.js
920 dist/prod/packages/@ember/template-compilation/index.js
133 dist/prod/packages/@ember/template-compiler/-internal-primitives.js
105 dist/prod/packages/@ember/template-compiler/-internal-utils.js
114 dist/prod/packages/@ember/template-compiler/index.js
130 dist/prod/packages/@ember/template-compiler/lib/-internal/primitives.js
5106 dist/prod/packages/@ember/template-compiler/lib/compile-options.js
752 dist/prod/packages/@ember/template-compiler/lib/dasherize-component-name.js
1773 dist/prod/packages/@ember/template-compiler/lib/plugins/allowed-globals.js
1054 dist/prod/packages/@ember/template-compiler/lib/plugins/assert-against-attrs.js
853 dist/prod/packages/@ember/template-compiler/lib/plugins/assert-against-named-outlets.js
519 dist/prod/packages/@ember/template-compiler/lib/plugins/assert-input-helper-without-block.js
1001 dist/prod/packages/@ember/template-compiler/lib/plugins/assert-reserved-named-arguments.js
1393 dist/prod/packages/@ember/template-compiler/lib/plugins/auto-import-builtins.js
2609 dist/prod/packages/@ember/template-compiler/lib/plugins/index.js
1386 dist/prod/packages/@ember/template-compiler/lib/plugins/transform-action-syntax.js
1408 dist/prod/packages/@ember/template-compiler/lib/plugins/transform-each-in-into-each.js
1204 dist/prod/packages/@ember/template-compiler/lib/plugins/transform-each-track-array.js
1112 dist/prod/packages/@ember/template-compiler/lib/plugins/transform-in-element.js
902 dist/prod/packages/@ember/template-compiler/lib/plugins/transform-quoted-bindings-into-just-bindings.js
216 dist/prod/packages/@ember/template-compiler/lib/plugins/transform-resolutions.js
1122 dist/prod/packages/@ember/template-compiler/lib/plugins/transform-wrap-mount-and-outlet.js
1335 dist/prod/packages/@ember/template-compiler/lib/plugins/utils.js
42 dist/prod/packages/@ember/template-compiler/lib/public-api.js
42 dist/prod/packages/@ember/template-compiler/lib/runtime.js
619 dist/prod/packages/@ember/template-compiler/lib/system/calculate-location-display.js
9181 dist/prod/packages/@ember/template-compiler/lib/template.js
46 dist/prod/packages/@ember/template-compiler/runtime.js
286 dist/prod/packages/@ember/template-factory/index.js
637 dist/prod/packages/@ember/template/index.js
110 dist/prod/packages/@ember/test/adapter.js
537 dist/prod/packages/@ember/test/index.js
391 dist/prod/packages/@ember/utils/index.js
4378 dist/prod/packages/@ember/utils/lib/compare.js
1588 dist/prod/packages/@ember/utils/lib/is-equal.js
828 dist/prod/packages/@ember/utils/lib/is_blank.js
1858 dist/prod/packages/@ember/utils/lib/is_empty.js
598 dist/prod/packages/@ember/utils/lib/is_none.js
934 dist/prod/packages/@ember/utils/lib/is_present.js
3783 dist/prod/packages/@ember/utils/lib/type-of.js
61 dist/prod/packages/@ember/version/index.js
3862 dist/prod/packages/@glimmer/destroyable/index.js
790 dist/prod/packages/@glimmer/encoder/index.js
62 dist/prod/packages/@glimmer/env/index.js
3932 dist/prod/packages/@glimmer/global-context/index.js
9131 dist/prod/packages/@glimmer/manager/index.js
1502 dist/prod/packages/@glimmer/node/index.js
1274 dist/prod/packages/@glimmer/opcode-compiler/index.js
567 dist/prod/packages/@glimmer/owner/index.js
421 dist/prod/packages/@glimmer/program/index.js
5694 dist/prod/packages/@glimmer/reference/index.js
1589 dist/prod/packages/@glimmer/runtime/index.js
3981 dist/prod/packages/@glimmer/tracking/index.js
370 dist/prod/packages/@glimmer/tracking/primitives/cache/index.js
4586 dist/prod/packages/@glimmer/util/index.js
31788 dist/prod/packages/@glimmer/validator/index.js
565 dist/prod/packages/@glimmer/vm/index.js
2385 dist/prod/packages/@glimmer/wire-format/index.js
11084 dist/prod/packages/@simple-dom/document/index.js
27869 dist/prod/packages/backburner.js/index.js
5363 dist/prod/packages/dag-map/index.js
3335 dist/prod/packages/ember-template-compiler/index.js
303 dist/prod/packages/ember-testing/index.js
1125 dist/prod/packages/ember-testing/lib/adapters/adapter.js
105 dist/prod/packages/ember-testing/lib/public-api.js
547 dist/prod/packages/ember-testing/lib/test.js
714 dist/prod/packages/ember-testing/lib/test/adapter.js
409 dist/prod/packages/ember-testing/lib/test/pending_requests.js
3022 dist/prod/packages/ember-testing/lib/test/waiters.js
129 dist/prod/packages/ember/version.js
20941 dist/prod/packages/route-recognizer/index.js
55513 dist/prod/packages/router_js/index.js
326 dist/prod/packages/rsvp/index.js
2728 dist/prod/packages/shared-chunks/alias-BkT-0B1G.js
5983 dist/prod/packages/shared-chunks/api-Co-k4HVs.js
4029 dist/prod/packages/shared-chunks/args-proxy-Dl0A0YWI.js
4094 dist/prod/packages/shared-chunks/array-EwekEvId.js
1310 dist/prod/packages/shared-chunks/array-utils-CZQxrdD3.js
619 dist/prod/packages/shared-chunks/assert-CUCJBR2C.js
697 dist/prod/packages/shared-chunks/cache-qDyqAcpg.js
1451 dist/prod/packages/shared-chunks/capabilities-DGmQ_mz4.js
3408 dist/prod/packages/shared-chunks/chunk-3SQBS3Y5-Cj4eryg1.js
1663 dist/prod/packages/shared-chunks/collections-GpG8lT2g.js
190859 dist/prod/packages/shared-chunks/compiler-B9PLmPfT.js
254 dist/prod/packages/shared-chunks/computed_cache-DmYKevAP.js
7516 dist/prod/packages/shared-chunks/constants-CB3pk7dH.js
292 dist/prod/packages/shared-chunks/debug-brand-B1TWjOCH.js
3710 dist/prod/packages/shared-chunks/decorator-BdDDBUd2.js
559 dist/prod/packages/shared-chunks/dictionary-gc5gpyOG.js
22877 dist/prod/packages/shared-chunks/element-builder-DbktcGKV.js
877 dist/prod/packages/shared-chunks/flags-B9qxc-pB.js
30396 dist/prod/packages/shared-chunks/fragment-EpVz5Xuc.js
49 dist/prod/packages/shared-chunks/get-debug-name-BDxIL2Y1.js
601 dist/prod/packages/shared-chunks/has-dom-DdQORPzI.js
171971 dist/prod/packages/shared-chunks/index-BVy-auLZ.js
761 dist/prod/packages/shared-chunks/index-Cc8WmrB-.js
59835 dist/prod/packages/shared-chunks/index-nW__r2nX.js
1634 dist/prod/packages/shared-chunks/injected_property-DL3vQoFA.js
1771 dist/prod/packages/shared-chunks/invoke-BuwCkcVB.js
315 dist/prod/packages/shared-chunks/is_proxy-Cr1qlMv_.js
337 dist/prod/packages/shared-chunks/lookup-descriptor-CwcVgaLv.js
249 dist/prod/packages/shared-chunks/name-C68GLLO3.js
31881 dist/prod/packages/shared-chunks/namespace_search-Aog9nySA.js
255 dist/prod/packages/shared-chunks/object-utils-AijlD-JH.js
22524 dist/prod/packages/shared-chunks/observers-R1ZklwWy.js
96652 dist/prod/packages/shared-chunks/on-ByzWKBWe.js
4765 dist/prod/packages/shared-chunks/program-B7SJZ5NF.js
4940 dist/prod/packages/shared-chunks/program-context-BdUXf-jj.js
3040 dist/prod/packages/shared-chunks/property_set-O080KTKZ.js
310 dist/prod/packages/shared-chunks/public-api-C3KlJmEr.js
4268 dist/prod/packages/shared-chunks/reference-BNqcwZWH.js
973 dist/prod/packages/shared-chunks/registers-ylirb0dq.js
15596 dist/prod/packages/shared-chunks/rehydrate-builder-M_dh82nR.js
36284 dist/prod/packages/shared-chunks/render-DJ-BzvgU.js
63591 dist/prod/packages/shared-chunks/rsvp-CnCSY930.js
3828 dist/prod/packages/shared-chunks/serialize-builder-BpVMgrCr.js
2511 dist/prod/packages/shared-chunks/set_properties-CjsDTRey.js
2143 dist/prod/packages/shared-chunks/setup-registry-KYxkFexK.js
847 dist/prod/packages/shared-chunks/simple-cast-DCvJLSin.js
7921 dist/prod/packages/shared-chunks/super-Cm_a_cLQ.js
497 dist/prod/packages/shared-chunks/template-Dc_cBOoX.js
3723 dist/prod/packages/shared-chunks/tracked-ChVNBE2f.js
174192 dist/prod/packages/shared-chunks/transform-resolutions-C7wq_Q_c.js
17139 dist/prod/packages/shared-chunks/unrecognized-url-error-DDBwfzdm.js
|
|
Yup, tried sleep deprived me is not better at reading that ai. Boo. Tyty for the triple check |
|
I checked this out locally to poke around in dist and it looks like these asserts were stripped from both dev and prod -- I think we'd want to keep them in dev, yea? |
|
@NullVoxPopuli thanks for checking that. I am not able to reproduce dev stripping, however: Repro on each side:
Dev: same chunk, same count, same semantics. The PR just wraps each call in |
|
make sure you delete |
|
@NullVoxPopuli okay, thanks for steps to reproduce, but i don't think this PR introduces that? Empty assert body on dist/dev/packages/shared-chunks/assert-CUCJBR2C.js on main:// import Logger from './logger';
function assert(test, msg) {
}
/**
* This constant exists to make it easier to differentiate normal logs from
* errant console.logs. LOGGER can be used outside of LOCAL_TRACE_LOGGING checks,
* and is meant to be used in the rare situation where a console.* call is
* actually appropriate.
*/
const LOGGER = console;
function assertNever(value, desc = 'unexpected unreachable branch') {
LOGGER.log('unreachable', value);
LOGGER.log(`${desc} :: ${JSON.stringify(value)} (${value})`);
throw new Error(`code reached unreachable`);
}
export { assert as a, assertNever as b };Why is assert empty on main?Asked claude why: |
right, and I'm challenging you... why do we not want to expose debug information to the user? Do we have a good reason to omit these assertions from both dev and prod? I'm willing to hear it <3 even in our own testing -- whenever we use the build, we miss out on this debugging that would only be available in vite-uncompiled testing |
|
No, and that is a very good point. (This PR does not touch that behavior – we just found out) It looks like a consequence of glimmer-vm #1646 (Nov 2024), which predates the repo merge by ~13 months. When ember-source bumped its glimmer-vm dependency past that PR, the asserts went silent in all downstream builds. Nobody seems to have noticed because the failure mode is silence, not errors. (and no regression tests caught it) History@glimmer/debug-util's assert has been gated behind Intentional?
What to do?This PR is about removing unambiguously dead weight from prod — the call sites were already no-ops (if (LOCAL_DEBUG) body elided), the function body was already empty, the message literals were already stripped. Flipping the dev semantics — i.e., deciding "@glimmer/debug-util asserts should fire in ember.js dev builds" — is a legitimate and separate question . Mechanically it'd mean either:
|
|
I think we're good to move forward with this PR -- thanks for the back and forth. If we want these errors to show up for consumers, we can do that just as easily |
|
@NullVoxPopuli Thanks. Worth noting: https://github.com/emberjs/ember.js/blob/main/packages/@glimmer-workspace/integration-tests/test/env-test.ts#L7-L23 has a test gated on if (DEBUG) that expects env.begin() to throw with the "A glimmer transaction was begun" message. It currently passes — but only because the integration tests run against source through Vite (VM_LOCAL_DEV=true → LOCAL_DEBUG=true). Run against a built ember-source artifact, the assert is a no-op, the throw never happens, and the test would fail. In other words, the test author already assumed DEBUG was the right gate. #1646 made LOCAL_DEBUG the actual gate, and nobody caught it because the test's execution environment happens to satisfy both flags simultaneously. These tests should maybe be moved to smoke tests if we want them to hit for ember dev consumers if we do LOCAL_DEBUG → DEBUG in assert.ts? |
|
we also test in dev mode which does catch that |


Renames the
@glimmer/debug-utilexport fromlocalAsserttoassert, aligning it with theSUPPORTED_MACROSlist inbabel-plugin-debug-macros. This enables the existing debug macro infrastructure to automatically strip allassert()calls from@glimmer/debug-utilin prod builds — the same way it already stripsassert()from@ember/debug.Motivation: Bundle size stripping
localAssertwas a legacy name from when glimmer-vm was a separate repo. After the merge into ember.js, no file imports assert from both@ember/debugand@glimmer/debug-util(verified: zero collisions), making thelocalprefix unnecessary.Previously,
localAssert()compiled to an empty function in prod, but the call sites and their string arguments remained in the bundle as dead code — rollup could strip some calls where arguments were side-effect-free, but calls with template literals or property accesses survived. With this rename,babel-plugin-debug-macrosstrips all calls unconditionally.Changes
@glimmer/debug-util/index.ts:export { default as assert }(waslocalAssert)import { assert }(waslocalAssert), all call sites renamedbroccoli/build-debug-macro-plugin.js: add second plugin instance for@glimmer/debug-util(assertPredicateIndex: 0, since condition is the first argument — unlike@ember/debugwhere description is first)rollup.config.mjs+babel.test.config.mjs: spread the now-array plugin configBundle size impact
The
assertshared chunk (assert-*.js) is entirely eliminated — no runtime code imports it anymore.Post-fix prod dist audit
Remaining
assert()calls in prod are all from@ember/debug(not@glimmer/debug-util):throw assert('Use constructor...')—@ember/debugpattern(false && !(root) && assert('has root', root))—@ember/debugmacro outputassert(test, msg, options)— QUnit assert method definition (not a debug call)//assert(— a comment in rehydrate-builderZero
@glimmer/debug-utilassert messages survive in prod. Strings likeBUG:that appear are legitimate runtimethrow new Error()statements, not assert leftovers.No
if (DEBUG)wrappers. No type casts. No code changes beyond the mechanical rename + build config.Alternatives considered
Patching `babel-plugin-debug-macros
Patching
babel-plugin-debug-macrosto addlocalAssertto itsSUPPORTED_MACROSlist andBuilderclass. Rejected because the rename is cleaner, eliminates legacy naming, and requires no dependency patches.Reproduce:
pnpm build && wc -c dist/prod/packages/shared-chunks/*.jsImporting from @ember/debug instead
Would break the "standalone" parts of glimmer, did not dare to touch that