
Product
Socket for Jira Is Now Available
Socket for Jira lets teams turn alerts into Jira tickets with manual creation, automated ticketing rules, and two-way sync.
ember-cli-embedded
Advanced tools
Makes it easier to embed your Ember application in another (non-Ember) app.
This addon gives you more control over how and when your Ember app will boot and also allows how to add/override some configuration so that the Ember app can boot with some context-dependent config.
We found it especially useful, for example, when migrating an existing app to Ember part by part.
ember install ember-cli-embedded
This plugin is opt-in by default, it does nothing to your app unless you configure it.
In your config/environment.js, add the following config to the ENV:
let ENV = {
...,
modulePrefix: 'my-app-name',
embedded: {
delegateStart: true,
config: { // optional
// Default values for the config passed at boot
},
},
/*
* 1. If this key is undefined or set to `true`, you will have to start your app with `MyAppName.start(...)`
* 2. If this key is set to `SomeOtherAppName`, you will have to start your app with `SomeOtherAppName.start(...)`
* 3. If this key is set to `false`, you will NOT be able to start your app with `.start(...)` at all
*/
exportApplicationGlobal: 'SomeOtherAppName'
}
Doing so will make your application hold until you manually start it. (read on to learn more)
For compatibility reasons, this behaviour will work as long as the value of
embeddedis truthy but we plan to remove it in a future version.
Please stick to the config format above.
In your JS code, execute MyAppName.start(/* optionalConfig */) to resume the boot of your application. As per the example, it takes an optional configuration as its first argument.
MyAppName.start(/* optionalConfig */) method.MyAppName.start(...) will not work if you've set exportApplicationGlobal: false in your config/environment.jsembeddedConsider the following config/environment.js file:
let ENV = {
...,
modulePrefix: 'my-app',
embedded: {
config: {
option1: 'value-1',
},
},
...
}
And the application is started that way:
<script>
MyApp.start({ option2: "value-2" });
</script>
Then in your Services, Components, Controllers...
class MyService extends Service {
@service embedded;
@action
logSomeConfigKey() {
// Will log 'value-1'
console.log(this.embedded.option1);
}
}
Sometimes it can be more convenient to access the data directly from the container.
Following the previous example:
import { getOwner } from '@ember/application';
...
// Returns the raw config
let embeddedConfig = getOwner(this).lookup('config:embedded');
// Will log 'value-2'
console.log(embeddedConfig.option2);
APP configurationThe startup object will be merged into your APP configuration key, which is very useful, for
instance, if you want to change the rootElement of your application and other context-sensitive
values.
Consider the following config/environment.js file:
let ENV = {
APP: {
rootElement: `#some-element`,
},
modulePrefix: "my-app",
embedded: {
config: {
option1: "value-1",
},
},
};
And the application is started that way:
<script>
MyApp.start({ option2: "value-2" });
</script>
This would result in:
import APP_ENV_CONFIG from "my-app/config/environment";
assert.deepEqual(APP_ENV_CONFIG, {
APP: {
option2: "value-2",
rootElement: `#some-element`,
},
embedded: {
config: {
option1: "value-1",
},
},
});
In your test suite, you will probably want to let your application start automatically without this addon interfering.
To do that, make sure to disable the addon for the test environment:
// file `config/environment.js`
if (environment === "test") {
ENV.embedded.delegateStart = false;
}
If your consuming application relies on TypeScript, you can make your life a bit easier by using the included types:
File /types/my-project/index.d.ts
import type BaseEmbeddedService from "ember-cli-embedded/services/embedded";
declare global {
type EmbeddedService = BaseEmbeddedService<{
one: string;
two?: string;
}>;
}
export {};
File /app/components/my-component.ts
import Component from "@glimmer/component";
import { service } from "@ember/service";
export default class MyComponent extends Component {
/**
* To know why the modifier `declare` should be used when injecting a Service:
* https://github.com/typed-ember/ember-cli-typescript/issues/1406#issuecomment-778660505
*/
@service
declare embedded: EmbeddedService;
get one() {
// Return type inferred: `string | undefined`
return this.embedded.get("one");
}
get two() {
// TypeScript returns an error as `twoo` is not a recognised key
return this.embedded.get("twoo");
}
}
See the Contributing guide for details.
|
MrChocolatine |
xcambar |
GreatWizard |
yonmey |
jacky-peopledoc |
romgere |
|
cah-danmonroe |
saintsebastian |
BlueCutOfficial |
ndekeister-us |
This project is licensed under the MIT License.
FAQs
Control how your Ember application boots in non-Ember pages/apps.
We found that ember-cli-embedded demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 6 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket for Jira lets teams turn alerts into Jira tickets with manual creation, automated ticketing rules, and two-way sync.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.

Security News
NIST will stop enriching most CVEs under a new risk-based model, narrowing the NVD's scope as vulnerability submissions continue to surge.