0.1.4 • Published 3 years ago

ts-transformer-joi v0.1.4

Weekly downloads
-
License
MIT
Repository
-
Last release
3 years ago

ts-transformer-joi

A TypeScript custom transformer generating Joi schemas from interface info

NPM version Downloads

Requirement

TypeScript >= 2.4.1

How to use this package

This package exports function joiSchema which is responsible for generating a valid Joi schema given an interface.

How to use joiSchema

import { joiSchema } from "ts-transformer-joi";
import * as Joi from 'joi';

interface A {
  foo: string;
  bar: boolean;
}

interface Test {
  a: number,
  b: {
    u: string;
    v?: string;
  },
  c: Pick<A, 'foo'>
}

const schema = joiSchema<Test>();

console.log(Joi.object(schema).describe())

How to use the custom transformer

Unfortunately, TypeScript itself does not currently provide any easy way to use custom transformers (See https://github.com/Microsoft/TypeScript/issues/14419). The followings are the example usage of the custom transformer

webpack (with ts-loader or awesome-typescript-loader)

// webpack.config.js
const joiTransformer = require('ts-transformer-joi/lib/transformer').default;

module.exports = {
  // ...
  module: {
    rules: [
      {
        test: /\.ts$/,
        loader: 'ts-loader', // or 'awesome-typescript-loader'
        options: {
          // make sure not to set `transpileOnly: true` here, otherwise it will not work
          getCustomTransformers: program => ({
              before: [
                  joiTransformer(program)
              ]
          })
        }
      }
    ]
  }
};

Rollup (with rollup-plugin-typescript2)

See examples/rollup for detail.

// rollup.config.js
import resolve from 'rollup-plugin-node-resolve';
import typescript from 'rollup-plugin-typescript2';
import joiTransformer from 'ts-transformer-joi/lib/transformer';

export default {
  // ...
  plugins: [
    resolve(),
    typescript({ transformers: [service => ({
      before: [ joiTransformer(service.getProgram()) ],
      after: []
    })] })
  ]
};

ttypescript

See examples/ttypescript for detail. See ttypescript's README for how to use this with module bundlers such as webpack or Rollup.

// tsconfig.json
{
  "compilerOptions": {
    // ...
    "plugins": [
      { "transform": "ts-transformer-joi/lib/transformer" }
    ]
  },
  // ...
}

ts-jest

See examples/ts-jest for details. In order to use this transformer with ts-jest, you need to add a wrapper around it like this:

// ts-jest-joi-transformer.js
const joiTransformer = require('ts-transformer-joi/lib/transformer').default;
const name = 'my-joi-transformer';
const version = 1;
const factory = (cs) => (ctx) => joiTransformer(cs.tsCompiler.program)(ctx);
module.exports = { name, version, factory };

And add it in jest.config.js like this:

  globals: {
    'ts-jest': {
      // relative path to the ts-jest-joi-transformer.js file
      astTransformers: { before: ['src/react/ts-jest-joi-transformer.js'] }
    }
  }

Note: ts-jest 26.4.2 does not work with this transformer (fixed in ts-jest 26.4.3). Also, for versions smaller than 26.2, you need to provide the transformer in an array instead, like this: astTransformers: { before: ['src/react/ts-jest-keys-transformer.js'] }

TypeScript API

See test for detail. You can try it with $ npm test.

const ts = require('typescript');
const keysTransformer = require('ts-transformer-joi/lib/transformer').default;

const program = ts.createProgram([/* your files to compile */], {
  strict: true,
  noEmitOnError: true,
  target: ts.ScriptTarget.ES5
});

Acknowledgements

0.1.4

3 years ago

0.1.3

3 years ago

0.1.2

3 years ago

0.1.1

3 years ago

0.1.0

3 years ago