From 6e253dcb7c96c074a03af51026a82933982d57ec Mon Sep 17 00:00:00 2001 From: Miguel Camba Date: Tue, 2 Apr 2019 20:06:49 +0200 Subject: [PATCH] [RFC #435] Add feature flag and tests for forwarding modifiers with splattributes --- .travis.yml | 2 +- FEATURES.md | 7 + package.json | 14 +- .../angle-bracket-invocation-test.js | 287 +++++++++++++++++- packages/@ember/canary-features/index.ts | 4 + .../assert-modifiers-not-in-components.ts | 56 ++++ .../lib/plugins/index.ts | 10 +- ...assert-modifiers-not-in-components-test.js | 51 ++++ yarn.lock | 188 ++++++------ 9 files changed, 514 insertions(+), 105 deletions(-) create mode 100644 packages/ember-template-compiler/lib/plugins/assert-modifiers-not-in-components.ts create mode 100644 packages/ember-template-compiler/tests/plugins/assert-modifiers-not-in-components-test.js diff --git a/.travis.yml b/.travis.yml index df134e95ce5..8f4b2de6cda 100644 --- a/.travis.yml +++ b/.travis.yml @@ -102,7 +102,7 @@ jobs: - if: branch = master env: - BUILD_TYPE=alpha - - OVERRIDE_FEATURES=EMBER_METAL_TRACKED_PROPERTIES,EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS,EMBER_GLIMMER_ANGLE_BRACKET_NESTED_LOOKUP,EMBER_NATIVE_DECORATOR_SUPPORT + - OVERRIDE_FEATURES=EMBER_METAL_TRACKED_PROPERTIES,EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS,EMBER_GLIMMER_ANGLE_BRACKET_NESTED_LOOKUP,EMBER_NATIVE_DECORATOR_SUPPORT,EMBER_GLIMMER_FORWARD_MODIFIERS_WITH_SPLATTRIBUTES - PUBLISH=true script: - "./bin/publish_builds" diff --git a/FEATURES.md b/FEATURES.md index abe424ae4ed..64a735dce04 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -50,3 +50,10 @@ for a detailed explanation. with the angle bracket invocation sytnax. See [RFC #459](https://github.com/emberjs/rfcs/pull/459). + +* `ember-glimmer-forward-modifiers-with-splattributes` + + Allows element modifiers to be applied to components that use angle-bracket syntax, and applies + those modifiers to the element or elements receiving the splattributes. + + See [RFC #435](https://github.com/emberjs/rfcs/pull/435). \ No newline at end of file diff --git a/package.json b/package.json index 233aeb64c1b..665a9704366 100644 --- a/package.json +++ b/package.json @@ -91,14 +91,14 @@ "@babel/plugin-transform-shorthand-properties": "^7.2.0", "@babel/plugin-transform-spread": "^7.2.2", "@babel/plugin-transform-template-literals": "^7.2.0", - "@glimmer/compiler": "^0.38.1", + "@glimmer/compiler": "0.38.2-alpha.2", "@glimmer/env": "^0.1.7", - "@glimmer/interfaces": "^0.38.1", - "@glimmer/node": "^0.38.1", - "@glimmer/opcode-compiler": "^0.38.1", - "@glimmer/program": "^0.38.1", - "@glimmer/reference": "^0.38.1", - "@glimmer/runtime": "^0.38.1", + "@glimmer/interfaces": "0.38.2-alpha.2", + "@glimmer/node": "0.38.2-alpha.2", + "@glimmer/opcode-compiler": "0.38.2-alpha.2", + "@glimmer/program": "0.38.2-alpha.2", + "@glimmer/reference": "0.38.2-alpha.2", + "@glimmer/runtime": "0.38.2-alpha.2", "@types/qunit": "^2.5.4", "@types/rsvp": "^4.0.2", "auto-dist-tag": "^1.0.0", diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js index 0ecfea65700..e4b93c911a6 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js @@ -1,10 +1,50 @@ import { moduleFor, RenderingTestCase, strip, classes, runTask } from 'internal-test-helpers'; +import { setModifierManager } from '@ember/-internals/glimmer'; +import { Object as EmberObject } from '@ember/-internals/runtime'; -import { EMBER_GLIMMER_ANGLE_BRACKET_NESTED_LOOKUP } from '@ember/canary-features'; -import { set } from '@ember/-internals/metal'; +import { + EMBER_GLIMMER_ANGLE_BRACKET_NESTED_LOOKUP, + EMBER_GLIMMER_FORWARD_MODIFIERS_WITH_SPLATTRIBUTES, +} from '@ember/canary-features'; +import { set, setProperties } from '@ember/-internals/metal'; import { Component } from '../../utils/helpers'; +class CustomModifierManager { + constructor(owner) { + this.owner = owner; + } + + createModifier(factory, args) { + return factory.create(args); + } + + installModifier(instance, element, args) { + instance.element = element; + let { positional, named } = args; + instance.didInsertElement(positional, named); + } + + updateModifier(instance, args) { + let { positional, named } = args; + instance.didUpdate(positional, named); + } + + destroyModifier(instance) { + instance.willDestroyElement(); + } +} +let BaseModifier = setModifierManager( + owner => { + return new CustomModifierManager(owner); + }, + EmberObject.extend({ + didInsertElement() {}, + didUpdate() {}, + willDestroyElement() {}, + }) +); + moduleFor( 'AngleBracket Invocation', class extends RenderingTestCase { @@ -1064,3 +1104,246 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_NESTED_LOOKUP) { } ); } + +if (EMBER_GLIMMER_FORWARD_MODIFIERS_WITH_SPLATTRIBUTES) { + moduleFor( + 'Element modifiers on AngleBracket components', + class extends RenderingTestCase { + '@test modifiers are forwarded to a single element receiving the splattributes'(assert) { + let modifierParams = null; + let modifierNamedArgs = null; + let modifiedElement; + this.registerComponent('the-foo', { + ComponentClass: Component.extend({ tagName: '' }), + template: '
Foo
', + }); + this.registerModifier( + 'bar', + BaseModifier.extend({ + didInsertElement(params, namedArgs) { + modifierParams = params; + modifierNamedArgs = namedArgs; + modifiedElement = this.element; + }, + }) + ); + this.render('', {}); + assert.deepEqual(modifierParams, ['something']); + assert.deepEqual(modifierNamedArgs, { foo: 'else' }); + assert.equal( + modifiedElement && modifiedElement.getAttribute('id'), + 'inner-div', + 'Modifier is called on the element receiving the splattributes' + ); + } + + '@test modifiers are forwarded to all the elements receiving the splattributes'(assert) { + let elementIds = []; + this.registerComponent('the-foo', { + ComponentClass: Component.extend({ tagName: '' }), + template: + '
Foo
Bar
', + }); + this.registerModifier( + 'bar', + BaseModifier.extend({ + didInsertElement(params, namedArgs) { + assert.deepEqual(params, ['something']); + assert.deepEqual(namedArgs, { foo: 'else' }); + if (this.element) { + elementIds.push(this.element.getAttribute('id')); + } + }, + }) + ); + this.render(''); + assert.deepEqual( + elementIds, + ['inner-one', 'inner-two'], + 'The modifier has been instantiated twice, once for each element with splattributes' + ); + } + + '@test modifiers on components accept bound arguments and track changes on the'(assert) { + let modifierParams = null; + let modifierNamedArgs = null; + let modifiedElement; + this.registerComponent('the-foo', { + ComponentClass: Component.extend({ tagName: '' }), + template: '
Foo
', + }); + this.registerModifier( + 'bar', + BaseModifier.extend({ + didInsertElement(params, namedArgs) { + modifierParams = params; + modifierNamedArgs = namedArgs; + modifiedElement = this.element; + }, + didUpdate(params, namedArgs) { + modifierParams = params; + modifierNamedArgs = namedArgs; + modifiedElement = this.element; + }, + }) + ); + this.render('', { + something: 'something', + foo: 'else', + }); + assert.deepEqual(modifierParams, ['something']); + assert.deepEqual(modifierNamedArgs, { foo: 'else' }); + assert.equal( + modifiedElement && modifiedElement.getAttribute('id'), + 'inner-div', + 'Modifier is called on the element receiving the splattributes' + ); + runTask(() => setProperties(this.context, { something: 'another', foo: 'thingy' })); + assert.deepEqual(modifierParams, ['another']); + assert.deepEqual(modifierNamedArgs, { foo: 'thingy' }); + assert.equal( + modifiedElement && modifiedElement.getAttribute('id'), + 'inner-div', + 'Modifier is called on the element receiving the splattributes' + ); + } + + '@test modifiers on components accept `this` in both positional params and named arguments, and updates when it changes'( + assert + ) { + let modifierParams = null; + let modifierNamedArgs = null; + let modifiedElement; + let context = { id: 1 }; + let context2 = { id: 2 }; + this.registerComponent('the-foo', { + ComponentClass: Component.extend({ tagName: '' }), + template: '
Foo
', + }); + this.registerModifier( + 'bar', + BaseModifier.extend({ + didInsertElement(params, namedArgs) { + modifierParams = params; + modifierNamedArgs = namedArgs; + modifiedElement = this.element; + }, + didUpdate(params, namedArgs) { + modifierParams = params; + modifierNamedArgs = namedArgs; + modifiedElement = this.element; + }, + }) + ); + this.render('', context); + assert.equal(modifierParams[1].id, 1); + assert.equal(modifierNamedArgs.foo.id, 1); + assert.equal( + modifiedElement && modifiedElement.getAttribute('id'), + 'inner-div', + 'Modifier is called on the element receiving the splattributes' + ); + runTask(() => setProperties(this.context, context2)); + assert.equal(modifierParams[1].id, 2); + assert.equal(modifierNamedArgs.foo.id, 2); + assert.equal( + modifiedElement && modifiedElement.getAttribute('id'), + 'inner-div', + 'Modifier is called on the element receiving the splattributes' + ); + } + + '@test modifiers on components accept local variables in both positional params and named arguments, and updates when they change'( + assert + ) { + let modifierParams = null; + let modifierNamedArgs = null; + let modifiedElement; + this.registerComponent('the-foo', { + ComponentClass: Component.extend({ tagName: '' }), + template: '
Foo
', + }); + this.registerModifier( + 'bar', + BaseModifier.extend({ + didInsertElement(params, namedArgs) { + modifierParams = params; + modifierNamedArgs = namedArgs; + modifiedElement = this.element; + }, + didUpdate(params, namedArgs) { + modifierParams = params; + modifierNamedArgs = namedArgs; + modifiedElement = this.element; + }, + }) + ); + this.render( + ` + {{#let this.foo as |v|}} + + {{/let}}`, + { foo: 'bar' } + ); + assert.deepEqual(modifierParams, ['bar']); + assert.deepEqual(modifierNamedArgs, { foo: 'bar' }); + assert.equal( + modifiedElement && modifiedElement.getAttribute('id'), + 'inner-div', + 'Modifier is called on the element receiving the splattributes' + ); + runTask(() => setProperties(this.context, { foo: 'qux' })); + assert.deepEqual(modifierParams, ['qux']); + assert.deepEqual(modifierNamedArgs, { foo: 'qux' }); + assert.equal( + modifiedElement && modifiedElement.getAttribute('id'), + 'inner-div', + 'Modifier is called on the element receiving the splattributes' + ); + } + + '@test modifiers on components can be received and forwarded to inner component'(assert) { + let modifierParams = null; + let modifierNamedArgs = null; + let elementIds = []; + + this.registerComponent('the-inner', { + ComponentClass: Component.extend({ tagName: '' }), + template: '
{{yield}}
', + }); + this.registerComponent('the-foo', { + ComponentClass: Component.extend({ tagName: '' }), + template: + '
Outer
Hello', + }); + this.registerModifier( + 'bar', + BaseModifier.extend({ + didInsertElement(params, namedArgs) { + modifierParams = params; + modifierNamedArgs = namedArgs; + if (this.element) { + elementIds.push(this.element.getAttribute('id')); + } + }, + }) + ); + this.render( + ` + {{#let this.foo as |v|}} + + {{/let}} + `, + { foo: 'bar' } + ); + assert.deepEqual(modifierParams, ['bar']); + assert.deepEqual(modifierNamedArgs, { foo: 'bar' }); + assert.deepEqual( + elementIds, + ['outer-div', 'inner-div'], + 'Modifiers are called on all levels' + ); + } + } + ); +} diff --git a/packages/@ember/canary-features/index.ts b/packages/@ember/canary-features/index.ts index 503c779c916..5992b3a5c22 100644 --- a/packages/@ember/canary-features/index.ts +++ b/packages/@ember/canary-features/index.ts @@ -17,6 +17,7 @@ export const DEFAULT_FEATURES = { EMBER_IMPROVED_INSTRUMENTATION: null, EMBER_MODULE_UNIFICATION: null, EMBER_METAL_TRACKED_PROPERTIES: null, + EMBER_GLIMMER_FORWARD_MODIFIERS_WITH_SPLATTRIBUTES: null, EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS: true, EMBER_GLIMMER_ANGLE_BRACKET_NESTED_LOOKUP: true, EMBER_ROUTING_BUILD_ROUTEINFO_METADATA: true, @@ -76,6 +77,9 @@ export const EMBER_METAL_TRACKED_PROPERTIES = featureValue(FEATURES.EMBER_METAL_ export const EMBER_GLIMMER_ANGLE_BRACKET_NESTED_LOOKUP = featureValue( FEATURES.EMBER_GLIMMER_ANGLE_BRACKET_NESTED_LOOKUP ); +export const EMBER_GLIMMER_FORWARD_MODIFIERS_WITH_SPLATTRIBUTES = featureValue( + FEATURES.EMBER_GLIMMER_FORWARD_MODIFIERS_WITH_SPLATTRIBUTES +); export const EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS = featureValue( FEATURES.EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS ); diff --git a/packages/ember-template-compiler/lib/plugins/assert-modifiers-not-in-components.ts b/packages/ember-template-compiler/lib/plugins/assert-modifiers-not-in-components.ts new file mode 100644 index 00000000000..a365a2da451 --- /dev/null +++ b/packages/ember-template-compiler/lib/plugins/assert-modifiers-not-in-components.ts @@ -0,0 +1,56 @@ +import { assert } from '@ember/debug'; +import { AST, ASTPlugin, ASTPluginEnvironment } from '@glimmer/syntax'; +import calculateLocationDisplay from '../system/calculate-location-display'; + +export default function assertModifiersNotInComponents(env: ASTPluginEnvironment): ASTPlugin { + let { moduleName } = env.meta; + let scopes: string[][] = []; + + function isComponentInvocation(node: AST.ElementNode) { + return ( + node.tag[0] === '@' || + node.tag[0].toUpperCase() === node.tag[0] || + node.tag.indexOf('.') > -1 || + scopes.some(params => params.some(p => p === node.tag)) + ); + } + + return { + name: 'assert-modifiers-not-in-components', + + visitor: { + Program: { + enter(node: AST.Program) { + scopes.push(node.blockParams); + }, + + exit() { + scopes.pop(); + }, + }, + ElementNode: { + keys: { + children: { + enter(node: AST.ElementNode) { + scopes.push(node.blockParams); + }, + + exit() { + scopes.pop(); + }, + }, + }, + enter(node: AST.ElementNode) { + if (node.modifiers.length > 0 && isComponentInvocation(node)) { + assert( + `Passing modifiers to components require the "ember-glimmer-forward-modifiers-with-splattributes" canary feature, which has not been stabilized yet. See RFC #435 for details. ${calculateLocationDisplay( + moduleName, + node.loc + )}` + ); + } + }, + }, + }, + }; +} diff --git a/packages/ember-template-compiler/lib/plugins/index.ts b/packages/ember-template-compiler/lib/plugins/index.ts index 6667b39c4bc..6a168cf6f95 100644 --- a/packages/ember-template-compiler/lib/plugins/index.ts +++ b/packages/ember-template-compiler/lib/plugins/index.ts @@ -1,6 +1,7 @@ import AssertIfHelperWithoutArguments from './assert-if-helper-without-arguments'; import AssertInputHelperWithoutBlock from './assert-input-helper-without-block'; import AssertLocalVariableShadowingHelperInvocation from './assert-local-variable-shadowing-helper-invocation'; +import AssertModifiersNotInComponents from './assert-modifiers-not-in-components'; import AssertReservedNamedArguments from './assert-reserved-named-arguments'; import AssertSplattributeExpressions from './assert-splattribute-expression'; import DeprecateSendAction from './deprecate-send-action'; @@ -15,7 +16,10 @@ import TransformLinkTo from './transform-link-to'; import TransformOldClassBindingSyntax from './transform-old-class-binding-syntax'; import TransformQuotedBindingsIntoJustBindings from './transform-quoted-bindings-into-just-bindings'; -import { EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS } from '@ember/canary-features'; +import { + EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS, + EMBER_GLIMMER_FORWARD_MODIFIERS_WITH_SPLATTRIBUTES, +} from '@ember/canary-features'; import { SEND_ACTION } from '@ember/deprecated-features'; import { ASTPlugin, ASTPluginEnvironment } from '@glimmer/syntax'; @@ -42,6 +46,10 @@ if (!EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { transforms.push(TransformInputTypeSyntax); } +if (!EMBER_GLIMMER_FORWARD_MODIFIERS_WITH_SPLATTRIBUTES) { + transforms.push(AssertModifiersNotInComponents); +} + if (SEND_ACTION) { transforms.push(DeprecateSendAction); } diff --git a/packages/ember-template-compiler/tests/plugins/assert-modifiers-not-in-components-test.js b/packages/ember-template-compiler/tests/plugins/assert-modifiers-not-in-components-test.js new file mode 100644 index 00000000000..f6e6447cd5e --- /dev/null +++ b/packages/ember-template-compiler/tests/plugins/assert-modifiers-not-in-components-test.js @@ -0,0 +1,51 @@ +import { compile } from '../../index'; +import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; +import { EMBER_GLIMMER_FORWARD_MODIFIERS_WITH_SPLATTRIBUTES } from '@ember/canary-features'; + +if (!EMBER_GLIMMER_FORWARD_MODIFIERS_WITH_SPLATTRIBUTES) { + moduleFor( + 'ember-template-compiler: assert-modifiers-not-in-components', + class extends AbstractTestCase { + [`@test modifiers are not allowed in components`]() { + expectAssertion(() => { + compile(``, { + moduleName: 'the-foo', + }); + }, `Passing modifiers to components require the "ember-glimmer-forward-modifiers-with-splattributes" canary feature, which has not been stabilized yet. See RFC #435 for details. ('the-foo' @ L1:C0) `); + + expectAssertion(() => { + compile(``, { + moduleName: 'the-foo', + }); + }, `Passing modifiers to components require the "ember-glimmer-forward-modifiers-with-splattributes" canary feature, which has not been stabilized yet. See RFC #435 for details. ('the-foo' @ L1:C0) `); + + expectAssertion(() => { + compile(``, { + moduleName: 'the-foo', + }); + }, `Passing modifiers to components require the "ember-glimmer-forward-modifiers-with-splattributes" canary feature, which has not been stabilized yet. See RFC #435 for details. ('the-foo' @ L1:C0) `); + + expectAssertion(() => { + compile(`<@foo {{bar "something" foo="else"}}>`, { + moduleName: 'the-foo', + }); + }, `Passing modifiers to components require the "ember-glimmer-forward-modifiers-with-splattributes" canary feature, which has not been stabilized yet. See RFC #435 for details. ('the-foo' @ L1:C0) `); + + expectAssertion(() => { + compile( + `{{#let this.foo as |local|}}{{/let}}`, + { + moduleName: 'the-foo', + } + ); + }, `Passing modifiers to components require the "ember-glimmer-forward-modifiers-with-splattributes" canary feature, which has not been stabilized yet. See RFC #435 for details. ('the-foo' @ L1:C28) `); + + expectAssertion(() => { + compile(``, { + moduleName: 'the-foo', + }); + }, `Passing modifiers to components require the "ember-glimmer-forward-modifiers-with-splattributes" canary feature, which has not been stabilized yet. See RFC #435 for details. ('the-foo' @ L1:C19) `); + } + } + ); +} diff --git a/yarn.lock b/yarn.lock index f5d90321538..e5ea0cd45b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -747,122 +747,122 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" -"@glimmer/compiler@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.38.1.tgz#03b43a2a8a04b1ed39517862158e8897d0f6798b" - integrity sha512-V4wRYRPH6FSVZw9dNfZn3IRxBofUBL0oGeBLm7wNdUOg4oXE26BMmxRVtYzTsBmmSj7SqB+B6VKuH1jEuvOOhQ== +"@glimmer/compiler@0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.38.2-alpha.2.tgz#bd13b1194c622cdc03a85cf606ffc3adff6bd4c7" + integrity sha512-63uiXrYgHUPSexnHZZy5gSXzUgwL/RC8JJMVE3i8Uf0I3vouf6hAob3YpmpPnmnhqANZsQwn0bAUO5qpF1c5rA== dependencies: - "@glimmer/interfaces" "^0.38.1" - "@glimmer/syntax" "^0.38.1" - "@glimmer/util" "^0.38.1" - "@glimmer/wire-format" "^0.38.1" + "@glimmer/interfaces" "^0.38.2-alpha.2" + "@glimmer/syntax" "^0.38.2-alpha.2" + "@glimmer/util" "^0.38.2-alpha.2" + "@glimmer/wire-format" "^0.38.2-alpha.2" -"@glimmer/encoder@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/encoder/-/encoder-0.38.1.tgz#1b7fd08a83e4412148126d50cbc9c6a08739caa7" - integrity sha512-E5d15cy0F/qiFCJ67KVOxJLkbV5pebiiczjzf/zHTmL250Fj4reISoKsBt0SBWc2IJAj2En3RLEyq6WS8U1sZQ== +"@glimmer/encoder@^0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/encoder/-/encoder-0.38.2-alpha.2.tgz#3e1e015aa4e01018ae7c92b0523c58921879854d" + integrity sha512-mXLJndVeOgflOZUfVBrQiljHc7rMAyqm3Fr8cuTmgLiJmleU6thMpo5MrvqrLEag1sr4tAUpfh8kyHgEhXuaRg== dependencies: - "@glimmer/interfaces" "^0.38.1" - "@glimmer/vm" "^0.38.1" + "@glimmer/interfaces" "^0.38.2-alpha.2" + "@glimmer/vm" "^0.38.2-alpha.2" "@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/interfaces@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.38.1.tgz#5b1c174363396b99d6a6bddb35538151e4c4c989" - integrity sha512-YXnzRR7IviHdN+k2Llp8rQ+ADrdzme++A5EFZRxcUoD14Eu1u2S3al7FlLLfwHhp5R2leO+x3zSYoWsuzfvsqw== +"@glimmer/interfaces@0.38.2-alpha.2", "@glimmer/interfaces@^0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.38.2-alpha.2.tgz#10d3deadbf2393ff989373124962c36fe78fa74f" + integrity sha512-McCv9kzbV8UN97cscCetgNEV6RMRSisZPhD5bF6OSX8cfhAgWrdAt43Ba/RdzfKCtN+cXV8P2a9U9/LZ++NZOA== dependencies: - "@glimmer/wire-format" "^0.38.1" + "@glimmer/wire-format" "^0.38.2-alpha.2" "@simple-dom/interface" "1.4.0" -"@glimmer/low-level@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/low-level/-/low-level-0.38.1.tgz#101147d71a4f1ca1874e45e16a7a777fa8f65d46" - integrity sha512-XydeZ5XzLFKLxtnwsy4Zu3WHJfL4/XYzs24KLaW4HeDxKfhVnJxr2hVWfpF17I3Q35yCOLdbSWp+igVHFA4/7w== - -"@glimmer/node@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/node/-/node-0.38.1.tgz#46d18041207953218bf841110b5c4d1db11eb3ac" - integrity sha512-okAyjPhrUy4d4txuz2qXxo5z2gGZg3e4gjFPpTDKOZRGhWZMAa1mu0KEtnCHtJ4unvhJBBNI7TdSHQX+492Tlw== - dependencies: - "@glimmer/interfaces" "^0.38.1" - "@glimmer/runtime" "^0.38.1" - -"@glimmer/opcode-compiler@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/opcode-compiler/-/opcode-compiler-0.38.1.tgz#da4e871e13ca87c8d80ebb905d0ff2c51c7d9a84" - integrity sha512-p5VdtZDWrW8F3gKS6/DoFGIwpWoquiswAP2XyyQPlXI7IsbnxUhwLd0uQa/rjTPkOIH3okDW/h6ZVAEqEdwTKg== - dependencies: - "@glimmer/encoder" "^0.38.1" - "@glimmer/interfaces" "^0.38.1" - "@glimmer/program" "^0.38.1" - "@glimmer/reference" "^0.38.1" - "@glimmer/util" "^0.38.1" - "@glimmer/vm" "^0.38.1" - "@glimmer/wire-format" "^0.38.1" - -"@glimmer/program@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/program/-/program-0.38.1.tgz#cb50934749fc88843f925d5c9c43ba673de9f473" - integrity sha512-nipMJiYx9ufZkt2iKlNdoi22U2asZ16NUhEllsd/fVw07+CwjI2Ylf93CFtWGDxjQ0qr9ZGPWFk1D7O7Gm6kmA== - dependencies: - "@glimmer/encoder" "^0.38.1" - "@glimmer/interfaces" "^0.38.1" - "@glimmer/util" "^0.38.1" - -"@glimmer/reference@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.38.1.tgz#555bcf90b7e5ea8d39d1089e2bd6a2da14b56184" - integrity sha512-iGuTZhHc0NTw9i7eVdCnbENPGHzJecfPCNNQ1GUm5rsY1/NnLB4tNAEioDz81HAJygOHhnMZgb9YqLEwcwnONw== - dependencies: - "@glimmer/util" "^0.38.1" - -"@glimmer/runtime@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.38.1.tgz#abe0b4affbe29dfe5b15307713a1c03a83fdc41b" - integrity sha512-zArtVsLNXV7VY+1Y8iaouOKvvAdNx1Ios5od7EH3RqAvkx4wxXNBKEAEG4ecj2avxELw+SwhajB/eGBbgBB8ng== - dependencies: - "@glimmer/interfaces" "^0.38.1" - "@glimmer/low-level" "^0.38.1" - "@glimmer/program" "^0.38.1" - "@glimmer/reference" "^0.38.1" - "@glimmer/util" "^0.38.1" - "@glimmer/vm" "^0.38.1" - "@glimmer/wire-format" "^0.38.1" +"@glimmer/low-level@^0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/low-level/-/low-level-0.38.2-alpha.2.tgz#166f72f0c5e531db4b2b55999b6aca2004b7006f" + integrity sha512-5I1n1aaqdlBalsmoMAnUnM8SunUIH6Vt1EXmRyzyT5FaieBuOswnzeBL0wSndtM72Ly7Q1nDm18VItXKCHjr6A== + +"@glimmer/node@0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/node/-/node-0.38.2-alpha.2.tgz#6c11e9a833143fd192af6c61e4390964094b7b78" + integrity sha512-RD3mlNh0fKtZ3lILaWE5QqG3NX2oses62/d/c3Jn5xY5jmRwQUj0UQMVDkD2xNTWt3zM6SIZLDDU19tUhIuPow== + dependencies: + "@glimmer/interfaces" "^0.38.2-alpha.2" + "@glimmer/runtime" "^0.38.2-alpha.2" + +"@glimmer/opcode-compiler@0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/opcode-compiler/-/opcode-compiler-0.38.2-alpha.2.tgz#ef68e0404106cee05eaa3473cb21ff51a0dfc08d" + integrity sha512-gZmG46GFQPI0vwGAxKuRTDBF5ibudxUBye/8gmOs1LVnEaE+rA9jgzSR6pTfTL56PBPO4GCD5tCRAeHJ867XOg== + dependencies: + "@glimmer/encoder" "^0.38.2-alpha.2" + "@glimmer/interfaces" "^0.38.2-alpha.2" + "@glimmer/program" "^0.38.2-alpha.2" + "@glimmer/reference" "^0.38.2-alpha.2" + "@glimmer/util" "^0.38.2-alpha.2" + "@glimmer/vm" "^0.38.2-alpha.2" + "@glimmer/wire-format" "^0.38.2-alpha.2" + +"@glimmer/program@0.38.2-alpha.2", "@glimmer/program@^0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/program/-/program-0.38.2-alpha.2.tgz#c5e428ee66a7a46cafaf0907e3a1829ba2a79605" + integrity sha512-9jckpJdtYFB7arBBTehNbO34UaGybeqg7ym713yLKW5HptVEw+MfC1DAghUciZIugSY2RLxAsiJW8F9IUYFqcA== + dependencies: + "@glimmer/encoder" "^0.38.2-alpha.2" + "@glimmer/interfaces" "^0.38.2-alpha.2" + "@glimmer/util" "^0.38.2-alpha.2" + +"@glimmer/reference@0.38.2-alpha.2", "@glimmer/reference@^0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.38.2-alpha.2.tgz#c4f9930904739ca0db47426bbd757a9124956be6" + integrity sha512-AxlGMCET0LWWRkhVkMFXWHSgLOmBndbxAyBo2aGYDfNS0DalSyT+NuZXiIj9LEQwnx0dnx+OILrGx6EADZ+xYw== + dependencies: + "@glimmer/util" "^0.38.2-alpha.2" + +"@glimmer/runtime@0.38.2-alpha.2", "@glimmer/runtime@^0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.38.2-alpha.2.tgz#48b27620f0835979c774cb12789b9ea4d1119f8d" + integrity sha512-ERBCBOa80rMjuHPBrxdxeYmHdTTo38rGBWg6XjL/snbeCj+NmLoFRA7E+GMXEhUevwyjoO/p3yTIxZBjyP2BCA== + dependencies: + "@glimmer/interfaces" "^0.38.2-alpha.2" + "@glimmer/low-level" "^0.38.2-alpha.2" + "@glimmer/program" "^0.38.2-alpha.2" + "@glimmer/reference" "^0.38.2-alpha.2" + "@glimmer/util" "^0.38.2-alpha.2" + "@glimmer/vm" "^0.38.2-alpha.2" + "@glimmer/wire-format" "^0.38.2-alpha.2" "@simple-dom/interface" "^1.4.0" -"@glimmer/syntax@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.38.1.tgz#625875da5f1e827ad5806fdaa23e2cd00369fda8" - integrity sha512-tzc1NeUd7hbBWqIlgSY5Oq8bEiMpp7ClawVt8hWUarbr9G+qR0toDEQYqZmeRtCXjHAIh9M9oYbpbzLP6+iiag== +"@glimmer/syntax@^0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.38.2-alpha.2.tgz#035f7c9e4fd07c1e0f3bf276e2b657bbc7261a67" + integrity sha512-RkVVKFINZvlHdU8sv3hWkTMmaFAGv9CKaTgKiNF94OH4GW9OBHpl4LQsT6B11cswxsQ28SQkVl6XkHJVy4Tekg== dependencies: - "@glimmer/interfaces" "^0.38.1" - "@glimmer/util" "^0.38.1" + "@glimmer/interfaces" "^0.38.2-alpha.2" + "@glimmer/util" "^0.38.2-alpha.2" handlebars "^4.0.6" simple-html-tokenizer "^0.5.6" -"@glimmer/util@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.38.1.tgz#41ca0544f95ec980bc492f4f0e5a85564964c028" - integrity sha512-WAe+bqJSFBR8EmA/NsxcqWmyi2AfOyW9x1jpWczZHJiBkvssiRF6nre39CJVwwMPlFDtdKzvnRQkWVl8ZBhcNw== +"@glimmer/util@^0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.38.2-alpha.2.tgz#139c0aed8736fa95d2a27b78d702be13406d6ec6" + integrity sha512-KqdR/mj58UdCW93gW45BnyrfuhR2YsmeKivJSYP5B2DTwpfMl1FYUtXhLV6VUoh3ryejCOmaJM5RmyLtUyIODA== -"@glimmer/vm@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.38.1.tgz#30f5bb659c42fbe69a6b5cf42a06c6bd815721ac" - integrity sha512-pxmdJp0GskbwBz7WFvBNWaeoP1+977A0cFnEc3U+GbLBCmyrCq7mRQwFYSRBI8B5/6CkzWhsGXj42Qrkk34m3Q== +"@glimmer/vm@^0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.38.2-alpha.2.tgz#3599017df6e2014d546f97830c590948504250c2" + integrity sha512-WQdlOwC+2cMUTDZynI/KmJDn9bnorEwqezwOyHBc2YYgqsJlv/ie5TF4MnuQSmGLvGt0tehr70J6UTapdPLDmA== dependencies: - "@glimmer/interfaces" "^0.38.1" - "@glimmer/util" "^0.38.1" + "@glimmer/interfaces" "^0.38.2-alpha.2" + "@glimmer/util" "^0.38.2-alpha.2" -"@glimmer/wire-format@^0.38.1": - version "0.38.1" - resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.38.1.tgz#a77963cf7193ab23cbce242116aac613f17cd3dc" - integrity sha512-AT1dToybQxbY29XpkNra9/j7svq65ZNnSXmRs1zUKAarvgh6qxOBsnYeVBNrxBFduNuNJOxP8G0Y+nXEGrUoRQ== +"@glimmer/wire-format@^0.38.2-alpha.2": + version "0.38.2-alpha.2" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.38.2-alpha.2.tgz#a580f9079b164f9db37cbde4169dc1aecd6d1015" + integrity sha512-g3zKL3xjLfhrQmSArKivz65FLWEhL8Y5T+UIjbnisEUp1vC8HKwM9+LfceaUFsop9o6OLE/7ZyE8YE3iCWjgTQ== dependencies: - "@glimmer/util" "^0.38.1" + "@glimmer/util" "^0.38.2-alpha.2" "@simple-dom/document@^1.4.0": version "1.4.0"