Skip to content

Encourage decentralizing the template registry for Ember projects #67

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

Merged
merged 2 commits into from
Mar 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,18 +205,20 @@ export default class Greeting extends Component<GreetingSignature> {

Because Ember's template resolution occurs dynamically at runtime today, Glint needs a way of mapping the names used in your templates to the actual backing value they'll be resolved to. This takes the form of a "type registry" similar to the one that powers Ember Data's types.

The recommended approach is to create a single file, for example at `types/template-registry.d.ts`, in which you can populate references to your app's components, helpers and modifiers.
The recommended approach is to include a declaration in each component, modifier or helper module that adds it to the registry, which is the default export of `@glint/environment-ember-loose/types/registry`.

```ts
// types/template-registry.d.ts
// app/components/greeting.ts

import Component from '@glint/environment-ember-loose/glimmer-component';

import '@glint/environment-ember-loose/types/registry';
export default class Greeting extends Component {
// ...
}

declare module '@glint/environment-ember-loose/types/registry' {
export default interface Registry {
capitalize: typeof import('my-app/helpers/capitalize').default;
Shout: typeof import('my-app/components/shout').default;
SuperTable: typeof import('my-app/components/super-table').default;
Greeting: typeof Greeting;
}
}
```
Expand Down
8 changes: 7 additions & 1 deletion test-packages/demo-ember-app/app/components/bar/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Component from '@glint/environment-ember-loose/glimmer-component';

interface BarSignature {
export interface BarSignature {
Args: {
grault: number;
};
Expand All @@ -9,3 +9,9 @@ interface BarSignature {
export default class Bar extends Component<BarSignature> {
name = 'BAR';
}

declare module '@glint/environment-ember-loose/types/registry' {
export default interface Registry {
Bar: typeof Bar;
}
}
6 changes: 6 additions & 0 deletions test-packages/demo-ember-app/app/components/ember.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,9 @@ export default class Ember extends Component<EmberSignature> {
return { required, hasDefault, optional };
}
}

declare module '@glint/environment-ember-loose/types/registry' {
export default interface Registry {
Ember: typeof Ember;
}
}
6 changes: 6 additions & 0 deletions test-packages/demo-ember-app/app/components/foo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,9 @@ export default class Foo extends Component {

obj = { a: 'A', b: 'B', c: 1, 𝚪: '' };
}

declare module '@glint/environment-ember-loose/types/registry' {
export default interface Registry {
Foo: typeof Foo;
}
}
6 changes: 6 additions & 0 deletions test-packages/demo-ember-app/app/components/qux.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,9 @@ import Component from '@glint/environment-ember-loose/glimmer-component';
export default class Qux extends Component {
name = 'QUX';
}

declare module '@glint/environment-ember-loose/types/registry' {
export default interface Registry {
Qux: typeof Qux;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
import Component from '@glint/environment-ember-loose/glimmer-component';

export default class BazComponent extends Component {
export interface BazSignature {
Args: { optional?: string };
}

export default class BazComponent extends Component<BazSignature> {
name = 'BAZ';
}

declare module '@glint/environment-ember-loose/types/registry' {
export default interface Registry {
Baz: typeof BazComponent;
}
}
11 changes: 0 additions & 11 deletions test-packages/demo-ember-app/types/template-registry.d.ts

This file was deleted.