---
tags: brew-js
---
# Creating app instance
To initialize the application, the default export function `brew` must be called exactly once in your script's entry point:
```typescript
import brew from "brew-js/core";
brew((app) => {
// app: Brew.AppInstance<{}>
// init code, implementing app logic
});
```
To enable extensions, import the extensions and configure them by `app.use*` methods:
```typescript
import brew from "brew-js/core";
import Router from "brew-js/extension/router";
// if you are using TypeScript, add Brew.With* interface to the generic type
// this will mix in the app.use* method
brew.with(Router)((app) => {
// the useRouter method is provided by Brew.WithRouter
app.useRouter({
// options for the router extension
});
});
```
You can also define additional property members and methods on the app instance:
```typescript
import brew from "brew-js/core";
// if you are using TypeScript, define an interface for your app
interface MyApp extends Brew.WithRouter {
myProp: string;
myAction(): void;
}
// and then init the app with your interface
// this will allow you to define the app members
brew<MyApp>((app) => {
app.define({
myProp: 'myValue',
myAction() { /* do actions */ }
});
});
```
After defining the shape of app instance, you can write the HTML template.
### `app.beforeInit`
Postpones `ready` event until the promise is fulfilled.
Some APIs or extensions may implicitly use `app.beforeInit`.
```typescript
app.beforeInit(promiseOrCallback): void
```
###### Example
```typescript
brew(app => {
app.beforeInit(() => {
return new Promise((resolve) => {
setTimeout(resolve, 1000);
});
});
app.on('ready', () => {
// this is delayed for 1 second by
// the promise of beforeInit
});
});
```
### `ready` event
| Bubbles | Handleable |
| ------- | ---------- |
| No | No |
Fired when dom is ready and every required asynchronous tasks registered by `app.beforeInit` have completed. First `navigate` event will be followed if router is enabled.
```typescript
app.on('ready', callback): void
```