-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Convert ember-testing and @ember/test to TS #20090
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -23,7 +23,7 @@ import { | |
| } from '@ember/-internals/routing'; | ||
| import type { BootOptions } from '../instance'; | ||
| import ApplicationInstance from '../instance'; | ||
| import Engine from '@ember/engine'; | ||
| import Engine, { buildInitializerMethod } from '@ember/engine'; | ||
| import type { Container, Registry } from '@ember/-internals/container'; | ||
| import { privatize as P } from '@ember/-internals/container'; | ||
| import { setupApplicationRegistry } from '@ember/-internals/glimmer'; | ||
|
|
@@ -220,6 +220,16 @@ class Application extends Engine { | |
| return registry; | ||
| } | ||
|
|
||
| static initializer = buildInitializerMethod<'initializers', Application>( | ||
| 'initializers', | ||
| 'initializer' | ||
| ); | ||
|
|
||
| static instanceInitializer = buildInitializerMethod<'instanceInitializers', ApplicationInstance>( | ||
| 'instanceInitializers', | ||
| 'instance initializer' | ||
| ); | ||
|
Comment on lines
+223
to
+231
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I poked at why this is the way it is, and I believe if we update how // Two significant changes here:
//
// 1. Only parameterize over the bucket name, and simply *infer* the type of
// initializer from it using the bucket name.
// 2. Make the return type explicit, so that the type parameterization can fall
// out from it naturally. that the actual returned function can be simpler,
// not having to do the type parameterization on it.
function buildInitializerMethod<
B extends 'initializers' | 'instanceInitializers'
>(
bucketName: B,
humanName: string
): (this: typeof Engine, initializer: Initializer<Kind<B>>) => void {
return function (initializer) {
// ...
};
}
type Kind<B extends 'initializers' | 'instanceInitializers'> =
B extends 'initializers' ? Engine : EngineInstance;Then the usage here will be: static initializer = buildInitializerMethod('initializers', 'initializer');
static instanceInitializer = buildInitializerMethod(
'instanceInitializers',
'instance initializer'
);
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Seems likely. I didn’t try very hard beyond getting it to work, but it does seem worth trying to clean it up a bit.
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So this works except for one significant problem: I think we want initializers on Application to return Application/ApplicationInstance not Engine/EngineInstance.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Gotcha. Hmm. 🤔 That’s… actually impossible to guarantee from a types POV given the existing API, right?
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For posterity: We spent some time poking at this and it is indeed impossible to guarantee the correct behavior here… because, and only because, it requires inference on the |
||
|
|
||
| /** | ||
| The root DOM element of the Application. This can be specified as an | ||
| element or a [selector string](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors#reference_table_of_selectors). | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -467,7 +467,8 @@ function resolverFor(namespace: Engine) { | |
| return ResolverClass.create(props); | ||
| } | ||
|
|
||
| function buildInitializerMethod< | ||
| /** @internal */ | ||
| export function buildInitializerMethod< | ||
|
Comment on lines
+470
to
+471
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Per comments above, we should update this to be smarter about how it does its thing. |
||
| B extends 'initializers' | 'instanceInitializers', | ||
| T extends B extends 'initializers' ? Engine : EngineInstance | ||
| >(bucketName: B, humanName: string) { | ||
|
|
||
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| import { Adapter } from 'ember-testing'; | ||
|
|
||
| export default Adapter; |
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| import { RSVP } from '@ember/-internals/runtime'; | ||
| import { _backburner } from '@ember/runloop'; | ||
| import { isTesting } from '@ember/debug'; | ||
| import { asyncStart, asyncEnd } from '../test/adapter'; | ||
|
|
||
| RSVP.configure( | ||
| 'async', | ||
| function (callback: (promise: Promise<unknown>) => void, promise: Promise<unknown>) { | ||
| // if schedule will cause autorun, we need to inform adapter | ||
| if (isTesting() && !_backburner.currentInstance) { | ||
| asyncStart(); | ||
| _backburner.schedule('actions', () => { | ||
| asyncEnd(); | ||
| callback(promise); | ||
| }); | ||
| } else { | ||
| _backburner.schedule('actions', () => callback(promise)); | ||
| } | ||
| } | ||
| ); | ||
|
|
||
| export default RSVP; |
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| import { assert } from '@ember/debug'; | ||
| import type { TestableApp } from '../ext/application'; | ||
|
|
||
| export default function andThen(app: TestableApp, callback: (app: TestableApp) => unknown) { | ||
| let wait = app.testHelpers['wait']; | ||
| assert('[BUG] Missing wait helper', wait); | ||
| return wait(callback(app)); | ||
| } |
Uh oh!
There was an error while loading. Please reload this page.