diff --git a/package.json b/package.json index 1c5dc4c0602..c1f6f54fe80 100644 --- a/package.json +++ b/package.json @@ -390,4 +390,4 @@ } }, "packageManager": "pnpm@10.30.3" -} \ No newline at end of file +} diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts index 0b0da6ec97d..3dff5f3bace 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts @@ -4,7 +4,7 @@ import { getOwner, setOwner, } from '@ember/-internals/owner'; -import { enumerableSymbol, guidFor } from '@ember/-internals/utils'; +import { guidFor } from '@ember/-internals/utils'; import { addChildView, setElementView, setViewElement } from '@ember/-internals/views'; import type { Nullable } from '@ember/-internals/utility-types'; import { assert, debugFreeze } from '@ember/debug'; @@ -53,8 +53,13 @@ import { import ComponentStateBucket from '../utils/curly-component-state-bucket'; import { processComponentArgs } from '../utils/process-args'; -export const ARGS = enumerableSymbol('ARGS'); -export const HAS_BLOCK = enumerableSymbol('HAS_BLOCK'); +const COMPONENT_ARGS_MAP = new WeakMap(); + +export function getComponentCapturedArgs( + component: object +): CapturedArguments['named'] | undefined { + return COMPONENT_ARGS_MAP.get(component); +} export const DIRTY_TAG = Symbol('DIRTY_TAG'); export const IS_DISPATCHING_ATTRS = Symbol('IS_DISPATCHING_ATTRS'); @@ -248,8 +253,7 @@ export default class CurlyComponentManager args: VMArguments, { isInteractive }: Environment, dynamicScope: DynamicScope, - callerSelfRef: Reference, - hasBlock: boolean + callerSelfRef: Reference ): ComponentStateBucket { // Get the nearest concrete component instance from the scope. "Virtual" // components will be skipped. @@ -261,7 +265,6 @@ export default class CurlyComponentManager beginTrackFrame(); let props = processComponentArgs(capturedArgs); - props[ARGS] = capturedArgs; let argsTag = endTrackFrame(); // Alias `id` argument to `elementId` property on the component instance. @@ -271,11 +274,6 @@ export default class CurlyComponentManager // component. props.parentView = parentView; - // Set whether this component was invoked with a block - // (`{{#my-component}}{{/my-component}}`) or without one - // (`{{my-component}}`). - props[HAS_BLOCK] = hasBlock; - // Save the current `this` context of the template as the component's // `_target`, so bubbled actions are routed to the right place. props._target = valueForRef(callerSelfRef); @@ -293,6 +291,10 @@ export default class CurlyComponentManager beginUntrackFrame(); let component = ComponentClass.create(props); + // Store capturedArgs in a WeakMap keyed by the component instance so that + // PROPERTY_DID_CHANGE can look them up + COMPONENT_ARGS_MAP.set(component, capturedArgs); + let finalizer = _instrumentStart('render.component', initialRenderInstrumentDetails, component); // We become the new parentView for downstream components, so save our diff --git a/packages/@ember/-internals/glimmer/lib/component.ts b/packages/@ember/-internals/glimmer/lib/component.ts index e4dbf48c09c..d66842da331 100644 --- a/packages/@ember/-internals/glimmer/lib/component.ts +++ b/packages/@ember/-internals/glimmer/lib/component.ts @@ -28,11 +28,11 @@ import type { DirtyableTag } from '@glimmer/validator'; import { createTag, dirtyTag } from '@glimmer/validator'; import type { SimpleElement } from '@simple-dom/interface'; import { - ARGS, BOUNDS, CURLY_COMPONENT_MANAGER, DIRTY_TAG, IS_DISPATCHING_ATTRS, + getComponentCapturedArgs, } from './component-managers/curly'; import { hasDOM } from '@ember/-internals/browser-environment'; @@ -1038,7 +1038,7 @@ class Component return; } - let args = (this as any)[ARGS]; + let args = getComponentCapturedArgs(this); let reference = args !== undefined ? args[key] : undefined; if (reference !== undefined && isUpdatableRef(reference)) { diff --git a/packages/@ember/-internals/meta/lib/meta.ts b/packages/@ember/-internals/meta/lib/meta.ts index 7d429b5f13e..17c3ff59ec6 100644 --- a/packages/@ember/-internals/meta/lib/meta.ts +++ b/packages/@ember/-internals/meta/lib/meta.ts @@ -1,5 +1,5 @@ import type { ComputedProperty } from '@ember/-internals/metal'; -import { symbol, toString } from '@ember/-internals/utils'; +import { toString } from '@ember/-internals/utils'; import { assert } from '@ember/debug'; import { isDestroyed } from '@glimmer/destroyable'; import { DEBUG } from '@glimmer/env'; @@ -58,7 +58,7 @@ if (DEBUG) { @module ember */ -export const UNDEFINED = symbol('undefined'); +export const UNDEFINED = Symbol('undefined'); const enum ListenerKind { ADD = 0, diff --git a/packages/@ember/-internals/metal/lib/property_get.ts b/packages/@ember/-internals/metal/lib/property_get.ts index ef86dd3b8d4..b7fb86eabf1 100644 --- a/packages/@ember/-internals/metal/lib/property_get.ts +++ b/packages/@ember/-internals/metal/lib/property_get.ts @@ -2,14 +2,14 @@ @module @ember/object */ import type { _ProxyMixin as ProxyMixin } from '@ember/-internals/runtime'; -import { setProxy, symbol } from '@ember/-internals/utils'; +import { setProxy } from '@ember/-internals/utils'; import { isEmberArray } from '@ember/array/-internals'; import { assert } from '@ember/debug'; import { DEBUG } from '@glimmer/env'; import { consumeTag, isTracking, tagFor, track } from '@glimmer/validator'; import { isPath } from './path_cache'; -export const PROXY_CONTENT = symbol('PROXY_CONTENT'); +export const PROXY_CONTENT = Symbol('PROXY_CONTENT'); export let getPossibleMandatoryProxyValue: (obj: object, keyName: string) => any; diff --git a/packages/@ember/-internals/metal/lib/tags.ts b/packages/@ember/-internals/metal/lib/tags.ts index 47f028c63ce..3d7f267436a 100644 --- a/packages/@ember/-internals/metal/lib/tags.ts +++ b/packages/@ember/-internals/metal/lib/tags.ts @@ -1,4 +1,4 @@ -import { isObject, setupMandatorySetter, symbol, toString } from '@ember/-internals/utils'; +import { isObject, setupMandatorySetter, toString } from '@ember/-internals/utils'; import { assert } from '@ember/debug'; import { isDestroyed } from '@glimmer/destroyable'; import { DEBUG } from '@glimmer/env'; @@ -15,7 +15,7 @@ type CustomTagFnWithMandatorySetter = ( ) => Tag; // This is exported for `@tracked`, but should otherwise be avoided. Use `tagForObject`. -export const SELF_TAG: string | symbol = symbol('SELF_TAG'); +export const SELF_TAG: string | symbol = Symbol('SELF_TAG'); export function tagForProperty( obj: object, diff --git a/packages/@ember/-internals/utils/index.ts b/packages/@ember/-internals/utils/index.ts index 329a6f7e793..2811534d8b9 100644 --- a/packages/@ember/-internals/utils/index.ts +++ b/packages/@ember/-internals/utils/index.ts @@ -8,7 +8,6 @@ Utility methods that are needed in < 80% of cases should be placed elsewhere (so they can be lazily evaluated / parsed). */ -export { symbol, enumerableSymbol, isInternalSymbol } from './lib/symbol'; export { default as dictionary } from './lib/dictionary'; export { default as getDebugName } from './lib/get-debug-name'; export { uuid, GUID_KEY, generateGuid, guidFor } from './lib/guid'; diff --git a/packages/@ember/-internals/utils/lib/symbol.ts b/packages/@ember/-internals/utils/lib/symbol.ts deleted file mode 100644 index b4f4318f754..00000000000 --- a/packages/@ember/-internals/utils/lib/symbol.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { DEBUG } from '@glimmer/env'; -import { GUID_KEY } from './guid'; -import intern from './intern'; - -const GENERATED_SYMBOLS: string[] = []; - -export function isInternalSymbol(possibleSymbol: string) { - return GENERATED_SYMBOLS.indexOf(possibleSymbol) !== -1; -} - -// Some legacy symbols still need to be enumerable for a variety of reasons. -// This code exists for that, and as a fallback in IE11. In general, prefer -// `symbol` below when creating a new symbol. -export function enumerableSymbol(debugName: string): string { - // TODO: Investigate using platform symbols, but we do not - // want to require non-enumerability for this API, which - // would introduce a large cost. - let id = GUID_KEY + Math.floor(Math.random() * Date.now()).toString(); - let symbol = intern(`__${debugName}${id}__`); - - if (DEBUG) { - GENERATED_SYMBOLS.push(symbol); - } - - return symbol; -} - -export const symbol = Symbol; diff --git a/packages/@ember/controller/index.ts b/packages/@ember/controller/index.ts index 711b6d634cd..02b17a3be21 100644 --- a/packages/@ember/controller/index.ts +++ b/packages/@ember/controller/index.ts @@ -6,7 +6,6 @@ import type { DecoratorPropertyDescriptor, ElementDescriptor } from '@ember/-int import Mixin from '@ember/object/mixin'; import type { RouteArgs } from '@ember/routing/-internals'; import { ActionHandler } from '@ember/-internals/runtime'; -import { symbol } from '@ember/-internals/utils'; import type { Transition } from 'router_js'; export type ControllerQueryParamType = 'boolean' | 'number' | 'array' | 'string'; @@ -15,7 +14,7 @@ export type ControllerQueryParam = | Record | Record; -const MODEL = symbol('MODEL'); +const MODEL = Symbol('MODEL'); /** @module @ember/controller diff --git a/packages/@ember/object/-internals.ts b/packages/@ember/object/-internals.ts index f59d4196604..880c5a05af9 100644 --- a/packages/@ember/object/-internals.ts +++ b/packages/@ember/object/-internals.ts @@ -3,7 +3,6 @@ export { guidFor } from '@ember/-internals/utils'; import { addListener } from '@ember/-internals/metal'; import { assert } from '@ember/debug'; -import { symbol } from '@ember/-internals/utils'; import { DEBUG } from '@glimmer/env'; import EmberObject from '.'; @@ -27,7 +26,7 @@ let FrameworkObject: typeof EmberObject = class FrameworkObject extends EmberObj if (DEBUG) { const INIT_WAS_CALLED = Symbol('INIT_WAS_CALLED'); - let ASSERT_INIT_WAS_CALLED = symbol('ASSERT_INIT_WAS_CALLED'); + let ASSERT_INIT_WAS_CALLED = Symbol('ASSERT_INIT_WAS_CALLED'); FrameworkObject = class DebugFrameworkObject extends EmberObject { [INIT_WAS_CALLED] = false; diff --git a/packages/@ember/object/core.ts b/packages/@ember/object/core.ts index 106169e3ef8..a8ed8d112e1 100644 --- a/packages/@ember/object/core.ts +++ b/packages/@ember/object/core.ts @@ -4,7 +4,7 @@ import { getFactoryFor, setFactoryFor } from '@ember/-internals/container'; import { type default as Owner, getOwner } from '@ember/-internals/owner'; -import { guidFor, isInternalSymbol } from '@ember/-internals/utils'; +import { guidFor } from '@ember/-internals/utils'; import { meta } from '@ember/-internals/meta'; import type { ComputedProperty, HasUnknownProperty } from '@ember/-internals/metal'; import { @@ -271,7 +271,6 @@ class CoreObject { // init called will be set on the proxy, not the target, so get with the receiver !initCalled!.has(receiver) || typeof property === 'symbol' || - isInternalSymbol(property) || property === 'toJSON' || property === 'toString' || property === 'toStringExtension' ||