Skip to content

Commit 17f5803

Browse files
committed
Further clarify README structure.
1 parent e837383 commit 17f5803

File tree

1 file changed

+58
-58
lines changed

1 file changed

+58
-58
lines changed

README.md

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,8 @@ Use TypeScript in your Ember 2.x and 3.x apps!
88
* [Setup and Configuration](#setup-and-configuration)
99
* [Ember Support](#ember-support)
1010
* [`tsconfig.json`](#tsconfigjson)
11-
* [Incremental adoption](#incremental-adoption)
12-
* [Using ember-cli-typescript with Ember CLI addons](#using-ember-cli-typescript-with-ember-cli-addons)
13-
* [Publishing](#publishing)
14-
* [Linking Addons](#linking-addons)
15-
* [Gotchas](#gotchas)
1611
* [Using TypeScript with Ember effectively](#using-typescript-with-ember-effectively)
12+
* [Incremental adoption](#incremental-adoption)
1713
* [Environment configuration typings](#environment-configuration-typings)
1814
* [Service and controller injections](#service-and-controller-injections)
1915
* [Opt-in unsafety for Ember Data lookups](#opt-in-unsafety-for-ember-data-lookups)
@@ -22,6 +18,10 @@ Use TypeScript in your Ember 2.x and 3.x apps!
2218
* ["TypeScript is complaining about multiple copies of the same types"](#typescript-is-complaining-about-multiple-copies-of-the-same-types)
2319
* [Just tell me how to fix it](#just-tell-me-how-to-fix-it)
2420
* [Why is this happening?](#why-is-this-happening)
21+
* [Using ember-cli-typescript with Ember CLI addons](#using-ember-cli-typescript-with-ember-cli-addons)
22+
* [Publishing](#publishing)
23+
* [Linking Addons](#linking-addons)
24+
* [Gotchas](#gotchas)
2525
* [Current limitations](#current-limitations)
2626
* [Some `import`s don't resolve](#some-imports-dont-resolve)
2727
* [Type safety when invoking actions](#type-safety-when-invoking-actions)
@@ -82,7 +82,13 @@ You can still customize those properties in `tsconfig.json` for your use case. J
8282

8383
For example, to see the output of the compilation in a separate folder you are welcome to set `"outDir"` to some path and set `"noEmit"` to `false`. Then tools which use the TypeScript compiler (e.g. the watcher tooling in JetBrains IDEs) will generate files at that location, while the Ember.js/Broccoli pipeline will continue to use its own temp folder.
8484

85-
## Incremental adoption
85+
## Using TypeScript with Ember effectively
86+
87+
In addition to the points made below, you may find the "Update" sequence in the [Typing Your Ember][typing-your-ember] blog series particularly helpful in knowing how to do specific things. In particular, [Update, Part 4][pt4] is a really important guide to making the service and controller injections and Ember Data lookups behave as described below.
88+
89+
[pt4]: http://www.chriskrycho.com/2018/typing-your-ember-update-part-4.html
90+
91+
### Incremental adoption
8692

8793
If you are porting an existing app to TypeScript, you can install this addon and migrate your files incrementally by changing their extensions from `.js` to `.ts`. As TypeScript starts to find errors (and it usually does!), make sure to celebrate your (small) wins with your team, especially if some people are not convinced yet. We would also love to hear your stories!
8894

@@ -96,58 +102,6 @@ You may find the blog series ["Typing Your Ember"][typing-your-ember] helpful as
96102

97103
[typing-your-ember]: http://www.chriskrycho.com/typing-your-ember.html
98104

99-
## Using ember-cli-typescript with Ember CLI addons
100-
101-
During development, your `.ts` files will be watched and rebuilt just like any other sources in your addon when you run `ember serve`, `ember test`, etc.
102-
103-
However, in order not to force downstream consumers to install the entire TS build toolchain when they want to use an addon written in TypeScript, ember-cli-typescript is designed to allow you to publish vanilla `.js` files to the npm registry, alongside `.d.ts` declarations so that consumers who _are_ using TypeScript can benefit from it.
104-
105-
### Publishing
106-
107-
This addon provides two commands to help with publishing your addon: `ember ts:precompile` and `ember ts:clean`. The default `ember-cli-typescript` blueprint will configure your `package.json` to run these commands in the `prepublishOnly` and `postpublish` phases respectively, but you can also run them by hand to verify that the output looks as you expect.
108-
109-
The `ts:precompile` command will put compiled `.js` files in your `addon` directory and populate the overall structure of your package with `.d.ts` files laid out to match their import paths. For example, `addon/index.ts` would produce `addon/index.js` as well as `index.d.ts` in the root of your package.
110-
111-
The `ts:clean` command will remove the generated `.js` and `.d.ts` files, leaving your working directory back in a pristine state.
112-
113-
### Linking Addons
114-
115-
Often when developing an addon, it can be useful to run that addon in the context of some other host app so you can make sure it will integrate the way you expect, e.g. using [`yarn link`](https://yarnpkg.com/en/docs/cli/link#search) or [`npm link`](https://docs.npmjs.com/cli/link).
116-
117-
When you do this for a TypeScript addon, by default your `.ts` files won't be consumed by the host app. In order for a linked addon to work, you need to take two steps:
118-
119-
* ensure `ember-cli-typescript` is installed and set up in the host app
120-
* override [`isDevelopingAddon()`](https://ember-cli.com/api/classes/Addon.html#method_isDevelopingAddon) in the linked addon to return `true`
121-
122-
This will cause `ember-cli-typescript` in the host app to take over compiling the TS files in the addon as well, automatically rebuilding any time you make a change.
123-
124-
**Note**: remember to remove your `isDevelopingAddon` override before publishing!
125-
126-
### In-Repo Addons
127-
128-
[In-repo addons](https://ember-cli.com/extending/#detailed-list-of-blueprints-and-their-use) work in much the same way as linked ones: their TypeScript compilation is managed by the host app. They have `isDevelopingAddon` return `true` by default, so the only thing you should need to do for an in-repo addon is update the `paths` entry in your `tsconfig.json` so instruct the compiler how to resolve imports:
129-
130-
```js
131-
paths: {
132-
// ...other entries e.g. for your app/ and tests/ trees
133-
'my-addon': ['lib/my-addon/addon'], // resolve `import x from 'my-addon';
134-
'my-addon/*': ['lib/my-addon/addon/*'] // resolve `import y from 'my-addon/utils/y';
135-
}
136-
```
137-
138-
### Gotchas
139-
140-
A few things to look out for when working with TypeScript in addons:
141-
142-
* Normally, addons under development automatically return `true` from their `isDevelopingAddon()` hook, which `ember-cli-typescript` relies on to determine whether to process the addon's `.ts` files. However, if the name field in your `package.json` doesn't match the name in your `index.js`, this default behavior will fail and you'll need to override the method yourself.
143-
* TypeScript has very particular rules when generating declaration files to avoid letting private types leak out unintentionally. You may find it useful to run `ember ts:precompile` yourself as you're getting a feel for these rules to ensure everything will go smoothly when you publish.
144-
145-
## Using TypeScript with Ember effectively
146-
147-
In addition to the points made below, you may find the "Update" sequence in the [Typing Your Ember][typing-your-ember] blog series particularly helpful in knowing how to do specific things. In particular, [Update, Part 4][pt4] is a really important guide to making the service and controller injections and Ember Data lookups behave as described below.
148-
149-
[pt4]: http://www.chriskrycho.com/2018/typing-your-ember-update-part-4.html
150-
151105
### Environment configuration typings
152106

153107
Along with the @types/ files mentioned above, ember-cli-typescript adds a starter interface for `config/environment.js` in `config/environment.d.ts`. This interface will likely require some changes to match your app.
@@ -384,6 +338,52 @@ There are two options here, neither of them _great_:
384338

385339
If you're using another package which includes these types, and then you trigger an upgrade for your own copy of the type definitions, npm and yarn will both try to preserve the existing installation and simply add a new one for your updated version. In most cases, this is sane behavior, because it prevents transitive dependency breakage hell. However, in the _specific_ case of type definitions, it causes TypeScript to get confused.
386340

341+
## Using ember-cli-typescript with Ember CLI addons
342+
343+
During development, your `.ts` files will be watched and rebuilt just like any other sources in your addon when you run `ember serve`, `ember test`, etc.
344+
345+
However, in order not to force downstream consumers to install the entire TS build toolchain when they want to use an addon written in TypeScript, ember-cli-typescript is designed to allow you to publish vanilla `.js` files to the npm registry, alongside `.d.ts` declarations so that consumers who _are_ using TypeScript can benefit from it.
346+
347+
### Publishing
348+
349+
This addon provides two commands to help with publishing your addon: `ember ts:precompile` and `ember ts:clean`. The default `ember-cli-typescript` blueprint will configure your `package.json` to run these commands in the `prepublishOnly` and `postpublish` phases respectively, but you can also run them by hand to verify that the output looks as you expect.
350+
351+
The `ts:precompile` command will put compiled `.js` files in your `addon` directory and populate the overall structure of your package with `.d.ts` files laid out to match their import paths. For example, `addon/index.ts` would produce `addon/index.js` as well as `index.d.ts` in the root of your package.
352+
353+
The `ts:clean` command will remove the generated `.js` and `.d.ts` files, leaving your working directory back in a pristine state.
354+
355+
### Linking Addons
356+
357+
Often when developing an addon, it can be useful to run that addon in the context of some other host app so you can make sure it will integrate the way you expect, e.g. using [`yarn link`](https://yarnpkg.com/en/docs/cli/link#search) or [`npm link`](https://docs.npmjs.com/cli/link).
358+
359+
When you do this for a TypeScript addon, by default your `.ts` files won't be consumed by the host app. In order for a linked addon to work, you need to take two steps:
360+
361+
* ensure `ember-cli-typescript` is installed and set up in the host app
362+
* override [`isDevelopingAddon()`](https://ember-cli.com/api/classes/Addon.html#method_isDevelopingAddon) in the linked addon to return `true`
363+
364+
This will cause `ember-cli-typescript` in the host app to take over compiling the TS files in the addon as well, automatically rebuilding any time you make a change.
365+
366+
**Note**: remember to remove your `isDevelopingAddon` override before publishing!
367+
368+
### In-Repo Addons
369+
370+
[In-repo addons](https://ember-cli.com/extending/#detailed-list-of-blueprints-and-their-use) work in much the same way as linked ones: their TypeScript compilation is managed by the host app. They have `isDevelopingAddon` return `true` by default, so the only thing you should need to do for an in-repo addon is update the `paths` entry in your `tsconfig.json` so instruct the compiler how to resolve imports:
371+
372+
```js
373+
paths: {
374+
// ...other entries e.g. for your app/ and tests/ trees
375+
'my-addon': ['lib/my-addon/addon'], // resolve `import x from 'my-addon';
376+
'my-addon/*': ['lib/my-addon/addon/*'] // resolve `import y from 'my-addon/utils/y';
377+
}
378+
```
379+
380+
### Gotchas
381+
382+
A few things to look out for when working with TypeScript in addons:
383+
384+
* Normally, addons under development automatically return `true` from their `isDevelopingAddon()` hook, which `ember-cli-typescript` relies on to determine whether to process the addon's `.ts` files. However, if the name field in your `package.json` doesn't match the name in your `index.js`, this default behavior will fail and you'll need to override the method yourself.
385+
* TypeScript has very particular rules when generating declaration files to avoid letting private types leak out unintentionally. You may find it useful to run `ember ts:precompile` yourself as you're getting a feel for these rules to ensure everything will go smoothly when you publish.
386+
387387
## Current limitations
388388

389389
While TS already works nicely for many things in Ember, there are a number of corners where it _won't_ help you out. Some of them are just a matter of further work on updating the [existing typings]; others are a matter of further support landing in TypeScript itself, or changes to Ember's object model.

0 commit comments

Comments
 (0)