untyped

Generate types and markdown from a config object.

README

untyped


▶️ Check online playground

Install


  1. ```sh
  2. # npm
  3. npm i untyped

  4. # yarn
  5. yarn add untyped

  6. # pnpm
  7. pnpm add untyped
  8. ```

Usage


First we have to define a reference object that describes types, defaults, and a $resolve method (normalizer).

  1. ```js
  2. const defaultPlanet = {
  3.   name: "earth",
  4.   specs: {
  5.     gravity: {
  6.       $resolve: (val) => parseFloat(val),
  7.       $default: "9.8",
  8.     },
  9.     moons: {
  10.       $resolve: (val = ["moon"]) => [].concat(val),
  11.       $schema: {
  12.         title: "planet moons",
  13.       },
  14.     },
  15.   },
  16. };
  17. ```

API


resolveSchema


  1. ```js
  2. import { resolveSchema } from "untyped";

  3. const schema = await resolveSchema(defaultPlanet);
  4. ```

Output:

  1. ```json
  2. {
  3.   "properties": {
  4.     "name": {
  5.       "type": "string",
  6.       "default": "earth"
  7.     },
  8.     "specs": {
  9.       "properties": {
  10.         "gravity": {
  11.           "default": 9.8,
  12.           "type": "number"
  13.         },
  14.         "moons": {
  15.           "title": "planet moons",
  16.           "default": ["moon"],
  17.           "type": "array",
  18.           "items": [
  19.             {
  20.               "type": "string"
  21.             }
  22.           ]
  23.         }
  24.       },
  25.       "type": "object"
  26.     }
  27.   },
  28.   "type": "object"
  29. }
  30. ```

generateTypes


  1. ```js
  2. import { resolveSchema, generateTypes } from "untyped";

  3. const types = generateTypes(await resolveSchema(defaultPlanet));
  4. ```

Output:

  1. ```ts
  2. interface Untyped {
  3.   /** @default "earth" */
  4.   name: string;

  5.   specs: {
  6.     /** @default 9.8 */
  7.     gravity: number;

  8.     /**
  9.      * planet moons
  10.      * @default ["moon"]
  11.      */
  12.     moons: string[];
  13.   };
  14. }
  15. ```

generateMarkdown


  1. ```js
  2. import { resolveSchema, generateMarkdown } from "untyped";

  3. const markdown = generateMarkdown(await resolveSchema(defaultPlanet));
  4. ```

Output:

  1. ```markdown
  2. # `name`

  3. - **Type**: `string`
  4. - **Default**: `"earth"`

  5. # `specs`

  6. ## `gravity`

  7. - **Type**: `number`
  8. - **Default**: `9.8`

  9. ## `moons`

  10. - **Type**: `array`
  11. - **Default**: `["moon"]`
  12. ```

💻 Development


- Clone this repository
- Enable Corepack usingcorepack enable (use npm i -g corepack for Node.js < 16.10)
- Install dependencies using pnpm install
- Run interactive tests using pnpm dev
- Use pnpm web to start playground website
- Use pnpm test before push to ensure all tests and lint checks passing

License


Thanks to @dominikschreiber for donating package name.