0.0.8 • Published 7 months ago

ts-transform-async-to-mobx-keystone-flow v0.0.8

Weekly downloads
-
License
MIT
Repository
-
Last release
7 months ago

ts-transform-async-to-mobx-keystone-flow

Converts typescript async functions into generators wrapped with mobx-keystone.flow. Inspired by ts-transform-async-to-mobx-flow

What it is

In order to run all updates to observables within async functions in mobx-keystone.action, mobx-keystone provides flow helper. flow can only work with generator functions function*.

I find it a little cumbersome to write, and coming from ts-transform-async-to-mobx-flow I was already used to the regular, async/await syntax.

This transfomer is created to allow regular syntax to compile into mobx-keystone's flow syntx.

Example

Input

fn = autoFlow(async (input) => {
  return await callApi(input);
})

Output

import { _async as _async_1, _await as _await_1 } from 'mobx-keystone';

fn = _async_1(function* (this: THISCLASS, input) {
    return yield* _await_1(callApi(input));
  }).call(this);
} 

Input

class Test {
  @autoFlow
  fn = async (input) => {
    return await callApi(input);
  }
}

Output

import { modelFlow as modelFlow_1, _async as _async_1, _await as _await_1 } from 'mobx-keystone';

class Test {
  @modelFlow_1
  fn = _async_1(function* (this: THISCLASS, input) {
    return yield* _await_1(callApi(input));
  }).call(this);
}

Also supports autoModel

autoModel is another helper I added to automatically give identifiers to models, based on their full name. You can send an optional function to generate a model name based on the full name if you don't want to use it as-is.

Input

@autoModel
class Test {
}

Output

import { model as model_1 } from 'mobx-keystone';

@model_1("relative/path/filename")
class Test {
}

How to install

npm i ts-transform-async-to-mobx-keystone-flow -D

or

yarn add ts-transform-async-to-mobx-keystone-flow -D

How to use

You may need to add a reference to this package's typescript definition file in order to declare the global transformToMobxKeystoneFlow function:

/// <reference path="node_modules/ts-transform-async-to-mobx-keystone-flow/transformToMobxKeystoneFlow.d.ts" />

It can be added to a global.d.ts file to access transformToMobxKeystoneFlow in all the project files.

With ttypescript

tsconfig.json

{
  "compilerOptions": {
    "...": "...",
    "plugins": [{ "transform": "ts-transform-async-to-mobx-keystone-flow", "type": "config" }]
  }
}

With ts-loader

// webpack.config.js
const tsTransformAsyncToMobxKeystoneFlow = require('ts-transform-async-to-mobx-keystone-flow').default;

module.exports = {
  // ...
  module: {
    rules: [
      {
        test: /\.(tsx|ts)$/,
        loader: 'ts-loader',
        options: {
          getCustomTransformers: () => ({
            before: [tsTransformAsyncToMobxKeystoneFlow(/** options */)],
          }),
        },
      },
    ],
  },
  // ...
};

With ts-loader and ttypescript

tsconfig.json

{
  "compilerOptions": {
    "...": "...",
    "plugins": [{ "transform": "ts-transform-async-to-mobx-keystone-flow", "type": "config" }]
  }
}
// webpack.config.js
const tsTransformAsyncToMobxKeystoneFlow = require('ts-transform-async-to-mobx-keystone-flow').default;

module.exports = {
  // ...
  module: {
    rules: [
      {
        test: /\.(tsx|ts)$/,
        loader: 'ts-loader',
        options: {
          compiler: 'ttypescript',
        },
      },
    ],
  },
  // ...
};

Configuration

  • mobxKeystonePackage string

    default: 'mobx-keystone'

  • generateModelNameFromFilename (string) => string

    default: undefined

0.0.8

7 months ago

0.0.7

7 months ago

0.0.6

7 months ago

0.0.5

8 months ago

0.0.4

8 months ago

0.0.3

8 months ago

0.0.2

8 months ago

0.0.1

8 months ago