@bugaboo/babel-plugin-mobx-deep-action
v2.0.4
Published
Allow to reduce boilerplate of writing async actions
Downloads
211
Readme
babel-plugin-mobx-deep-action
Translations
Allow to reduce boilerplate of writing async actions. Based on assumption, that all code created inside an action, should be handled as action too.
This plugin scans for all functions, marked as actions, and then marks all nested functions, which created inside actions as actions too.
It works with the classic action API and with mobx 6's makeAutoObservable
(see Caveats).
Example
In
import { action } from "mobx";
action(function doSome() {
fetch("/api/list").then(function(response) {
this.items = response.data;
});
});Out
"use strict";
import { action } from "mobx";
action(function doSome() {
fetch("/api/list").then(action(function(response) {
this.items = response.data;
}));
});Caveats
The plugin only supports ES6 import syntax.
If your store class calls mobx 6's makeAutoObservable(this) in its constructor, the
plugin detects it automatically and deep-wraps the nested functions inside the class
methods as actions. It also injects import { action } from "mobx" for you when it is
not already imported.
If you do not use makeAutoObservable, import action from mobx explicitly.
Only these imports are supported:
import {action} from "mobx";import {action as actionAlias} from "mobx";import * as mobx from "mobx";import * as mobxAlias from "mobx";For example, these cases are not supported:
const mobx = require("mobx")const {action} = require("mobx")import * as mobx from "my-mobx-alias"import * as mobx from "mobx";
const {action} = mobx;
action(function() {});Installation
$ npm install @bugaboo/babel-plugin-mobx-deep-actionUsage
Via .babelrc (Recommended)
.babelrc
{
"plugins": ["@bugaboo/babel-plugin-mobx-deep-action"]
}Via CLI
$ babel --plugins @bugaboo/babel-plugin-mobx-deep-action script.jsVia Node API
require("@babel/core").transform("code", {
plugins: ["@bugaboo/babel-plugin-mobx-deep-action"]
});Usage for async and generator functions.
see https://github.com/Strate/babel-plugin-mobx-async-action
Typescript decorators.
This plugin could handle decorators code, emitted from typescript, such as:
import * as tslib_1 from "tslib";
import { action } from "mobx";
export default class Class2 {
async method() {
const a = (other) => { };
return a(function () { });
}
}
tslib_1.__decorate([
action
], Class2.prototype, "method", null);To get this code worked, you should enable importHelpers compiler option, and get tslib package installed. Also, typescript should emit es6 modules, so, you should target your compiler to es2015+. That's all, plugin detect import from "tslib" and handle typescript decorators.
Use other package.
If you use wrapper for "mobx" package, you can pass it's name to plugin:
.babelrc
{
"plugins": [
["@bugaboo/babel-plugin-mobx-deep-action", {
"mobx-package": "mobx-custom"
}]
]
}