Skip to content

Latest commit

 

History

History
140 lines (108 loc) · 3.33 KB

README.md

File metadata and controls

140 lines (108 loc) · 3.33 KB

Einf logo

A simple electron main process framework.

NPM Version NPM Downloads Workflow Status

Description

Einf is a simple electron main process framework, which provides some decorators and automatic dependency injection to help you simplify the main process code.

Features

  • 💉‍ Support dependency injection powered by Typescript decorators.

  • 🪟 Support custom items injection and window object injection.

  • 🔗 Automatic ipc channel binding to reduce duplication of code.

  • 📦 Tiny size, the whole framework is less than 10kb.

  • 💡 Simple to use, you can use it as a base framework to build your own framework.

Installation

npm i einf
# Or Yarn
yarn add einf
# Or PNPM
pnpm add einf

Usage

  1. Entry point of your electron application like index.ts:
import { BrowserWindow, app } from 'electron'
import { createEinf } from 'einf'
import { AppController } from './app.controller'

async function bootstrap() {
  const window = new BrowserWindow()
  window.loadURL('https://github.com')

  await createEinf({
    // window to create
    window,
    // controllers will be automatically initialized
    controllers: [AppController],
    // custom items to inject
    injects: [{
      name: 'IS_DEV',
      inject: !app.isPackaged,
    }],
  })
}

bootstrap()
  1. Provide at least one controller to start the application, app.controller.ts:
import type { BrowserWindow } from 'electron'
import { app } from 'electron'
import { Controller, Inject, IpcHandle, IpcSend, Window } from 'einf'
import { AppService } from './app.service'

@Controller()
export class AppController {
  constructor(
    private appService: AppService,
    @Inject('IS_DEV') private isDev: boolean,
    @Window() private win: BrowserWindow,
  ) {}

  @IpcSend('reply-msg')
  public replyMsg(msg: string) {
    return msg
  }

  @IpcHandle('send-msg')
  public sendMsg(msg: string) {
    console.log(msg)
    return 'Get msg'
  }

  @IpcHandle('exit')
  public exit() {
    app.quit()
  }
}
  1. You can also inject service via @Injectable decorator, app.service.ts:
import { Injectable } from 'einf'

@Injectable()
export class AppService {
  public createMsg(msg: string): string {
    return `"${msg}" is created by app service`
  }
}
  1. Typescript configuration:

Ensure that experimentalDecorators and emitDecoratorMetadata are enabled in your TypeScript configuration (such as in tsconfig.json). If not, you may encounter an error stating Unable to resolve signature of class decorator when called as an expression.

{
  "compilerOptions": {
    // ... other options
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

License

MIT License © 2022 Archer Gu