Skip to content

TC39 migration: flip experimentalDecorators to Stage 3 decorators (atomic)#18647

Open
RaananW wants to merge 21 commits into
masterfrom
raananw-tc39-pr3-compiler-flip
Open

TC39 migration: flip experimentalDecorators to Stage 3 decorators (atomic)#18647
RaananW wants to merge 21 commits into
masterfrom
raananw-tc39-pr3-compiler-flip

Conversation

@RaananW

@RaananW RaananW commented Jul 1, 2026

Copy link
Copy Markdown
Member

TC39 migration: flip experimentalDecorators → Stage 3 decorators (atomic)

Builds on merged #18631 (Symbol.metadata serialization store) and #18630 (Native ES5 downlevel pipeline). This PR flips the single root-level experimentalDecorators flag off, switching the entire monorepo to TC39 Stage 3 decorator semantics in one atomic change, and converts every decorator implementation + accessor call-site accordingly.

Per-commit breakdown

  1. core-infradecorators.ts TC39 signatures (ClassAccessorDecoratorResult), decorators.functions.tscontext.metadata/GetDirectStoreFromMetadata; tsconfig.json/tsconfig.build.json/tsconfig.test.json (drop experimentalDecorators, add esnext.decorators/es2022.object libs).
  2. core-materialsaccessor keyword on every @expandToProperty site in dev/core; openpbrMaterial @addAccessorsForMaterialProperty new accessor pattern.
  3. materials-lib — accessor conversions across dev/materials/src/*.
  4. guifluentMaterial.pure.ts accessor conversions.
  5. serializers-3mf — 3MF XmlName/XmlAttr/XmlElem/XmlIgnore → TC39 context.metadata + AddXmlMeta/GetXmlFieldMeta.
  6. test-infra — vitest esbuild useDefineForClassFields class-field semantics + Symbol.metadata polyfill in setup.
  7. node-editor-toolingnodeDecorator.ts _propStoreSymbol.metadata + exported GetEditableProperties(); smartFilters editableInPropertyPage + GetSmartFilterEditableProperties(); editor consumers updated.
  8. lit-vieweraccessor on viewer Lit @property/@state/@query; @query| null; @property on environment moved to setter.
  9. playground-tooling — drop experimentalDecorators from Monaco tsPipeline.ts + snippetLoader.ts.
  10. build-tools — use installed tslib for UMD helpers + Dirent type fix.
  11. node-editor-tooling — defer WebCamInputBlock self-reference in decorator arg (TS2449 arrow-wrap).
  12. tests — port decorator + accessor behavior coverage.
  13. decorators — run the Symbol.metadata polyfill before decorated classes in all entry styles (barrel/deep/pure) via a module-load-anchored const in the decorator infra.
  14. class-fieldsdeclare (not override) the two fields clobbered by base-constructor init (see rationale below).
  15. native-downlevel — build the 8 UMD targets at es2015 and downlevel to ES5 for Chakra via ts.transpileModule (not Babel) — see Native resolution below.

Breaking changes for consumers

  • accessor keyword required on any class member decorated with @expandToProperty or @addAccessorsForMaterialProperty (these are ClassAccessorDecorators under TC39).
  • _propStore removed — use exported GetEditableProperties() / GetSmartFilterEditableProperties() instead.
  • Symbol.metadata replaces class-name maps for decorator metadata.

The 8 UMD build targets move from ES5 to es2015 (TC39 accessor requires es2015+; tsc rejects an ES5 target for accessor source with TS18045, and esbuild refuses ES5 for classes). Consumers (Playground, Sandbox, npm) get the es2015 UMD directly. Babylon Native, which needs ES5 for Chakra, gets a dedicated ES5 downlevel of the built bundle — see below.

overridedeclare rationale (commit 14)

Under TC39, decorators force useDefineForClassFields (native define semantics). A type-only override field with no initializer previously emitted nothing; under define semantics it would emit a field that clobbers a base-constructor-set value with undefined. In practice only two fields are actually created by a base constructor and get clobbered this way — FreeCamera.movement and FlyCamera.movement (both created by the TargetCamera constructor) — so only those two are converted to type-only declare narrowings. declare also emits nothing, so the conversion is provably behavior-identical to the old compiler while remaining correct under define semantics.

A blanket overridedeclare sweep (~136 fields) was considered and rejected to keep the diff reviewable: the minimal fix is what the full unit suite requires, and the type checker + unit suite guard against any future regression if a new narrowing field ever starts clobbering a base value.

Pure-entry metadata fix (commit 13)

tsc's TC39 emit computes context.metadata from Symbol.metadata at the top of each class static {} block, before the decorator factory runs. The polyfill was only imported by the barrel (index.ts), so @babylonjs/core/pure (which eagerly evaluates decorated FrameGraph/node blocks) saw context.metadata === undefined and every scene crashed at load (ES6 visualization timeouts). Fix: an exported module-load const MetadataSymbol = GetMetadataSymbol() in decorators.functions.ts, referenced by the retained decorator helpers, so the polyfill runs before any importing class body — in every entry style. The const X = fn() idiom keeps the module classified pure by the side-effect detector and is preserved by bundlers when reachable, so tree-shaking is unaffected.

Native (Chakra) resolution

TC39 accessor requires an es2015+ target (tsc emits TS18045 for accessor at an ES5 target, and esbuild refuses ES5 for classes), so the 8 UMD tsconfigs build at es2015. Babylon Native runs the built babylon.max.js under an (archived) ChakraCore build. A first attempt reused the PR2 @babel/preset-env pass to re-lower es2015→ES5, but Babel emits _wrapNativeSuper + Reflect.construct + _isNativeReflectConstruct for classes that extend native built-ins (Error, Array). Those helpers execute at class-definition (load) time and hard-crash this Chakra build (exit 3, uncatchable — no JS stack). V8/node tolerate them, so the crash is invisible locally and es-check (parse-only) does not catch it.

Fix: scripts/downlevelNativeScripts.mjs now downlevels the built UMD with ts.transpileModule targeting ES5 instead of Babel. tsc lowers classes with __extends and never emits Reflect.construct/_wrapNativeSuper, matching the ES5 emit master has shipped to Chakra for years. Verified locally on the built babylon.max.js: the downleveled output passes es-check es5, loads in node, and contains zero Reflect.construct/_wrapNativeSuper occurrences. (transpileModule — syntactic transpile, no type-check — is used because a full tsc check overflows on the multi-MB single-file bundle; syntactic lowering is exactly what a downlevel needs.)

Validation

Check Result
format:check ✅ PASS
lint:check (eslint + treeshaking + side-effects-sync) ✅ PASS
check:treeshaking-all (16/16) ✅ PASS
build:es6 ✅ PASS
build:umd (es2015) ✅ PASS
test:unit ✅ 4144 pass / 1 expected-fail
ES6 visualization (all scenes) ✅ PASS on CI
Playground / Sandbox CI ✅ PASS on CI
TypeDoc / comment-analyzer ✅ PASS on CI
Native babylon.max.jsts.transpileModule ES5 downlevel + es-check es5 ✅ PASS (0 Reflect.construct/_wrapNativeSuper, loads in node)
Residual experimentalDecorators (source) ✅ none

RaananW and others added 9 commits July 1, 2026 22:47
Rewrite Misc/decorators.ts serialize*/expandToProperty/nativeOverride/
addAccessorsForMaterialProperty to TC39 Stage 3 decorator signatures
(returning ClassAccessorDecoratorResult where needed). Add
GetDirectStoreFromMetadata to decorators.functions.ts for the TC39
context.metadata write path. Drop experimentalDecorators and set
useDefineForClassFields:false in tsconfig.json/tsconfig.build.json, add
esnext.decorators lib; add esnext.decorators + es2022.object to test lib.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add the accessor keyword to every @expandToProperty member across
packages/dev/core (materials, PBR, lights, rendering,
BakedVertexAnimation, standardMaterial, post-processes, layers,
cameras, node blocks). Flip openpbrMaterial addAccessorsForMaterialProperty
to the TC39 accessor pattern with explicit private backing fields.

Edge cases: wrap self-referencing decorator args in arrow functions for
deferred evaluation (LightBlock, ReflectionTextureBaseBlock,
PBRMetallicRoughnessBlock); imageProcessing.ts mixin registers
serialization metadata directly via GetDirectStoreFromMetadata;
restructure @expandToProperty on explicit getters in
backgroundMaterial and pbrSubSurfaceConfiguration.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ites

Add the accessor keyword to every @expandToProperty member across the
standalone material packages (cell, fire, fur, gradient, grid, lava,
mix, normal, simple, terrain, triPlanar, water).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add the accessor keyword to the @expandToProperty members in
fluentMaterial.pure.ts.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Rewrite XmlName/XmlAttr/XmlElem/XmlIgnore to TC39 decorator signatures
that store field metadata via context.metadata, and rewrite
AddXmlMeta/GetXmlFieldMeta to read from Symbol.metadata (walking the
metadata prototype chain). Add a Symbol.metadata polyfill side-effect
import so the decorated 3MF classes work under tree-shaken core imports.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ta polyfill

Configure vitest's esbuild transform with target es2021 and
useDefineForClassFields:false so TC39 accessor decorators and class
field assignment semantics match the tsc build. Polyfill Symbol.metadata
in vitest.setup.ts because Node does not expose it natively yet.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
… props

Rewrite nodeDecorator.editableInPropertyPage and the smart filters
EditableInPropertyPage decorator to store editable-property descriptors
on context.metadata, and add GetEditableProperties /
GetSmartFilterEditableProperties helpers that walk the metadata prototype
chain. Update the node/geometry/render-graph/particle/smart-filters
editor property components, graphNode.ts, and inputNodePropertyComponent
to read via the helpers instead of _propStore. customShaderBlock applies
the decorator manually against Symbol.metadata. Fix flowGraphEditor
RenderGenericPropStoreSections drift and the GUI editor String.at usage
(bracket index). Add defensive Symbol.metadata polyfill imports for
tree-shaken smart filter consumers.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add the accessor keyword to all @property/@state/@query fields in the
viewer Lit elements, type @query fields as | null, and move the
@Property decorator on the environment property from the getter to the
setter (accessor decorators cannot target a getter/setter pair). Add a
Symbol.metadata polyfill import to the viewer package index because the
viewer deep-imports core modules and bypasses core/index's polyfill.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…pet transpilers

Remove experimentalDecorators/emitDecoratorMetadata from the Monaco
tsPipeline and snippetLoader compiler options so playground and snippet
transpilation use TC39 Stage 3 decorator semantics like the rest of the repo.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@bjsplat

bjsplat commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

Please make sure to label your PR with "bug", "new feature" or "breaking change" label(s).
To prevent this PR from going to the changelog marked it with the "skip changelog" label.

@bjsplat

bjsplat commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

Building or testing the sandbox has failed.

If the tests failed, results can be found here:
https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/SANDBOX/refs/pull/18647/merge/testResults/

@bjsplat

bjsplat commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

Snapshot stored with reference name:
refs/pull/18647/merge

Test environment:
https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/refs/pull/18647/merge/index.html

To test a playground add it to the URL, for example:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/refs/pull/18647/merge/index.html#WGZLGJ#4600

Links to test your changes to core in the published versions of the Babylon tools (does not contain changes you made to the tools themselves):

https://playground.babylonjs.com/?snapshot=refs/pull/18647/merge
https://sandbox.babylonjs.com/?snapshot=refs/pull/18647/merge
https://gui.babylonjs.com/?snapshot=refs/pull/18647/merge
https://nme.babylonjs.com/?snapshot=refs/pull/18647/merge

To test the snapshot in the playground with a playground ID add it after the snapshot query string:

https://playground.babylonjs.com/?snapshot=refs/pull/18647/merge#BCU1XR#0

If you made changes to the sandbox or playground in this PR, additional comments will be generated soon containing links to the dev versions of those tools.

@bjsplat

bjsplat commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

Smart Filters Editor is available to test at:
https://sfe.babylonjs.com/?snapshot=refs/pull/18647/merge

@bjsplat

bjsplat commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

@bjsplat

bjsplat commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

You have made possible changes to the playground.
You can test the snapshot here:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/18647/merge/

The snapshot playground with the CDN snapshot (only when available):

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/18647/merge/?snapshot=refs/pull/18647/merge

Note that neither Babylon scenes nor textures are uploaded to the snapshot directory, so some playgrounds won't work correctly.

@bjsplat

bjsplat commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

🟢 Memory Leak Test Results

4 passed, 0 leaked out of 4 scenarios

🟢 All memory leak tests passed — no leaks detected.

Passed Scenarios (4)
Scenario Package
Core Playground #2FDQT5#1508 @babylonjs/core
Core Playground #T90MQ4#14 @babylonjs/core
Core Playground #8EDB5N#2 @babylonjs/core
Core Playground #LL5BIQ#636 @babylonjs/core

@bjsplat

bjsplat commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

@bjsplat

bjsplat commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

@bjsplat

bjsplat commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

⚡ Performance Test Results

🟢 All performance tests passed — no regressions detected.

@RaananW RaananW force-pushed the raananw-tc39-pr3-compiler-flip branch from 4ff0ba9 to c9a4db9 Compare July 2, 2026 08:54
@azure-pipelines

Copy link
Copy Markdown

1 similar comment
@azure-pipelines

Copy link
Copy Markdown

@bjsplat

bjsplat commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

Smart Filters Editor is available to test at:
https://sfe.babylonjs.com/?snapshot=refs/pull/18647/merge

@bjsplat

bjsplat commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

You have changed file(s) that made possible changes to the sandbox.
You can test the sandbox snapshot here:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/SANDBOX/refs/pull/18647/merge/

@bjsplat

bjsplat commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

@bjsplat

bjsplat commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

You have made possible changes to the playground.
You can test the snapshot here:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/18647/merge/

The snapshot playground with the CDN snapshot (only when available):

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/18647/merge/?snapshot=refs/pull/18647/merge

Note that neither Babylon scenes nor textures are uploaded to the snapshot directory, so some playgrounds won't work correctly.

@bjsplat

bjsplat commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

🟢 Memory Leak Test Results

4 passed, 0 leaked out of 4 scenarios

🟢 All memory leak tests passed — no leaks detected.

Passed Scenarios (4)
Scenario Package
Core Playground #2FDQT5#1508 @babylonjs/core
Core Playground #T90MQ4#14 @babylonjs/core
Core Playground #8EDB5N#2 @babylonjs/core
Core Playground #LL5BIQ#636 @babylonjs/core

@bjsplat

bjsplat commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

Comment on lines +101 to +103
// `declare`, not `override`: the value is created by the base TargetCamera constructor. Under TC39
// decorators a plain field redeclaration is materialized as a constructor field-init that runs after
// super() and would clobber that value back to undefined; `declare` keeps this a type-only narrowing.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe include this comment on the other similar ones? I don't think ppl will understand the syntax.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Only two declare sites exist (freeCamera.pure.ts:64 and flyCamera.pure.ts:101) and both already carry the identical comment block.

}

// eslint-disable-next-line @typescript-eslint/naming-convention
const __bjsPropStoreKey = "__bjs_prop_store__";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be cleaner to use a Symbol here?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Staing consistent with __bjsSerializableKey whcih is a string as well. But i don't mind doing that if you feel it is needed

Comment thread packages/dev/core/src/Misc/decorators.ts Outdated
Comment thread packages/dev/core/src/Misc/decorators.ts
RaananW and others added 3 commits July 3, 2026 12:18
…r Vite 8

Vite 8 (#18649) transforms via Rolldown/Oxc, which only lowers legacy
(experimental) decorators and leaves TC39 Stage 3 decorators + the
'accessor' keyword untransformed, causing 'SyntaxError: Invalid or
unexpected token' when Node imports @dev/core in the unit suite. Vite 8
also ignores the 'esbuild' config option entirely.

Add a 'pre' Vite plugin that runs transformWithEsbuild on all non-
node_modules .ts/.tsx files (esbuild does lower TC39 decorators), with
useDefineForClassFields:false to preserve class-field semantics, and set
oxc:false so Rolldown does not re-run its own transform.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Extract the shared resolve-once wrapper into ApplyNativeOverride, used by
both nativeOverride and nativeOverride.filter, removing the copy-paste
introduced during the TC39 conversion while preserving exact call
semantics. Add unit tests covering the JS-only path, native-override
path, resolve-once/prototype-replacement behavior, and the filter
predicate true/false branches (stubbing the _native global).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Graph tools CI has failed you can find the test results at:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/TOOLS/refs/pull/18647/merge/testResults/

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Building or testing the playground has failed.

If the tests failed, results can be found here:
https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/18647/merge/testResults/

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Building or testing the sandbox has failed.

If the tests failed, results can be found here:
https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/SANDBOX/refs/pull/18647/merge/testResults/

The deduped ApplyNativeOverride typed the native function with a 'this: This'
binding, but the filter path invokes it without a this-bind (matching the
original behavior). Cast to a this-less signature so tsc type-checks; the
unit suite missed this because it transforms via esbuild without type-checking.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Please make sure to label your PR with "bug", "new feature" or "breaking change" label(s).
To prevent this PR from going to the changelog marked it with the "skip changelog" label.

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Snapshot stored with reference name:
refs/pull/18647/merge

Test environment:
https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/refs/pull/18647/merge/index.html

To test a playground add it to the URL, for example:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/refs/pull/18647/merge/index.html#WGZLGJ#4600

Links to test your changes to core in the published versions of the Babylon tools (does not contain changes you made to the tools themselves):

https://playground.babylonjs.com/?snapshot=refs/pull/18647/merge
https://sandbox.babylonjs.com/?snapshot=refs/pull/18647/merge
https://gui.babylonjs.com/?snapshot=refs/pull/18647/merge
https://nme.babylonjs.com/?snapshot=refs/pull/18647/merge

To test the snapshot in the playground with a playground ID add it after the snapshot query string:

https://playground.babylonjs.com/?snapshot=refs/pull/18647/merge#BCU1XR#0

If you made changes to the sandbox or playground in this PR, additional comments will be generated soon containing links to the dev versions of those tools.

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Smart Filters Editor is available to test at:
https://sfe.babylonjs.com/?snapshot=refs/pull/18647/merge

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

You have changed file(s) that made possible changes to the sandbox.
You can test the sandbox snapshot here:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/SANDBOX/refs/pull/18647/merge/

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

You have made possible changes to the playground.
You can test the snapshot here:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/18647/merge/

The snapshot playground with the CDN snapshot (only when available):

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/18647/merge/?snapshot=refs/pull/18647/merge

Note that neither Babylon scenes nor textures are uploaded to the snapshot directory, so some playgrounds won't work correctly.

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

🟢 Memory Leak Test Results

4 passed, 0 leaked out of 4 scenarios

🟢 All memory leak tests passed — no leaks detected.

Passed Scenarios (4)
Scenario Package
Core Playground #2FDQT5#1508 @babylonjs/core
Core Playground #T90MQ4#14 @babylonjs/core
Core Playground #8EDB5N#2 @babylonjs/core
Core Playground #LL5BIQ#636 @babylonjs/core

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

⚡ Performance Test Results

🟢 All performance tests passed — no regressions detected.

… 8/Oxc)

The viewer CI tests serve the viewer's own Lit-element source as raw TS
(script type=module src=.../src/index.ts). Under Vite 8 (#18649) the dev
server transforms via Oxc, which only lowers legacy decorators and leaves
TC39 Stage 3 decorators + the 'accessor' keyword untransformed. The browser
then throws 'SyntaxError: Invalid or unexpected token', the babylon-viewer
custom element is never defined, and every Playwright test times out waiting
for the (hidden, un-upgraded) element to become visible.

Mirror the vitest fix in the viewer's vite.config.mjs: set oxc:false and add
a 'pre' plugin that transforms .ts/.tsx via esbuild (which does lower TC39
decorators) with target/useDefineForClassFields matching tsconfig.build.json.
Only the dev test server is affected; the published package is built by tsc.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Smart Filters Editor is available to test at:
https://sfe.babylonjs.com/?snapshot=refs/pull/18647/merge

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

You have changed file(s) that made possible changes to the sandbox.
You can test the sandbox snapshot here:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/SANDBOX/refs/pull/18647/merge/

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

You have made possible changes to the playground.
You can test the snapshot here:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/18647/merge/

The snapshot playground with the CDN snapshot (only when available):

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/18647/merge/?snapshot=refs/pull/18647/merge

Note that neither Babylon scenes nor textures are uploaded to the snapshot directory, so some playgrounds won't work correctly.

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

🟢 Memory Leak Test Results

4 passed, 0 leaked out of 4 scenarios

🟢 All memory leak tests passed — no leaks detected.

Passed Scenarios (4)
Scenario Package
Core Playground #2FDQT5#1508 @babylonjs/core
Core Playground #T90MQ4#14 @babylonjs/core
Core Playground #8EDB5N#2 @babylonjs/core
Core Playground #LL5BIQ#636 @babylonjs/core

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

@bjsplat

bjsplat commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

⚡ Performance Test Results

🟢 All performance tests passed — no regressions detected.

@sebavan

sebavan commented Jul 3, 2026

Copy link
Copy Markdown
Member

Let s merge Monday so we do not have to monitor tomorrow :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants