diff --git a/package.json b/package.json index 2f3af68d47d..d152a11bbb4 100644 --- a/package.json +++ b/package.json @@ -74,16 +74,16 @@ }, "devDependencies": { "@babel/preset-env": "^7.9.5", - "@glimmer/compiler": "0.63.5", + "@glimmer/compiler": "0.64.0", "@glimmer/env": "^0.1.7", - "@glimmer/global-context": "0.63.5", - "@glimmer/interfaces": "0.63.5", - "@glimmer/node": "0.63.5", - "@glimmer/opcode-compiler": "0.63.5", - "@glimmer/program": "0.63.5", - "@glimmer/reference": "0.63.5", - "@glimmer/runtime": "0.63.5", - "@glimmer/validator": "0.63.5", + "@glimmer/global-context": "0.64.0", + "@glimmer/interfaces": "0.64.0", + "@glimmer/node": "0.64.0", + "@glimmer/opcode-compiler": "0.64.0", + "@glimmer/program": "0.64.0", + "@glimmer/reference": "0.64.0", + "@glimmer/runtime": "0.64.0", + "@glimmer/validator": "0.64.0", "@simple-dom/document": "^1.4.0", "@types/qunit": "^2.9.1", "@types/rsvp": "^4.0.3", diff --git a/packages/@ember/-internals/glimmer/index.ts b/packages/@ember/-internals/glimmer/index.ts index 64193dc5e0f..36e1b978405 100644 --- a/packages/@ember/-internals/glimmer/index.ts +++ b/packages/@ember/-internals/glimmer/index.ts @@ -405,4 +405,3 @@ export { capabilities } from './lib/component-managers/custom'; export { capabilities as modifierCapabilities } from './lib/modifiers/custom'; export { helperCapabilities, HelperManager, invokeHelper } from './lib/helpers/custom'; export { isSerializationFirstNode } from './lib/utils/serialization-first-node-helpers'; -export { CapturedRenderNode } from './lib/utils/debug-render-tree'; diff --git a/packages/@ember/-internals/glimmer/lib/compile-time-lookup.ts b/packages/@ember/-internals/glimmer/lib/compile-time-lookup.ts index ca251694fc4..8a6aa7a738e 100644 --- a/packages/@ember/-internals/glimmer/lib/compile-time-lookup.ts +++ b/packages/@ember/-internals/glimmer/lib/compile-time-lookup.ts @@ -8,10 +8,11 @@ import { Option, WithStaticLayout, } from '@glimmer/interfaces'; +import { unwrapTemplate } from '@glimmer/util'; import RuntimeResolver from './resolver'; interface StaticComponentManager - extends WithStaticLayout, + extends WithStaticLayout, ComponentManager {} function isStaticComponentManager( @@ -52,10 +53,13 @@ export default class CompileTimeResolverImpl implements CompileTimeResolver implements ComponentManager< abstract getDebugName(state: U): string; abstract create( - env: EmberVMEnvironment, + env: Environment, definition: U, args: VMArguments, dynamicScope: DynamicScope, diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts index 12bc88cfcc6..351f0139e2b 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts @@ -1,5 +1,4 @@ import { privatize as P } from '@ember/-internals/container'; -import { ENV } from '@ember/-internals/environment'; import { getOwner } from '@ember/-internals/owner'; import { guidFor } from '@ember/-internals/utils'; import { addChildView, setElementView, setViewElement } from '@ember/-internals/views'; @@ -10,11 +9,11 @@ import { assign } from '@ember/polyfills'; import { DEBUG } from '@glimmer/env'; import { Bounds, - CompilableProgram, ComponentCapabilities, ComponentDefinition, Destroyable, ElementOperations, + Environment, Option, PreparedArguments, Template, @@ -22,7 +21,6 @@ import { VMArguments, WithDynamicLayout, WithDynamicTagName, - WithStaticLayout, } from '@glimmer/interfaces'; import { childRefFor, @@ -31,8 +29,8 @@ import { Reference, valueForRef, } from '@glimmer/reference'; -import { registerDestructor, reifyPositional } from '@glimmer/runtime'; -import { EMPTY_ARRAY, unwrapTemplate } from '@glimmer/util'; +import { reifyPositional } from '@glimmer/runtime'; +import { EMPTY_ARRAY } from '@glimmer/util'; import { beginTrackFrame, beginUntrackFrame, @@ -44,7 +42,6 @@ import { } from '@glimmer/validator'; import { SimpleElement } from '@simple-dom/interface'; import { BOUNDS, DIRTY_TAG, HAS_BLOCK, IS_DISPATCHING_ATTRS } from '../component'; -import { EmberVMEnvironment } from '../environment'; import { DynamicScope } from '../renderer'; import RuntimeResolver from '../resolver'; import { isTemplateFactory } from '../template'; @@ -121,7 +118,6 @@ debugFreeze(EMPTY_POSITIONAL_ARGS); export default class CurlyComponentManager extends AbstractManager implements - WithStaticLayout, WithDynamicLayout, WithDynamicTagName { protected templateFor(component: Component): Template { @@ -148,19 +144,8 @@ export default class CurlyComponentManager return factory(owner); } - getStaticLayout(state: DefinitionState): CompilableProgram { - return unwrapTemplate(state.template!).asLayout(); - } - getDynamicLayout(bucket: ComponentStateBucket): Template { - let component = bucket.component; - let template = this.templateFor(component); - - if (ENV._DEBUG_RENDER_TREE) { - bucket.environment.extra.debugRenderTree.setTemplate(bucket, template); - } - - return template; + return this.templateFor(bucket.component); } getTagName(state: ComponentStateBucket): Option { @@ -173,7 +158,7 @@ export default class CurlyComponentManager return (component && component.tagName) || 'div'; } - getCapabilities(state: DefinitionState) { + getCapabilities(state: DefinitionState): ComponentCapabilities { return state.capabilities; } @@ -251,7 +236,7 @@ export default class CurlyComponentManager * etc. */ create( - environment: EmberVMEnvironment, + environment: Environment, state: DefinitionState, args: VMArguments, dynamicScope: DynamicScope, @@ -359,20 +344,6 @@ export default class CurlyComponentManager endUntrackFrame(); - if (ENV._DEBUG_RENDER_TREE) { - environment.extra.debugRenderTree.create(bucket, { - type: 'component', - name: state.name, - args: args.capture(), - instance: component, - template: state.template, - }); - - registerDestructor(bucket, () => { - environment.extra.debugRenderTree.willDestroy(bucket); - }); - } - // consume every argument so we always run again consumeTag(bucket.argsTag); consumeTag(component[DIRTY_TAG]); @@ -380,7 +351,7 @@ export default class CurlyComponentManager return bucket; } - getDebugName({ name }: DefinitionState) { + getDebugName({ name }: DefinitionState): string { return name; } @@ -442,10 +413,6 @@ export default class CurlyComponentManager didRenderLayout(bucket: ComponentStateBucket, bounds: Bounds): void { bucket.component[BOUNDS] = bounds; bucket.finalize(); - - if (ENV._DEBUG_RENDER_TREE) { - bucket.environment.extra.debugRenderTree.didRender(bucket, bounds); - } } didCreate({ component, environment }: ComponentStateBucket): void { @@ -459,10 +426,6 @@ export default class CurlyComponentManager update(bucket: ComponentStateBucket): void { let { component, args, argsTag, argsRevision, environment } = bucket; - if (ENV._DEBUG_RENDER_TREE) { - environment.extra.debugRenderTree.update(bucket); - } - bucket.finalizer = _instrumentStart('render.component', rerenderInstrumentDetails, component); beginUntrackFrame(); @@ -493,12 +456,8 @@ export default class CurlyComponentManager consumeTag(component[DIRTY_TAG]); } - didUpdateLayout(bucket: ComponentStateBucket, bounds: Bounds): void { + didUpdateLayout(bucket: ComponentStateBucket): void { bucket.finalize(); - - if (ENV._DEBUG_RENDER_TREE) { - bucket.environment.extra.debugRenderTree.didRender(bucket, bounds); - } } didUpdate({ component, environment }: ComponentStateBucket): void { diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/custom.ts b/packages/@ember/-internals/glimmer/lib/component-managers/custom.ts index 5e5a932d4d1..1a472a8ad59 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/custom.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/custom.ts @@ -1,13 +1,12 @@ -import { ENV } from '@ember/-internals/environment'; import { Factory } from '@ember/-internals/owner'; import { assert } from '@ember/debug'; import { Arguments, - Bounds, ComponentCapabilities, ComponentDefinition, Destroyable, Dict, + Environment, Option, Template, VMArguments, @@ -15,9 +14,6 @@ import { } from '@glimmer/interfaces'; import { createConstRef, Reference } from '@glimmer/reference'; import { registerDestructor } from '@glimmer/runtime'; -import { unwrapTemplate } from '@glimmer/util'; -import { EmberVMEnvironment } from '../environment'; -import RuntimeResolver from '../resolver'; import { argsProxyFor } from '../utils/args-proxy'; import { buildCapabilities, InternalCapabilities } from '../utils/managers'; import AbstractComponentManager from './abstract'; @@ -173,11 +169,10 @@ export default class CustomComponentManager implements WithStaticLayout< CustomComponentState, - CustomComponentDefinitionState, - RuntimeResolver + CustomComponentDefinitionState > { create( - env: EmberVMEnvironment, + env: Environment, definition: CustomComponentDefinitionState, vmArgs: VMArguments ): CustomComponentState { @@ -188,32 +183,14 @@ export default class CustomComponentManager let bucket = new CustomComponentState(delegate, component, args, env); - if (ENV._DEBUG_RENDER_TREE) { - env.extra.debugRenderTree.create(bucket, { - type: 'component', - name: definition.name, - args: vmArgs.capture(), - instance: component, - template: definition.template, - }); - - registerDestructor(bucket, () => { - env.extra.debugRenderTree.willDestroy(bucket); - }); - } - return bucket; } - getDebugName({ name }: CustomComponentDefinitionState) { + getDebugName({ name }: CustomComponentDefinitionState): string { return name; } - update(bucket: CustomComponentState) { - if (ENV._DEBUG_RENDER_TREE) { - bucket.env.extra.debugRenderTree.update(bucket); - } - + update(bucket: CustomComponentState): void { if (hasUpdateHook(bucket.delegate)) { let { delegate, component, args } = bucket; @@ -221,21 +198,21 @@ export default class CustomComponentManager } } - didCreate({ delegate, component }: CustomComponentState) { + didCreate({ delegate, component }: CustomComponentState): void { if (hasAsyncLifeCycleCallbacks(delegate)) { delegate.didCreateComponent(component); } } - didUpdate({ delegate, component }: CustomComponentState) { + didUpdate({ delegate, component }: CustomComponentState): void { if (hasAsyncUpdateHook(delegate)) { delegate.didUpdateComponent(component); } } - getContext({ delegate, component }: CustomComponentState) { - delegate.getContext(component); - } + didRenderLayout(): void {} + + didUpdateLayout(): void {} getSelf({ delegate, component }: CustomComponentState): Reference { return createConstRef(delegate.getContext(component), 'this'); @@ -245,28 +222,12 @@ export default class CustomComponentManager return bucket; } - getCapabilities({ - delegate, - }: CustomComponentDefinitionState): ComponentCapabilities { - return Object.assign({}, CAPABILITIES, { - updateHook: ENV._DEBUG_RENDER_TREE || delegate.capabilities.updateHook, - }); - } - - didRenderLayout(bucket: CustomComponentState, bounds: Bounds) { - if (ENV._DEBUG_RENDER_TREE) { - bucket.env.extra.debugRenderTree.didRender(bucket, bounds); - } - } - - didUpdateLayout(bucket: CustomComponentState, bounds: Bounds) { - if (ENV._DEBUG_RENDER_TREE) { - bucket.env.extra.debugRenderTree.didRender(bucket, bounds); - } + getCapabilities(): ComponentCapabilities { + return CAPABILITIES; } - getStaticLayout(state: DefinitionState) { - return unwrapTemplate(state.template).asLayout(); + getStaticLayout(state: DefinitionState): Template { + return state.template; } } const CUSTOM_COMPONENT_MANAGER = new CustomComponentManager(); @@ -279,7 +240,7 @@ export class CustomComponentState { public delegate: ManagerDelegate, public component: ComponentInstance, public args: Arguments, - public env: EmberVMEnvironment + public env: Environment ) { if (hasDestructors(delegate)) { registerDestructor(this, () => delegate.destroyComponent(component)); diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/internal.ts b/packages/@ember/-internals/glimmer/lib/component-managers/internal.ts index b3d65a72461..87c7f50d508 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/internal.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/internal.ts @@ -1,22 +1,18 @@ -import { ENV } from '@ember/-internals/environment'; import { Owner } from '@ember/-internals/owner'; import { assert } from '@ember/debug'; import { - Bounds, ComponentCapabilities, ComponentDefinition, Destroyable, DynamicScope, + Environment, Template, VMArguments, WithStaticLayout, } from '@glimmer/interfaces'; import { createConstRef, isConstRef, Reference, valueForRef } from '@glimmer/reference'; -import { registerDestructor } from '@glimmer/runtime'; -import { _WeakSet, unwrapTemplate } from '@glimmer/util'; +import { _WeakSet } from '@glimmer/util'; import InternalComponent from '../components/internal'; -import { EmberVMEnvironment } from '../environment'; -import RuntimeResolver from '../resolver'; import AbstractComponentManager from './abstract'; const CAPABILITIES: ComponentCapabilities = { @@ -28,7 +24,7 @@ const CAPABILITIES: ComponentCapabilities = { elementHook: false, createCaller: true, dynamicScope: false, - updateHook: true, + updateHook: false, createInstance: true, wrapped: false, willDestroy: false, @@ -40,7 +36,7 @@ export interface InternalDefinitionState { } export interface InternalComponentState { - env: EmberVMEnvironment; + env: Environment; instance: Destroyable; } @@ -65,7 +61,7 @@ export function isInternalManager(manager: object): manager is InternalManager { export default class InternalManager extends AbstractComponentManager - implements WithStaticLayout { + implements WithStaticLayout { static for(name: string): (owner: Owner) => InternalManager { return (owner: Owner) => new InternalManager(owner, name); } @@ -80,8 +76,8 @@ export default class InternalManager } create( - env: EmberVMEnvironment, - { ComponentClass, layout }: InternalDefinitionState, + env: Environment, + { ComponentClass }: InternalDefinitionState, args: VMArguments, _dynamicScope: DynamicScope, caller: Reference @@ -97,18 +93,6 @@ export default class InternalManager let state = { env, instance }; - if (ENV._DEBUG_RENDER_TREE) { - env.extra.debugRenderTree.create(state, { - type: 'component', - name: this.getDebugName(), - args: args.capture(), - instance, - template: layout, - }); - - registerDestructor(instance, () => env.extra.debugRenderTree.willDestroy(state)); - } - return state; } @@ -120,29 +104,19 @@ export default class InternalManager return createConstRef(instance, 'this'); } - didRenderLayout(state: InternalComponentState, bounds: Bounds): void { - if (ENV._DEBUG_RENDER_TREE) { - state.env.extra.debugRenderTree.didRender(state, bounds); - } - } + didCreate(): void {} - update(state: InternalComponentState): void { - if (ENV._DEBUG_RENDER_TREE) { - state.env.extra.debugRenderTree.update(state); - } - } + didUpdate(): void {} - didUpdateLayout(state: InternalComponentState, bounds: Bounds): void { - if (ENV._DEBUG_RENDER_TREE) { - state.env.extra.debugRenderTree.didRender(state, bounds); - } - } + didRenderLayout(): void {} + + didUpdateLayout(): void {} getDestroyable(state: InternalComponentState): Destroyable { return state.instance; } - getStaticLayout({ layout: template }: InternalDefinitionState) { - return unwrapTemplate(template).asLayout(); + getStaticLayout({ layout: template }: InternalDefinitionState): Template { + return template; } } diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/mount.ts b/packages/@ember/-internals/glimmer/lib/component-managers/mount.ts index 7cbc167c58c..1bc8c7f1470 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/mount.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/mount.ts @@ -1,19 +1,22 @@ -import { ENV } from '@ember/-internals/environment'; +import { Owner } from '@ember/-internals/owner'; import { generateControllerFactory } from '@ember/-internals/routing'; import EngineInstance from '@ember/engine/instance'; import { - Bounds, + CapturedArguments, ComponentCapabilities, ComponentDefinition, + CustomRenderNode, Destroyable, + Environment, Option, + Template, TemplateFactory, VMArguments, + WithCustomDebugRenderTree, WithDynamicLayout, } from '@glimmer/interfaces'; import { createConstRef, Reference, valueForRef } from '@glimmer/reference'; -import { registerDestructor } from '@glimmer/runtime'; -import { EmberVMEnvironment } from '../environment'; +import { associateDestroyableChild } from '@glimmer/runtime'; import RuntimeResolver from '../resolver'; import AbstractManager from './abstract'; @@ -21,7 +24,6 @@ interface EngineState { engine: EngineInstance; controller: any; self: Reference; - environment: EmberVMEnvironment; modelRef?: Reference; } @@ -46,29 +48,25 @@ const CAPABILITIES = { class MountManager extends AbstractManager - implements WithDynamicLayout { - getDynamicLayout(state: EngineState, _: RuntimeResolver) { + implements + WithDynamicLayout, + WithCustomDebugRenderTree { + getDynamicLayout(state: EngineState) { let templateFactory = state.engine.lookup('template:application') as TemplateFactory; - let template = templateFactory(state.engine); - - if (ENV._DEBUG_RENDER_TREE) { - state.environment.extra.debugRenderTree.setTemplate(state.controller, template); - } - - return template; + return templateFactory(state.engine); } getCapabilities(): ComponentCapabilities { return CAPABILITIES; } - create(environment: EmberVMEnvironment, { name }: EngineDefinitionState, args: VMArguments) { + create(env: Environment, { name }: EngineDefinitionState, args: VMArguments) { // TODO // mount is a runtime helper, this shouldn't use dynamic layout // we should resolve the engine app template in the helper // it also should use the owner that looked up the mount helper. - let engine = environment.extra.owner.buildChildEngineInstance(name); + let engine = env.owner.buildChildEngineInstance(name); engine.boot(); @@ -86,36 +84,16 @@ class MountManager if (modelRef === undefined) { controller = controllerFactory.create(); self = createConstRef(controller, 'this'); - bucket = { engine, controller, self, environment }; + bucket = { engine, controller, self, modelRef }; } else { let model = valueForRef(modelRef); controller = controllerFactory.create({ model }); self = createConstRef(controller, 'this'); - bucket = { engine, controller, self, modelRef, environment }; + bucket = { engine, controller, self, modelRef }; } - if (ENV._DEBUG_RENDER_TREE) { - environment.extra.debugRenderTree.create(bucket, { - type: 'engine', - name, - args: args.capture(), - instance: engine, - template: undefined, - }); - - environment.extra.debugRenderTree.create(controller, { - type: 'route-template', - name: 'application', - args: args.capture(), - instance: controller, - // set in getDynamicLayout - template: undefined, - }); - - registerDestructor(engine, () => { - environment.extra.debugRenderTree.willDestroy(controller); - environment.extra.debugRenderTree.willDestroy(bucket); - }); + if (env.debugRenderTree) { + associateDestroyableChild(engine, controller); } return bucket; @@ -125,6 +103,31 @@ class MountManager return name; } + getDebugCustomRenderTree( + definition: EngineDefinitionState, + state: EngineState, + args: CapturedArguments, + template?: Template + ): CustomRenderNode[] { + return [ + { + bucket: state.engine, + instance: state.engine, + type: 'engine', + name: definition.name, + args, + }, + { + bucket: state.controller, + instance: state.controller, + type: 'route-template', + name: 'application', + args, + template, + }, + ]; + } + getSelf({ self }: EngineState): Reference { return self; } @@ -133,32 +136,17 @@ class MountManager return bucket.engine; } - didRenderLayout(bucket: EngineState, bounds: Bounds): void { - if (ENV._DEBUG_RENDER_TREE) { - bucket.environment.extra.debugRenderTree.didRender(bucket.controller, bounds); - bucket.environment.extra.debugRenderTree.didRender(bucket, bounds); - } - } + didRenderLayout(): void {} update(bucket: EngineState): void { - let { controller, environment, modelRef } = bucket; + let { controller, modelRef } = bucket; if (modelRef !== undefined) { controller.set('model', valueForRef(modelRef!)); } - - if (ENV._DEBUG_RENDER_TREE) { - environment.extra.debugRenderTree.update(bucket); - environment.extra.debugRenderTree.update(bucket.controller); - } } - didUpdateLayout(bucket: EngineState, bounds: Bounds): void { - if (ENV._DEBUG_RENDER_TREE) { - bucket.environment.extra.debugRenderTree.didRender(bucket.controller, bounds); - bucket.environment.extra.debugRenderTree.didRender(bucket, bounds); - } - } + didUpdateLayout(): void {} } const MOUNT_MANAGER = new MountManager(); diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/outlet.ts b/packages/@ember/-internals/glimmer/lib/component-managers/outlet.ts index 813c9395047..8955c65ff85 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/outlet.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/outlet.ts @@ -5,25 +5,24 @@ import EngineInstance from '@ember/engine/instance'; import { _instrumentStart } from '@ember/instrumentation'; import { assign } from '@ember/polyfills'; import { - Bounds, + CapturedArguments, ComponentCapabilities, ComponentDefinition, + CustomRenderNode, Destroyable, - ElementOperations, + Environment, Option, Template, VMArguments, + WithCustomDebugRenderTree, WithDynamicTagName, WithStaticLayout, } from '@glimmer/interfaces'; import { createConstRef, Reference, valueForRef } from '@glimmer/reference'; -import { EMPTY_ARGS, registerDestructor } from '@glimmer/runtime'; -import { unwrapTemplate } from '@glimmer/util'; +import { EMPTY_ARGS } from '@glimmer/runtime'; import { SimpleElement } from '@simple-dom/interface'; -import { EmberVMEnvironment } from '../environment'; import { DynamicScope } from '../renderer'; -import RuntimeResolver from '../resolver'; import { OutletState } from '../utils/outlet'; import OutletView from '../views/outlet'; import AbstractManager from './abstract'; @@ -34,9 +33,9 @@ function instrumentationPayload(def: OutletDefinitionState) { interface OutletInstanceState { self: Reference; - environment: EmberVMEnvironment; outlet?: { name: string }; - engine?: { mountPoint: string }; + engineBucket?: { mountPoint: string }; + engine?: EngineInstance; finalize: () => void; } @@ -53,12 +52,12 @@ const CAPABILITIES: ComponentCapabilities = { dynamicLayout: false, dynamicTag: false, prepareArgs: false, - createArgs: ENV._DEBUG_RENDER_TREE, + createArgs: false, attributeHook: false, elementHook: false, createCaller: false, dynamicScope: true, - updateHook: ENV._DEBUG_RENDER_TREE, + updateHook: false, createInstance: true, wrapped: false, willDestroy: false, @@ -66,11 +65,13 @@ const CAPABILITIES: ComponentCapabilities = { class OutletComponentManager extends AbstractManager - implements WithStaticLayout { + implements + WithStaticLayout, + WithCustomDebugRenderTree { create( - environment: EmberVMEnvironment, + env: Environment, definition: OutletDefinitionState, - args: VMArguments, + _args: VMArguments, dynamicScope: DynamicScope ): OutletInstanceState { let parentStateRef = dynamicScope.get('outletState'); @@ -80,21 +81,11 @@ class OutletComponentManager let state: OutletInstanceState = { self: createConstRef(definition.controller, 'this'), - environment, finalize: _instrumentStart('render.outlet', instrumentationPayload, definition), }; - if (ENV._DEBUG_RENDER_TREE) { + if (env.debugRenderTree !== undefined) { state.outlet = { name: definition.outlet }; - - environment.extra.debugRenderTree.create(state.outlet, { - type: 'outlet', - name: state.outlet.name, - args: EMPTY_ARGS, - instance: undefined, - template: undefined, - }); - let parentState = valueForRef(parentStateRef); let parentOwner = parentState && parentState.render && parentState.render.owner; let currentOwner = valueForRef(currentStateRef)!.render!.owner; @@ -107,50 +98,62 @@ class OutletComponentManager let mountPoint = engine.mountPoint!; - state.engine = { mountPoint }; - - environment.extra.debugRenderTree.create(state.engine, { - type: 'engine', - name: mountPoint, - args: EMPTY_ARGS, - instance: engine, - template: undefined, - }); + state.engine = engine; + state.engineBucket = { mountPoint }; } - - environment.extra.debugRenderTree.create(state, { - type: 'route-template', - name: definition.name, - args: args.capture(), - instance: definition.controller, - template: definition.template, - }); - - registerDestructor(state, () => { - state.environment.extra.debugRenderTree.willDestroy(state); - - if (state.engine) { - state.environment.extra.debugRenderTree.willDestroy(state.engine); - } - - state.environment.extra.debugRenderTree.willDestroy(state.outlet!); - }); } return state; } getDebugName({ name }: OutletDefinitionState) { - if (name === '-top-level') { - return '- While rendering:'; + return name; + } + + getDebugCustomRenderTree( + definition: OutletDefinitionState, + state: OutletInstanceState, + args: CapturedArguments + ): CustomRenderNode[] { + let nodes: CustomRenderNode[] = []; + + if (state.outlet) { + nodes.push({ + bucket: state.outlet, + type: 'outlet', + name: state.outlet.name, + args: EMPTY_ARGS, + instance: undefined, + template: undefined, + }); } - return name; + if (state.engineBucket) { + nodes.push({ + bucket: state.engineBucket, + type: 'engine', + name: state.engineBucket.mountPoint, + args: EMPTY_ARGS, + instance: state.engine, + template: undefined, + }); + } + + nodes.push({ + bucket: state, + type: 'route-template', + name: definition.name, + args: args, + instance: definition.controller, + template: definition.template, + }); + + return nodes; } getStaticLayout({ template }: OutletDefinitionState) { // The router has already resolved the template - return unwrapTemplate(template).asLayout(); + return template; } getCapabilities(): ComponentCapabilities { @@ -161,50 +164,12 @@ class OutletComponentManager return self; } - didRenderLayout(state: OutletInstanceState, bounds: Bounds): void { + didRenderLayout(state: OutletInstanceState): void { state.finalize(); - - if (ENV._DEBUG_RENDER_TREE) { - state.environment.extra.debugRenderTree.didRender(state, bounds); - - if (state.engine) { - state.environment.extra.debugRenderTree.didRender(state.engine, bounds); - } - - state.environment.extra.debugRenderTree.didRender(state.outlet!, bounds); - } } - update(state: OutletInstanceState): void { - if (ENV._DEBUG_RENDER_TREE) { - state.environment.extra.debugRenderTree.update(state.outlet!); - - if (state.engine) { - state.environment.extra.debugRenderTree.update(state.engine); - } - - state.environment.extra.debugRenderTree.update(state); - } - } - - didUpdateLayout(state: OutletInstanceState, bounds: Bounds): void { - if (ENV._DEBUG_RENDER_TREE) { - state.environment.extra.debugRenderTree.didRender(state, bounds); - - if (state.engine) { - state.environment.extra.debugRenderTree.didRender(state.engine, bounds); - } - - state.environment.extra.debugRenderTree.didRender(state.outlet!, bounds); - } - } - - getDestroyable(state: OutletInstanceState): Option { - if (ENV._DEBUG_RENDER_TREE) { - return state; - } else { - return null; - } + getDestroyable(): Option { + return null; } } @@ -230,24 +195,20 @@ export function createRootOutlet(outletView: OutletView): OutletComponentDefinit const WrappedOutletComponentManager = class extends OutletComponentManager implements WithDynamicTagName { - getTagName(_component: OutletInstanceState) { + getTagName() { return 'div'; } getStaticLayout({ template }: OutletDefinitionState) { // The router has already resolved the template - return unwrapTemplate(template).asWrappedLayout(); + return template; } getCapabilities(): ComponentCapabilities { return WRAPPED_CAPABILITIES; } - didCreateElement( - component: OutletInstanceState, - element: SimpleElement, - _operations: ElementOperations - ): void { + didCreateElement(component: OutletInstanceState, element: SimpleElement): void { // to add GUID id and class element.setAttribute('class', 'ember-view'); element.setAttribute('id', guidFor(component)); diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/root.ts b/packages/@ember/-internals/glimmer/lib/component-managers/root.ts index ddb5cd2ad44..6263f39887b 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/root.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/root.ts @@ -1,19 +1,17 @@ import { getFactoryFor } from '@ember/-internals/container'; -import { ENV } from '@ember/-internals/environment'; import { Factory } from '@ember/-internals/owner'; import { _instrumentStart } from '@ember/instrumentation'; import { DEBUG } from '@glimmer/env'; import { ComponentCapabilities, ComponentDefinition, + Environment, Option, + Template, VMArguments, } from '@glimmer/interfaces'; -import { EMPTY_ARGS } from '@glimmer/runtime'; -import { unwrapTemplate } from '@glimmer/util'; import { CONSTANT_TAG, consumeTag } from '@glimmer/validator'; import { DIRTY_TAG } from '../component'; -import { EmberVMEnvironment } from '../environment'; import { DynamicScope } from '../renderer'; import ComponentStateBucket, { Component } from '../utils/curly-component-state-bucket'; import CurlyComponentManager, { @@ -30,18 +28,13 @@ class RootComponentManager extends CurlyComponentManager { this.component = component; } - getDebugName() { - return '- While rendering:'; - } - - getStaticLayout(_state: DefinitionState) { - const template = this.templateFor(this.component); - return unwrapTemplate(template).asWrappedLayout(); + getStaticLayout(): Template { + return this.templateFor(this.component); } create( - environment: EmberVMEnvironment, - state: DefinitionState, + environment: Environment, + _state: DefinitionState, _args: Option, dynamicScope: DynamicScope ) { @@ -79,16 +72,6 @@ class RootComponentManager extends CurlyComponentManager { hasWrappedElement ); - if (ENV._DEBUG_RENDER_TREE) { - environment.extra.debugRenderTree.create(bucket, { - type: 'component', - name: state.name, - args: EMPTY_ARGS, - instance: component, - template: state.template!, - }); - } - consumeTag(component[DIRTY_TAG]); return bucket; diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/template-only.ts b/packages/@ember/-internals/glimmer/lib/component-managers/template-only.ts index ba7907c82d1..3dccf8e411d 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/template-only.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/template-only.ts @@ -1,113 +1,52 @@ -import { ENV } from '@ember/-internals/environment'; import { - Bounds, ComponentCapabilities, ComponentDefinition, + Environment, Option, Template, - VMArguments, WithStaticLayout, } from '@glimmer/interfaces'; -import { NULL_REFERENCE } from '@glimmer/reference'; -import { registerDestructor } from '@glimmer/runtime'; -import { unwrapTemplate } from '@glimmer/util'; -import { EmberVMEnvironment } from '../environment'; -import RuntimeResolver from '../resolver'; -import AbstractManager from './abstract'; +import { NULL_REFERENCE, Reference } from '@glimmer/reference'; const CAPABILITIES: ComponentCapabilities = { dynamicLayout: false, dynamicTag: false, prepareArgs: false, - createArgs: ENV._DEBUG_RENDER_TREE, + createArgs: false, attributeHook: false, elementHook: false, createCaller: false, dynamicScope: false, - updateHook: ENV._DEBUG_RENDER_TREE, - createInstance: true, + updateHook: false, + createInstance: false, wrapped: false, willDestroy: false, }; export interface DebugStateBucket { - environment: EmberVMEnvironment; + environment: Environment; } export default class TemplateOnlyComponentManager - extends AbstractManager, TemplateOnlyComponentDefinitionState> - implements - WithStaticLayout< - Option, - TemplateOnlyComponentDefinitionState, - RuntimeResolver - > { - getStaticLayout({ template }: TemplateOnlyComponentDefinitionState) { - return unwrapTemplate(template).asLayout(); + implements WithStaticLayout, TemplateOnlyComponentDefinitionState> { + getStaticLayout({ template }: TemplateOnlyComponentDefinitionState): Template { + return template; } getCapabilities(): ComponentCapabilities { return CAPABILITIES; } - create( - environment: EmberVMEnvironment, - { name, template }: TemplateOnlyComponentDefinitionState, - args: VMArguments - ): Option { - if (ENV._DEBUG_RENDER_TREE) { - let bucket = { environment }; - - environment.extra.debugRenderTree.create(bucket, { - type: 'component', - name: name, - args: args.capture(), - instance: null, - template, - }); - - registerDestructor(bucket, () => { - bucket.environment.extra.debugRenderTree.willDestroy(bucket!); - }); - - return bucket; - } else { - return null; - } - } - - getDebugName({ name }: TemplateOnlyComponentDefinitionState) { + getDebugName({ name }: TemplateOnlyComponentDefinitionState): string { return name; } - getSelf() { + getSelf(): Reference { return NULL_REFERENCE; } - getDestroyable(bucket: Option) { - if (ENV._DEBUG_RENDER_TREE) { - return bucket; - } else { - return null; - } - } - - didRenderLayout(bucket: Option, bounds: Bounds): void { - if (ENV._DEBUG_RENDER_TREE) { - bucket!.environment.extra.debugRenderTree.didRender(bucket!, bounds); - } - } - - update(bucket: Option): void { - if (ENV._DEBUG_RENDER_TREE) { - bucket!.environment.extra.debugRenderTree.update(bucket!); - } - } - - didUpdateLayout(bucket: Option, bounds: Bounds): void { - if (ENV._DEBUG_RENDER_TREE) { - bucket!.environment.extra.debugRenderTree.didRender(bucket!, bounds); - } + getDestroyable(): null { + return null; } } diff --git a/packages/@ember/-internals/glimmer/lib/environment.ts b/packages/@ember/-internals/glimmer/lib/environment.ts index 485635d3925..506ccca2eec 100644 --- a/packages/@ember/-internals/glimmer/lib/environment.ts +++ b/packages/@ember/-internals/glimmer/lib/environment.ts @@ -7,10 +7,8 @@ import { assert, deprecate, warn } from '@ember/debug'; import { backburner, schedule } from '@ember/runloop'; import { DEBUG } from '@glimmer/env'; import setGlobalContext from '@glimmer/global-context'; -import { Environment, Template } from '@glimmer/interfaces'; import { EnvironmentDelegate } from '@glimmer/runtime'; import { setTrackingTransactionEnv } from '@glimmer/validator'; -import DebugRenderTree from './utils/debug-render-tree'; import toIterator from './utils/iterator'; import { isHTMLSafe } from './utils/string'; import toBool from './utils/to-bool'; @@ -84,59 +82,10 @@ if (DEBUG) { // Define environment delegate -export interface CompilerFactory { - id: string; - new (template: Template): any; -} - -export class EmberEnvironmentExtra { - private _debugRenderTree?: DebugRenderTree; - - constructor(public owner: Owner) { - if (ENV._DEBUG_RENDER_TREE) { - this._debugRenderTree = new DebugRenderTree(); - } - } - - get debugRenderTree(): DebugRenderTree { - if (ENV._DEBUG_RENDER_TREE) { - return this._debugRenderTree!; - } else { - throw new Error( - "Can't access debug render tree outside of the inspector (_DEBUG_RENDER_TREE flag is disabled)" - ); - } - } - - begin(): void { - if (ENV._DEBUG_RENDER_TREE) { - this.debugRenderTree.begin(); - } - } - - commit(): void { - if (ENV._DEBUG_RENDER_TREE) { - this.debugRenderTree.commit(); - } - } -} +export class EmberEnvironmentDelegate implements EnvironmentDelegate { + public enableDebugTooling: boolean = ENV._DEBUG_RENDER_TREE; -export class EmberEnvironmentDelegate implements EnvironmentDelegate { - public isInteractive: boolean; - public extra: EmberEnvironmentExtra; + constructor(public owner: Owner, public isInteractive: boolean) {} - constructor(owner: Owner, isInteractive: boolean) { - this.extra = new EmberEnvironmentExtra(owner); - this.isInteractive = isInteractive; - } - - onTransactionBegin() { - this.extra.begin(); - } - - onTransactionCommit() { - this.extra.commit(); - } + onTransactionCommit() {} } - -export type EmberVMEnvironment = Environment; diff --git a/packages/@ember/-internals/glimmer/lib/renderer.ts b/packages/@ember/-internals/glimmer/lib/renderer.ts index 1619f132970..76f7e309144 100644 --- a/packages/@ember/-internals/glimmer/lib/renderer.ts +++ b/packages/@ember/-internals/glimmer/lib/renderer.ts @@ -7,6 +7,7 @@ import { DEBUG } from '@glimmer/env'; import { Bounds, Cursor, + DebugRenderTree, DynamicScope as GlimmerDynamicScope, ElementBuilder, Environment, @@ -40,7 +41,7 @@ import { BOUNDS } from './component'; import { createRootOutlet } from './component-managers/outlet'; import { RootComponentDefinition } from './component-managers/root'; import { NodeDOMTreeConstruction } from './dom'; -import { EmberEnvironmentDelegate, EmberEnvironmentExtra } from './environment'; +import { EmberEnvironmentDelegate } from './environment'; import RuntimeResolver from './resolver'; import { populateMacros } from './syntax'; import { Component } from './utils/curly-component-state-bucket'; @@ -115,7 +116,7 @@ class RootState { constructor( public root: Component | OutletView, - public runtime: RuntimeContext, + public runtime: RuntimeContext, context: SyntaxCompilationContext, template: Template, self: Reference, @@ -281,7 +282,7 @@ export abstract class Renderer { private _inRenderTransaction = false; private _context: SyntaxCompilationContext; - private _runtime: RuntimeContext; + private _runtime: RuntimeContext; private _lastRevision = -1; private _destroyed = false; @@ -328,8 +329,15 @@ export abstract class Renderer { ); } - get debugRenderTree() { - return this._runtime.env.extra.debugRenderTree; + get debugRenderTree(): DebugRenderTree { + let { debugRenderTree } = this._runtime.env; + + assert( + 'Attempted to access the DebugRenderTree, but it did not exist. Is the Ember Inspector open?', + debugRenderTree + ); + + return debugRenderTree!; } // renderer HOOKS diff --git a/packages/@ember/-internals/glimmer/lib/syntax/mount.ts b/packages/@ember/-internals/glimmer/lib/syntax/mount.ts index 9f8e5a32dcc..4099315fd5b 100644 --- a/packages/@ember/-internals/glimmer/lib/syntax/mount.ts +++ b/packages/@ember/-internals/glimmer/lib/syntax/mount.ts @@ -1,9 +1,10 @@ /** @module ember */ +import { Owner } from '@ember/-internals/owner'; import { assert } from '@ember/debug'; import { DEBUG } from '@glimmer/env'; -import { CapturedArguments, Option, VM, VMArguments } from '@glimmer/interfaces'; +import { CapturedArguments, Environment, Option, VM, VMArguments } from '@glimmer/interfaces'; import { createComputeRef, Reference, valueForRef } from '@glimmer/reference'; import { createCapturedArgs, @@ -12,7 +13,6 @@ import { EMPTY_POSITIONAL, } from '@glimmer/runtime'; import { MountDefinition } from '../component-managers/mount'; -import { EmberVMEnvironment } from '../environment'; /** The `{{mount}}` helper lets you embed a routeless engine in a template. @@ -58,7 +58,7 @@ export function mountHelper( args: VMArguments, vm: VM ): Reference { - let env = vm.env as EmberVMEnvironment; + let env = vm.env as Environment; let nameRef = args.positional.at(0) as Reference>; let captured: Option = null; @@ -102,10 +102,10 @@ export function mountHelper( assert( `You used \`{{mount '${name}'}}\`, but the engine '${name}' can not be found.`, - env.extra.owner.hasRegistration(`engine:${name}`) + env.owner.hasRegistration(`engine:${name}`) ); - if (!env.extra.owner.hasRegistration(`engine:${name}`)) { + if (!env.owner.hasRegistration(`engine:${name}`)) { return null; } diff --git a/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts b/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts index ea78b2a748d..72d89abc7b2 100644 --- a/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts +++ b/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts @@ -1,9 +1,13 @@ import { clearElementView, clearViewElement, getViewElement } from '@ember/-internals/views'; -import { CapturedNamedArguments, Template, TemplateFactory } from '@glimmer/interfaces'; +import { + CapturedNamedArguments, + Environment, + Template, + TemplateFactory, +} from '@glimmer/interfaces'; import { createConstRef, Reference } from '@glimmer/reference'; import { registerDestructor } from '@glimmer/runtime'; import { beginUntrackFrame, endUntrackFrame, Revision, Tag, valueForTag } from '@glimmer/validator'; -import { EmberVMEnvironment } from '../environment'; import { Renderer } from '../renderer'; export interface Component { @@ -44,7 +48,7 @@ export default class ComponentStateBucket { public argsRevision: Revision; constructor( - public environment: EmberVMEnvironment, + public environment: Environment, public component: Component, public args: CapturedNamedArguments | null, public argsTag: Tag, diff --git a/packages/@ember/-internals/glimmer/lib/utils/debug-render-tree.ts b/packages/@ember/-internals/glimmer/lib/utils/debug-render-tree.ts deleted file mode 100644 index 5fcdb174042..00000000000 --- a/packages/@ember/-internals/glimmer/lib/utils/debug-render-tree.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { assert } from '@ember/debug'; -import { Arguments, Bounds, CapturedArguments, Option, Template } from '@glimmer/interfaces'; -import { reifyArgs } from '@glimmer/runtime'; -import { expect, Stack, unwrapTemplate } from '@glimmer/util'; -import { SimpleElement, SimpleNode } from '@simple-dom/interface'; - -export type RenderNodeType = 'outlet' | 'engine' | 'route-template' | 'component'; - -export interface RenderNode { - type: RenderNodeType; - name: string; - args: CapturedArguments; - instance: unknown; - template?: Template; -} - -interface InternalRenderNode extends RenderNode { - bounds: Option; - refs: Set>; - parent?: InternalRenderNode; -} - -export interface CapturedRenderNode { - id: string; - type: RenderNodeType; - name: string; - args: Arguments; - instance: unknown; - template: Option; - bounds: Option<{ - parentElement: SimpleElement; - firstNode: SimpleNode; - lastNode: SimpleNode; - }>; - children: CapturedRenderNode[]; -} - -let GUID = 0; - -export class Ref { - readonly id: number = GUID++; - private value: Option; - - constructor(value: T) { - this.value = value; - } - - get(): Option { - return this.value; - } - - release(): void { - assert('BUG: double release?', this.value !== null); - this.value = null; - } - - toString(): String { - let label = `Ref ${this.id}`; - - if (this.value === null) { - return `${label} (released)`; - } else { - try { - return `${label}: ${this.value}`; - } catch { - return label; - } - } - } -} - -export default class DebugRenderTree { - private stack = new Stack(); - - private refs = new WeakMap>(); - private roots = new Set>(); - private nodes = new WeakMap>(); - - begin(): void { - this.reset(); - } - - create(state: Bucket, node: RenderNode): void { - let internalNode: InternalRenderNode = { - ...node, - bounds: null, - refs: new Set(), - }; - this.nodes.set(state, internalNode); - this.appendChild(internalNode, state); - this.enter(state); - } - - update(state: Bucket): void { - this.enter(state); - } - - // for dynamic layouts - setTemplate(state: Bucket, template: Template): void { - this.nodeFor(state).template = template; - } - - didRender(state: Bucket, bounds: Bounds): void { - assert(`BUG: expecting ${this.stack.current}, got ${state}`, this.stack.current === state); - this.nodeFor(state).bounds = bounds; - this.exit(); - } - - willDestroy(state: Bucket): void { - expect(this.refs.get(state), 'BUG: missing ref').release(); - } - - commit(): void { - this.reset(); - } - - capture(): CapturedRenderNode[] { - return this.captureRefs(this.roots); - } - - private reset(): void { - if (this.stack.size !== 0) { - // We probably encountered an error during the rendering loop. This will - // likely trigger undefined behavior and memory leaks as the error left - // things in an inconsistent state. It is recommended that the user - // refresh the page. - - // TODO: We could warn here? But this happens all the time in our tests? - - // Clean up the root reference to prevent errors from happening if we - // attempt to capture the render tree (Ember Inspector may do this) - let root = expect(this.stack.toArray()[0], 'expected root state when resetting render tree'); - let ref = this.refs.get(root); - - if (ref !== undefined) { - this.roots.delete(ref); - } - - while (!this.stack.isEmpty()) { - this.stack.pop(); - } - } - } - - private enter(state: Bucket): void { - this.stack.push(state); - } - - private exit(): void { - assert('BUG: unbalanced pop', this.stack.size !== 0); - this.stack.pop(); - } - - private nodeFor(state: Bucket): InternalRenderNode { - return expect(this.nodes.get(state), 'BUG: missing node'); - } - - private appendChild(node: InternalRenderNode, state: Bucket): void { - assert('BUG: child already appended', !this.refs.has(state)); - - let parent = this.stack.current; - let ref = new Ref(state); - - this.refs.set(state, ref); - - if (parent) { - let parentNode = this.nodeFor(parent); - parentNode.refs.add(ref); - node.parent = parentNode; - } else { - this.roots.add(ref); - } - } - - private captureRefs(refs: Set>): CapturedRenderNode[] { - let captured: CapturedRenderNode[] = []; - - refs.forEach((ref) => { - let state = ref.get(); - - if (state) { - captured.push(this.captureNode(`render-node:${ref.id}`, state)); - } else { - refs.delete(ref); - } - }); - - return captured; - } - - private captureNode(id: string, state: Bucket): CapturedRenderNode { - let node = this.nodeFor(state); - let { type, name, args, instance, refs } = node; - let template = this.captureTemplate(node); - let bounds = this.captureBounds(node); - let children = this.captureRefs(refs); - return { id, type, name, args: reifyArgs(args), instance, template, bounds, children }; - } - - private captureTemplate({ template }: InternalRenderNode): Option { - return (template && unwrapTemplate(template).moduleName) || null; - } - - private captureBounds(node: InternalRenderNode): CapturedRenderNode['bounds'] { - let bounds = expect(node.bounds, 'BUG: missing bounds'); - let parentElement = bounds.parentElement(); - let firstNode = bounds.firstNode(); - let lastNode = bounds.lastNode(); - return { parentElement, firstNode, lastNode }; - } -} diff --git a/packages/@ember/-internals/glimmer/tests/integration/application/debug-render-tree-test.ts b/packages/@ember/-internals/glimmer/tests/integration/application/debug-render-tree-test.ts index d088dbc103b..e9fde80104c 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/application/debug-render-tree-test.ts +++ b/packages/@ember/-internals/glimmer/tests/integration/application/debug-render-tree-test.ts @@ -8,7 +8,6 @@ import { import { ENV } from '@ember/-internals/environment'; import { capabilities, - CapturedRenderNode, Component, setComponentManager, setComponentTemplate, @@ -20,6 +19,7 @@ import Controller from '@ember/controller'; import { captureRenderTree } from '@ember/debug'; import Engine from '@ember/engine'; import EngineInstance from '@ember/engine/instance'; +import { CapturedRenderNode } from '@glimmer/interfaces'; import { expect } from '@glimmer/util'; import { SimpleElement, SimpleNode } from '@simple-dom/interface'; import { compile } from 'ember-template-compiler'; @@ -885,7 +885,7 @@ if (ENV._DEBUG_RENDER_TREE) { this.addComponent('hello-world', { ComponentClass: null, - template: 'Hello World', + template: '{{@name}}', }); await this.visit('/'); @@ -958,7 +958,7 @@ if (ENV._DEBUG_RENDER_TREE) { this.addComponent('hello-world', { ComponentClass: templateOnly(), - template: 'Hello World', + template: '{{@name}}', }); await this.visit('/'); @@ -1031,7 +1031,7 @@ if (ENV._DEBUG_RENDER_TREE) { this.addComponent('hello-world', { ComponentClass: setComponentTemplate( - compile('Hello World', { moduleName: 'my-app/components/hello-world.hbs' }), + compile('{{@name}}', { moduleName: 'my-app/components/hello-world.hbs' }), templateOnly() ), }); @@ -1659,7 +1659,7 @@ if (ENV._DEBUG_RENDER_TREE) { throw new Error('oops!'); }, }), - template: 'Hello World', + template: '{{@name}}', }); await assert.rejects(this.visit('/'), /oops!/); diff --git a/packages/@ember/-internals/glimmer/tests/integration/application/rendering-test.js b/packages/@ember/-internals/glimmer/tests/integration/application/rendering-test.js index 3ba136d8532..72bb3fd63fb 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/application/rendering-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/application/rendering-test.js @@ -5,7 +5,7 @@ import Controller from '@ember/controller'; import { Route } from '@ember/-internals/routing'; import { Component } from '@ember/-internals/glimmer'; import { set, tracked } from '@ember/-internals/metal'; -import { backtrackingMessageFor } from '../../utils/backtracking-rerender'; +import { backtrackingMessageFor } from '../../utils/debug-stack'; import { runTask } from '../../../../../../internal-test-helpers/lib/run'; moduleFor( diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js index 8204301edc0..d7ef5142163 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js @@ -18,7 +18,7 @@ import { Object as EmberObject, A as emberA } from '@ember/-internals/runtime'; import { jQueryDisabled } from '@ember/-internals/views'; import { Component, compile, htmlSafe } from '../../utils/helpers'; -import { backtrackingMessageFor } from '../../utils/backtracking-rerender'; +import { backtrackingMessageFor, debugStackMessageFor } from '../../utils/debug-stack'; moduleFor( 'Components test: curly components', @@ -3030,7 +3030,7 @@ moduleFor( this.render(`{{foo-bar id="foo-bar" isVisible=visible}}`, { visible: false, }); - }, /The `isVisible` property on classic component classes is deprecated. Was accessed:\n\n- While rendering:\n {2}foo-bar/); + }, debugStackMessageFor('The `isVisible` property on classic component classes is deprecated. Was accessed:', { renderTree: ['foo-bar'] })); assertStyle('display: none;'); @@ -3040,7 +3040,7 @@ moduleFor( runTask(() => { set(this.context, 'visible', true); }); - }, /The `isVisible` property on classic component classes is deprecated. Was accessed:\n\n- While rendering:\n {2}foo-bar/); + }, debugStackMessageFor('The `isVisible` property on classic component classes is deprecated. Was accessed:', { renderTree: ['foo-bar'] })); assertStyle(''); @@ -3048,7 +3048,7 @@ moduleFor( runTask(() => { set(this.context, 'visible', false); }); - }, /The `isVisible` property on classic component classes is deprecated. Was accessed:\n\n- While rendering:\n {2}foo-bar/); + }, debugStackMessageFor('The `isVisible` property on classic component classes is deprecated. Was accessed:', { renderTree: ['foo-bar'] })); assertStyle('display: none;'); } @@ -3067,7 +3067,7 @@ moduleFor( this.render(`{{foo-bar id="foo-bar" isVisible=visible}}`, { visible: false, }); - }, /The `isVisible` property on classic component classes is deprecated. Was accessed:\n\n- While rendering:\n {2}foo-bar/); + }, debugStackMessageFor('The `isVisible` property on classic component classes is deprecated. Was accessed:', { renderTree: ['foo-bar'] })); this.assertComponentElement(this.firstChild, { tagName: 'div', @@ -3080,7 +3080,7 @@ moduleFor( runTask(() => { set(this.context, 'visible', true); }); - }, /The `isVisible` property on classic component classes is deprecated. Was accessed:\n\n- While rendering:\n {2}foo-bar/); + }, debugStackMessageFor('The `isVisible` property on classic component classes is deprecated. Was accessed:', { renderTree: ['foo-bar'] })); this.assertComponentElement(this.firstChild, { tagName: 'div', @@ -3091,7 +3091,7 @@ moduleFor( runTask(() => { set(this.context, 'visible', false); }); - }, /The `isVisible` property on classic component classes is deprecated. Was accessed:\n\n- While rendering:\n {2}foo-bar/); + }, debugStackMessageFor('The `isVisible` property on classic component classes is deprecated. Was accessed:', { renderTree: ['foo-bar'] })); this.assertComponentElement(this.firstChild, { tagName: 'div', @@ -3127,7 +3127,7 @@ moduleFor( visible: false, foo: 'baz', }); - }, /The `isVisible` property on classic component classes is deprecated. Was accessed:\n\n- While rendering:\n {2}foo-bar/); + }, debugStackMessageFor('The `isVisible` property on classic component classes is deprecated. Was accessed:', { renderTree: ['foo-bar'] })); assertStyle('display: none;'); @@ -3137,7 +3137,7 @@ moduleFor( runTask(() => { set(this.context, 'visible', true); }); - }, /The `isVisible` property on classic component classes is deprecated. Was accessed:\n\n- While rendering:\n {2}foo-bar/); + }, debugStackMessageFor('The `isVisible` property on classic component classes is deprecated. Was accessed:', { renderTree: ['foo-bar'] })); assertStyle(''); @@ -3146,7 +3146,7 @@ moduleFor( set(this.context, 'visible', false); set(this.context, 'foo', 'woo'); }); - }, /The `isVisible` property on classic component classes is deprecated. Was accessed:\n\n- While rendering:\n {2}foo-bar/); + }, debugStackMessageFor('The `isVisible` property on classic component classes is deprecated. Was accessed:', { renderTree: ['foo-bar'] })); assertStyle('display: none;'); assert.equal(this.firstChild.getAttribute('foo'), 'woo'); diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/dynamic-components-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/dynamic-components-test.js index 1bcdebed82c..2f537033da0 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/dynamic-components-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/dynamic-components-test.js @@ -4,7 +4,7 @@ import { set, computed } from '@ember/-internals/metal'; import { jQueryDisabled } from '@ember/-internals/views'; import { Component } from '../../utils/helpers'; -import { backtrackingMessageFor } from '../../utils/backtracking-rerender'; +import { backtrackingMessageFor } from '../../utils/debug-stack'; moduleFor( 'Components test: dynamic components', diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/template-only-components-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/template-only-components-test.js index df680185d32..6c5354248fe 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/template-only-components-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/template-only-components-test.js @@ -5,7 +5,7 @@ import templateOnly from '@ember/component/template-only'; import { compile } from 'ember-template-compiler'; import { Object as EmberObject } from '@ember/-internals/runtime'; import { Component } from '../../utils/helpers'; -import { backtrackingMessageFor } from '../../utils/backtracking-rerender'; +import { backtrackingMessageFor } from '../../utils/debug-stack'; class TemplateOnlyComponentsTest extends RenderingTestCase { registerTemplateOnlyComponent(name, template) { diff --git a/packages/@ember/-internals/glimmer/tests/integration/custom-modifier-manager-test.js b/packages/@ember/-internals/glimmer/tests/integration/custom-modifier-manager-test.js index c05ee65d7e5..ff65c64aa12 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/custom-modifier-manager-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/custom-modifier-manager-test.js @@ -3,7 +3,7 @@ import { moduleFor, RenderingTestCase, runTask } from 'internal-test-helpers'; import { Object as EmberObject } from '@ember/-internals/runtime'; import { setModifierManager, modifierCapabilities } from '@ember/-internals/glimmer'; import { set, tracked } from '@ember/-internals/metal'; -import { backtrackingMessageFor } from '../utils/backtracking-rerender'; +import { backtrackingMessageFor } from '../utils/debug-stack'; class ModifierManagerTest extends RenderingTestCase { '@test throws a useful error when missing capabilities'() { @@ -260,6 +260,7 @@ class ModifierManagerTest extends RenderingTestCase { let expectedMessage = backtrackingMessageFor('name', 'Person', { renderTree: ['\\(instance of a `foo-bar` modifier\\)'], + includeTopLevel: false, }); expectAssertion(() => { diff --git a/packages/@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test.js b/packages/@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test.js index 2017581b322..74d5d4e3553 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test.js @@ -3,7 +3,7 @@ import { DEBUG } from '@glimmer/env'; import { RenderingTestCase, moduleFor, runDestroy, runTask } from 'internal-test-helpers'; import { Helper } from '@ember/-internals/glimmer'; import { set, tracked } from '@ember/-internals/metal'; -import { backtrackingMessageFor } from '../../utils/backtracking-rerender'; +import { backtrackingMessageFor } from '../../utils/debug-stack'; moduleFor( 'Helpers test: custom helpers', diff --git a/packages/@ember/-internals/glimmer/tests/integration/helpers/helper-manager-test.js b/packages/@ember/-internals/glimmer/tests/integration/helpers/helper-manager-test.js index 81b0862058b..0477a22d48c 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/helpers/helper-manager-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/helpers/helper-manager-test.js @@ -8,7 +8,7 @@ import { tracked, set } from '@ember/-internals/metal'; import { setOwner } from '@ember/-internals/owner'; import { EMBER_GLIMMER_HELPER_MANAGER } from '@ember/canary-features'; import Service, { inject as service } from '@ember/service'; -import { backtrackingMessageFor } from '../../utils/backtracking-rerender'; +import { backtrackingMessageFor } from '../../utils/debug-stack'; import { registerDestructor } from '@glimmer/runtime'; class TestHelperManager { diff --git a/packages/@ember/-internals/glimmer/tests/integration/helpers/tracked-test.js b/packages/@ember/-internals/glimmer/tests/integration/helpers/tracked-test.js index da0cb247a4d..b0a44ffeb31 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/helpers/tracked-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/helpers/tracked-test.js @@ -9,7 +9,7 @@ import { import Service, { inject } from '@ember/service'; import { moduleFor, RenderingTestCase, strip, runTask } from 'internal-test-helpers'; -import { backtrackingMessageFor } from '../../utils/backtracking-rerender'; +import { backtrackingMessageFor } from '../../utils/debug-stack'; import { Component } from '../../utils/helpers'; moduleFor( diff --git a/packages/@ember/-internals/glimmer/tests/integration/mount-test.js b/packages/@ember/-internals/glimmer/tests/integration/mount-test.js index 427f961b5f1..8b9604462e6 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/mount-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/mount-test.js @@ -11,7 +11,7 @@ import { getOwner } from '@ember/-internals/owner'; import Controller from '@ember/controller'; import Engine, { getEngineParent } from '@ember/engine'; -import { backtrackingMessageFor } from '../utils/backtracking-rerender'; +import { backtrackingMessageFor } from '../utils/debug-stack'; import { compile, Component } from '../utils/helpers'; moduleFor( diff --git a/packages/@ember/-internals/glimmer/tests/unit/runtime-resolver-cache-test.js b/packages/@ember/-internals/glimmer/tests/unit/runtime-resolver-cache-test.js index d2a1461e7dc..325f39cb19f 100644 --- a/packages/@ember/-internals/glimmer/tests/unit/runtime-resolver-cache-test.js +++ b/packages/@ember/-internals/glimmer/tests/unit/runtime-resolver-cache-test.js @@ -1,3 +1,4 @@ +import { ENV } from '@ember/-internals/environment'; import { RenderingTestCase, moduleFor, @@ -38,6 +39,8 @@ moduleFor( helperDefinitionCount: 1, // from this.render templateCacheMisses: 1, + // from debugRenderTree + templateCacheHits: ENV._DEBUG_RENDER_TREE ? 1 : 0, }, 'calculate foo-bar helper only' ); @@ -88,6 +91,8 @@ moduleFor( componentDefinitionCount: 1, // 1 from this.render, 1 from component-one templateCacheMisses: 2, + // debugRenderTree + templateCacheHits: ENV._DEBUG_RENDER_TREE ? 1 : 0, }, 'test case component and component-one no change' ); @@ -155,6 +160,7 @@ moduleFor( { componentDefinitionCount: 1, templateCacheMisses: 2, + templateCacheHits: ENV._DEBUG_RENDER_TREE ? 1 : 0, }, 'test case component and component-one no change' ); @@ -167,6 +173,7 @@ moduleFor( { templateCacheMisses: 1, componentDefinitionCount: 1, + templateCacheHits: ENV._DEBUG_RENDER_TREE ? 1 : 0, }, 'component-two first render misses template cache' ); @@ -183,7 +190,7 @@ moduleFor( this.assertText('Two'); this.expectCacheChanges( { - templateCacheHits: 1, + templateCacheHits: ENV._DEBUG_RENDER_TREE ? 2 : 1, }, 'toggle back to component-two hits template cache' ); @@ -195,7 +202,7 @@ moduleFor( this.assertText('TwoOne'); // roots have different capabilities so this will hit this.expectCacheChanges( - { templateCacheHits: 1 }, + { templateCacheHits: ENV._DEBUG_RENDER_TREE ? 2 : 1 }, 'append root with component-one no change' ); @@ -204,7 +211,10 @@ moduleFor( try { runAppend(root2); this.assertText('TwoOneOne'); - this.expectCacheChanges({ templateCacheHits: 1 }, 'append another root no change'); + this.expectCacheChanges( + { templateCacheHits: ENV._DEBUG_RENDER_TREE ? 2 : 1 }, + 'append another root no change' + ); } finally { runDestroy(root2); } diff --git a/packages/@ember/-internals/glimmer/tests/unit/template-factory-test.js b/packages/@ember/-internals/glimmer/tests/unit/template-factory-test.js index d0523a485b0..cf773fb78e5 100644 --- a/packages/@ember/-internals/glimmer/tests/unit/template-factory-test.js +++ b/packages/@ember/-internals/glimmer/tests/unit/template-factory-test.js @@ -1,3 +1,4 @@ +import { ENV } from '@ember/-internals/environment'; import { RenderingTestCase, moduleFor } from 'internal-test-helpers'; import { template, templateCacheCounters } from '@ember/-internals/glimmer'; @@ -70,7 +71,7 @@ moduleFor( this.expectCacheChanges( { - templateCacheHits: 2, + templateCacheHits: ENV._DEBUG_RENDER_TREE ? 5 : 2, // from this.render templateCacheMisses: 1, }, diff --git a/packages/@ember/-internals/glimmer/tests/utils/backtracking-rerender.js b/packages/@ember/-internals/glimmer/tests/utils/backtracking-rerender.js deleted file mode 100644 index 04533d30794..00000000000 --- a/packages/@ember/-internals/glimmer/tests/utils/backtracking-rerender.js +++ /dev/null @@ -1,23 +0,0 @@ -export function backtrackingMessageFor(key, obj, { renderTree } = {}) { - // Start off with standard backtracking assertion - let regex; - - if (obj) { - regex = [`You attempted to update \`${key}\` on \`${obj}\``]; - } else { - regex = [`You attempted to update \`${key}\``]; - } - - if (renderTree) { - // match the renderTree if it was included - regex.push(`\`${key}\` was first used:`); - regex.push('- While rendering:'); - regex.push(renderTree.join('\\n\\s*')); - } - - // Ensure stack trace is given - regex.push(`Stack trace for the update:`); - - // Join with a regex that consumes all characters - return new RegExp(regex.join('[\\S\\s]*')); -} diff --git a/packages/@ember/-internals/glimmer/tests/utils/debug-stack.js b/packages/@ember/-internals/glimmer/tests/utils/debug-stack.js new file mode 100644 index 00000000000..8ac48d0d7f7 --- /dev/null +++ b/packages/@ember/-internals/glimmer/tests/utils/debug-stack.js @@ -0,0 +1,32 @@ +function debugStackMessage(message, renderTree, includeTopLevel) { + let topLevel = includeTopLevel ? '-top-level\n {4}' : ''; + + return `${message}[\\S\\s]*- While rendering:\n {2}${topLevel}${renderTree.join('\\n\\s*')}`; +} + +export function debugStackMessageFor(message, { renderTree, includeTopLevel = true }) { + // Join with a regex that consumes all characters + return new RegExp(debugStackMessage(message, renderTree, includeTopLevel)); +} + +export function backtrackingMessageFor(key, obj, { renderTree, includeTopLevel = true } = {}) { + // Start off with standard backtracking assertion + let message; + + if (obj) { + message = `You attempted to update \`${key}\` on \`${obj}\``; + } else { + message = `You attempted to update \`${key}\``; + } + + if (renderTree) { + message = debugStackMessage( + `${message}[\\S\\s]*\`${key}\` was first used:`, + renderTree, + includeTopLevel + ); + } + + // Join with a regex that consumes all characters + return new RegExp(`${message}[\\S\\s]*Stack trace for the update:`); +} diff --git a/packages/@ember/debug/lib/capture-render-tree.ts b/packages/@ember/debug/lib/capture-render-tree.ts index 5e02ac0c469..642ef24a2af 100644 --- a/packages/@ember/debug/lib/capture-render-tree.ts +++ b/packages/@ember/debug/lib/capture-render-tree.ts @@ -1,5 +1,6 @@ -import { CapturedRenderNode, Renderer } from '@ember/-internals/glimmer'; +import { Renderer } from '@ember/-internals/glimmer'; import { Owner } from '@ember/-internals/owner'; +import { CapturedRenderNode } from '@glimmer/interfaces'; import { expect } from '@glimmer/util'; /** diff --git a/yarn.lock b/yarn.lock index fdd214fdb22..84acb75bf34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -929,152 +929,152 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@glimmer/compiler@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.63.5.tgz#4b3758a2da55963ddf545464241e9d8610787055" - integrity sha512-uoAejXrPPkfU9gdxtIuSasupEijChFu+xaiMFCtuLS3glFEwOoRYkjAxxwK37M2JbETs8ImN2n1SEFl03stI5g== - dependencies: - "@glimmer/interfaces" "0.63.5" - "@glimmer/syntax" "0.63.5" - "@glimmer/util" "0.63.5" - "@glimmer/wire-format" "0.63.5" +"@glimmer/compiler@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.64.0.tgz#e117a9acf5797d785c8da5ce65f96765a0c674a6" + integrity sha512-697j0gI2i6yRlwmONAWVuznPGyq92IfBJdrF/62t1HsMrAsX9DsdpdcQx9Kxl8LoxKpjkijErU/bJ8soPV9zcA== + dependencies: + "@glimmer/interfaces" "0.64.0" + "@glimmer/syntax" "0.64.0" + "@glimmer/util" "0.64.0" + "@glimmer/wire-format" "0.64.0" "@simple-dom/interface" "^1.4.0" -"@glimmer/encoder@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/encoder/-/encoder-0.63.5.tgz#957c4a57d9521ffc38ecf9b1640c29b7718701d0" - integrity sha512-H6SbeEERMU6sYW8TPKjVfx1NHOX1JFCMyyd+g41t+UuLd8lR5DpVrkoV4kIR6X/7ZMB3lQOqdC8RfkI9E2VHfA== +"@glimmer/encoder@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/encoder/-/encoder-0.64.0.tgz#405ce201959ec841c8f08e6ead683363fc6e5c71" + integrity sha512-7QWC700lbJPRedH/mYAjyP/gtJ2mfs3BmHx7ahXHklsiBLpWAELwimvZVkU3bJShYyKddOxaLXaCA+ZKUgP7IA== dependencies: - "@glimmer/interfaces" "0.63.5" - "@glimmer/vm" "0.63.5" + "@glimmer/interfaces" "0.64.0" + "@glimmer/vm" "0.64.0" "@glimmer/env@0.1.7", "@glimmer/env@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= -"@glimmer/global-context@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.63.5.tgz#4a8da4fee97d13a376549ceecebd16a5ffc8c4f6" - integrity sha512-xYsptoxo9ROos83oxG8ZT4e8T2QgsH+FdZxsPZNTN4WLumU2LTkxJQaiosW9q294IVY/mIVhZAohJkfNCvSwug== +"@glimmer/global-context@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.64.0.tgz#7019bea8795dd99890b922fe1678e6343983fdbd" + integrity sha512-iaaz/+bjmixjBhUtMs3Dqdz8TAetu4PW3re1h4VLpQYXL27MRv694kfjpouISKHZ5rOi77icTTDjQYtiHwV/9w== dependencies: "@glimmer/env" "^0.1.7" -"@glimmer/interfaces@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.63.5.tgz#ac614608ea618022b61b5d09e66089ceffc26e6e" - integrity sha512-ogozdIFOSxJ2QBU2NE0pk993qbb/zY1wF4BFL1ZN2GrfDDdaYC5vmDSs+RpbbF6JAjrt4kADXlOocs7dBiX4iQ== +"@glimmer/interfaces@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.64.0.tgz#8d6330ece98e20c97608ec6429fc9732824452bc" + integrity sha512-Y7HmwqtBNOzu9RL8N4WGQGGNCIO8REMORewMbnrZtLuFWcdDPCGVlNkxC77GStkHD+V54oEoW9Y+84MLFxkicg== dependencies: "@simple-dom/interface" "^1.4.0" -"@glimmer/low-level@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/low-level/-/low-level-0.63.5.tgz#f10528b1155a7e030b84eb7660150a08b25901b2" - integrity sha512-BfhbHnnWoxs2gO9DDZv4T/Qvt+1vl5+mL7Jb/vMgsSJbAcjbjAnkAeDGnRCmxRU1t4yGtQ8yFJV48H7VtnoYWg== +"@glimmer/low-level@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/low-level/-/low-level-0.64.0.tgz#d05dce2056dbae03b63b180539f8a4377d3ad810" + integrity sha512-UiSa96BSnF4COduh4UpBWyav1RXg9P1ylaF51hJWDFXA6xt8aME9NSgEmcy+gc/9MbKPOkao+rrKIxP+9upE4w== -"@glimmer/node@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/node/-/node-0.63.5.tgz#2ade61ef07577639afaa736c1a769c33960229f9" - integrity sha512-Ee+CQDZyMeiU+gXCs4PCXdWSpaMI/SGfNPboVLo3rYwxSARcnvw2s4O57kvrkgurRIqnubHouiVXLYIOtssbpA== +"@glimmer/node@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/node/-/node-0.64.0.tgz#4a9ee41d0017013b13a2abf24512a1b75f0bd195" + integrity sha512-+mRKTfmEEMxvLKJXpZXBobeCzpWDR284IM0akT8pYNcS7KSKfxjE/eNjDbkNylMiKRYkvemyMpuSqz0idBz6og== dependencies: - "@glimmer/interfaces" "0.63.5" - "@glimmer/runtime" "0.63.5" - "@glimmer/util" "0.63.5" + "@glimmer/interfaces" "0.64.0" + "@glimmer/runtime" "0.64.0" + "@glimmer/util" "0.64.0" "@simple-dom/document" "^1.4.0" "@simple-dom/interface" "^1.4.0" -"@glimmer/opcode-compiler@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/opcode-compiler/-/opcode-compiler-0.63.5.tgz#dcfa6e852c70a6d229f0f45cc80400ac5ff535ec" - integrity sha512-pWWE0zg2rPHIqtyQaVanVQpnPIgLVFKq9GWqiyvFc+4+VXKUPaNWjVL5v+ITZNSGkvkCzmhtMmNNfMb/Om24BA== - dependencies: - "@glimmer/encoder" "0.63.5" - "@glimmer/interfaces" "0.63.5" - "@glimmer/program" "0.63.5" - "@glimmer/reference" "0.63.5" - "@glimmer/util" "0.63.5" - "@glimmer/vm" "0.63.5" - "@glimmer/wire-format" "0.63.5" - -"@glimmer/program@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/program/-/program-0.63.5.tgz#3cc307327ddde72fe7924f0fc6bd32e56384d7b7" - integrity sha512-MgHGklwTDHp9kD5YEyyea7cWLp6Q4B+ycylpL9ldNyQvIuocW/+QzmTb9Hd/EJ7KAVDMRxy451iWJuzItBYxAg== - dependencies: - "@glimmer/encoder" "0.63.5" - "@glimmer/interfaces" "0.63.5" - "@glimmer/util" "0.63.5" - -"@glimmer/reference@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.63.5.tgz#bc99049c9400994641dea054e58bff61e1e31187" - integrity sha512-uE5O5eFcaKedomCDfendXjA7Sh9MYZG5RhadSSA8iD6TUlXxdpIe++tcRzNQOcMwHNbh+Bx7jX50jxtA1ShibQ== +"@glimmer/opcode-compiler@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/opcode-compiler/-/opcode-compiler-0.64.0.tgz#5f2f3fddd639422ec7e5ba9231bdfeecc3650808" + integrity sha512-2XSN/z9piCSE7A9UVQ1Aa6SrY5oQZyBIknF8Quq8ekQZFVwPqM9qTa826qR/rChDUX7d65rVFSFeZ8/Eyd9ieg== + dependencies: + "@glimmer/encoder" "0.64.0" + "@glimmer/interfaces" "0.64.0" + "@glimmer/program" "0.64.0" + "@glimmer/reference" "0.64.0" + "@glimmer/util" "0.64.0" + "@glimmer/vm" "0.64.0" + "@glimmer/wire-format" "0.64.0" + +"@glimmer/program@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/program/-/program-0.64.0.tgz#411c2639ea5809a890375ce34ce3335944dc98c2" + integrity sha512-v5jFpGjJ9gUQBa1YpiNKCgO+8genGRfX7qzuAz1A/N0BnmD3+Xk2yl8qeli5+WySMAPRYV1lk/3MjrfCkK7TnA== + dependencies: + "@glimmer/encoder" "0.64.0" + "@glimmer/interfaces" "0.64.0" + "@glimmer/util" "0.64.0" + +"@glimmer/reference@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.64.0.tgz#92bac8f2de1b6073a01006ba1511d772ed545b91" + integrity sha512-UQ7+dhAuQskrcYtpX5vQT2JD+qoDdkzP69auRUb4SF0pZH8LIKLxOMi74anAd6AcWrYd25Wh+UUbcuH/Qx+b2g== dependencies: "@glimmer/env" "^0.1.7" - "@glimmer/global-context" "0.63.5" - "@glimmer/interfaces" "0.63.5" - "@glimmer/util" "0.63.5" - "@glimmer/validator" "0.63.5" + "@glimmer/global-context" "0.64.0" + "@glimmer/interfaces" "0.64.0" + "@glimmer/util" "0.64.0" + "@glimmer/validator" "0.64.0" -"@glimmer/runtime@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.63.5.tgz#256a4e96e36185f1bf01b7eb3310f046b0222580" - integrity sha512-EqUS4BMTLtCgS/uGQKySVycHTLdaYBuDCvj1/OdjiFoqZlB0AqoJ65LBYxIqZuNkSUGom0ZVXuhcFcf2ZgjKdw== +"@glimmer/runtime@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.64.0.tgz#3c2dbe0bd4abcda98b4e7abbcedc20661a4ccb7f" + integrity sha512-yLBXkTKvF0tzs6qEHNGPhg4zs9GySzmhWeOzWH91HbIH9PeLmx7cxMN1GPMUngoQz3Gfm5wvRmULEws4e91U0w== dependencies: "@glimmer/env" "0.1.7" - "@glimmer/global-context" "0.63.5" - "@glimmer/interfaces" "0.63.5" - "@glimmer/low-level" "0.63.5" - "@glimmer/program" "0.63.5" - "@glimmer/reference" "0.63.5" - "@glimmer/util" "0.63.5" - "@glimmer/validator" "0.63.5" - "@glimmer/vm" "0.63.5" - "@glimmer/wire-format" "0.63.5" + "@glimmer/global-context" "0.64.0" + "@glimmer/interfaces" "0.64.0" + "@glimmer/low-level" "0.64.0" + "@glimmer/program" "0.64.0" + "@glimmer/reference" "0.64.0" + "@glimmer/util" "0.64.0" + "@glimmer/validator" "0.64.0" + "@glimmer/vm" "0.64.0" + "@glimmer/wire-format" "0.64.0" "@simple-dom/interface" "^1.4.0" -"@glimmer/syntax@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.63.5.tgz#38ef6e41d9da3474ebc5d704c0e9743367de728e" - integrity sha512-w0/X7jQ5tzO6KevzeP1QBEfS2qjc897JlQa+9eMcFkxRxZCH4IVUjyxeRuu9cY0uV16ByVBTFh9fcGPfgaYULQ== +"@glimmer/syntax@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.64.0.tgz#4e665c8936dfb93c17bb53a2f355342fa29662b5" + integrity sha512-BVziEjDC7EKvPv4O3B9hfkevihiqZkBlWBkZbTJe45wImfl+6A4KvwP/s8r5u/yAhYnsA3LO77IuoYYr/I08Tg== dependencies: - "@glimmer/interfaces" "0.63.5" - "@glimmer/util" "0.63.5" + "@glimmer/interfaces" "0.64.0" + "@glimmer/util" "0.64.0" "@handlebars/parser" "^1.1.0" simple-html-tokenizer "^0.5.10" -"@glimmer/util@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.63.5.tgz#8f2ed10269fcf6ccaf4cc0338915cc618ed845d0" - integrity sha512-9eTXOx3l6N1YySBMe1Vb/F+SGuztgObQCoEVtvxUZ7VB37xTaaUEoZfQVQJyBizFIKIAOvXBhPYCT+cERvN7kw== +"@glimmer/util@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.64.0.tgz#872103ebb2313a693161ec69e5b70252b56a6cd5" + integrity sha512-evcvCmQ2VUgWQF3ecDwtkwW+D+FL2f4Z0X8XDUgHQTGbA9PkqQRwyyD0WdURVPYpt3YkbR1VLapADll9fjpevg== dependencies: "@glimmer/env" "0.1.7" - "@glimmer/interfaces" "0.63.5" + "@glimmer/interfaces" "0.64.0" "@simple-dom/interface" "^1.4.0" -"@glimmer/validator@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.63.5.tgz#8d196f1f29191c5ecd60ea5c87d1081f68dff840" - integrity sha512-+/YHIKrspDrqnAz4hE+VgIL2O6tZPxKA9KfI5syDcr+zxQeLjC/7ng6AK2g6+w8nHoS5WOABbA/gpH+wTV6ulQ== +"@glimmer/validator@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.64.0.tgz#509ba8bfadd83853c52e997826ca406b49462734" + integrity sha512-rxeFHcJCIVmTyfP3f3E3NEU3cCT2pAQFCo1LYxdsWDoHZhNP4slisJDYW8UpFmrZKilooK3tki1fVB9Wvi0fpA== dependencies: "@glimmer/env" "^0.1.7" - "@glimmer/global-context" "0.63.5" + "@glimmer/global-context" "0.64.0" -"@glimmer/vm@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.63.5.tgz#2ea8a0546f7826b95e49cb46cd46fa6392e317eb" - integrity sha512-gw9fXdzD4fVIKgEPhv63hPMR4/yFaos/tYFXlRp3DmRPyMViOs7JTQ3W1Yqdn3UqUFwgMKO/yEZEC8RLMFhl4w== +"@glimmer/vm@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.64.0.tgz#4727a991d551bf2c8dd4c5273d647e3f155d283d" + integrity sha512-O0T4/mdPpLHoPe/YcQCkBla6QBkwvIg57LAo6AyesAwCsKF8GmNSY6YzC0qj/sFNh+mr0cdG8bpGeMMmqHM5ZA== dependencies: - "@glimmer/interfaces" "0.63.5" - "@glimmer/util" "0.63.5" + "@glimmer/interfaces" "0.64.0" + "@glimmer/util" "0.64.0" -"@glimmer/wire-format@0.63.5": - version "0.63.5" - resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.63.5.tgz#20c877f830527f2c8e697ec11537bb45cacefe25" - integrity sha512-F08YRRnVzCVTiJ38EVSpux9zNr7B6ryoZQSa1gMcqVkWkNfcNrp3hibXsdtg9Pq3pCyHWM6OLhmE355pdW7hAw== +"@glimmer/wire-format@0.64.0": + version "0.64.0" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.64.0.tgz#085afd3f6161f0c3b9ea18b500b4281b895f0252" + integrity sha512-EwodhWPbFRQ9AMFJgR5+rwFqscW4CPpBjl5eE5w1xIHS5S2wxKNuZJoo+Vq899SFS6n1f0yEzYoqe5acBR09mg== dependencies: - "@glimmer/interfaces" "0.63.5" - "@glimmer/util" "0.63.5" + "@glimmer/interfaces" "0.64.0" + "@glimmer/util" "0.64.0" "@handlebars/parser@^1.1.0": version "1.1.0"