# ember-strict-application-resolver

A polyfill implementation of the upcoming default strict resolver built in to Ember.

## Installation

```
npm add ember-strict-application-resolver
```

## Usage

In your app.js or app.ts, or wherever you configure your application
```diff
- import config from '<app-name>/config/environment';
- import EmberApp from '@ember/application';
- import EmberResolver from 'ember-resolver';
+ import EmberApp from 'ember-strict-application-resolver';

  class YouApp extends EmberApp {
-   modulePrefix = config.modulePrefix;
-   podModulePrefix = config.podModulePrefix;
-   Resolver = EmberResolver.withModules({
-      [`${config.modulePrefix}/router`]: { default: Router },
-      [`${config.modulePrefix}/services/manual`]: { default: Manual },
-    });

+    modules = {
+      './router': { default: Router },
+      './services/manual': { default: SomeService },
+      './services/manual-shorthand': SomeOtherService,
+
+      // now import.meta.glob just works
+      ...import.meta.glob('./services/**/*.{js,ts}', { eager: true }),
+      ...import.meta.glob('./routes/*.{js,ts}', { eager: true }),
+      ...import.meta.glob('./templates/**/*.{gjs,gts}', { eager: true }),
+    };
  }
```

The type of `modules` is:
```ts
{ 
  [modulePath: string]:
    | ExportableType
    | { [exportName: string]: ExportableType };
};
```

### `buildRegistry`

> [!IMPORTANT]
> This API is a stop-gap, and will be removed when `@embroider/virtual/compat-modules` supports working in both libraries and apps with no `modulePrefix`

Libraries may declare `ember-strict-application-resolver` as a `dependencies` entry, and then import from `./build-registry` - to provide helpers for packages all the library's services and other things that need to be in the registry (such as from the library's dependencies as well)

For example:
```js
// in src/registry.ts (or js)
import { buildRegistry } from 'ember-strict-application-resolver/build-registry';
import TheService from 'from-dependency/services/the-service';

export default buildRegistry({
  ...import.meta.glob('./services/*.{js,ts}', { eager: true }),
  './services/the-service': { default: TheService },
});
```

Then consumers of your library would either splat this into their `modules` object:
```js
import libraryRegistry from 'your-library/registry';
// ...

modules = {
  // if the app is using ember-strict-application-resolver
  ...libraryRegistry(),
  // or if using ember-resolver
  ...libraryRegistry('name-of-app'),
}
```

Or consuming libraries would propagate the configuration for their consumers:
```js
import { buildRegistry } from 'ember-strict-application-resolver/build-registry';
import libraryRegistry from 'your-library/registry';

export default buildRegistry({
  ...import.meta.glob('./services/*.{js,ts}', { eager: true }),
  // No argument should be passed here
  ...libraryRegistry(),
});
```

## Contributing

See the [Contributing](CONTRIBUTING.md) guide for details.

## License

This project is licensed under the [MIT License](LICENSE.md).
