untyped
Generate types and markdown from a config object.
README
untyped
▶️ Check online playground
Install
- ```sh
- # npm
- npm i untyped
- # yarn
- yarn add untyped
- # pnpm
- pnpm add untyped
- ```
Usage
First we have to define a reference object that describes types, defaults, and a $resolve method (normalizer).
- ```js
- const defaultPlanet = {
- name: "earth",
- specs: {
- gravity: {
- $resolve: (val) => parseFloat(val),
- $default: "9.8",
- },
- moons: {
- $resolve: (val = ["moon"]) => [].concat(val),
- $schema: {
- title: "planet moons",
- },
- },
- },
- };
- ```
API
resolveSchema
- ```js
- import { resolveSchema } from "untyped";
- const schema = await resolveSchema(defaultPlanet);
- ```
Output:
- ```json
- {
- "properties": {
- "name": {
- "type": "string",
- "default": "earth"
- },
- "specs": {
- "properties": {
- "gravity": {
- "default": 9.8,
- "type": "number"
- },
- "moons": {
- "title": "planet moons",
- "default": ["moon"],
- "type": "array",
- "items": [
- {
- "type": "string"
- }
- ]
- }
- },
- "type": "object"
- }
- },
- "type": "object"
- }
- ```
generateTypes
- ```js
- import { resolveSchema, generateTypes } from "untyped";
- const types = generateTypes(await resolveSchema(defaultPlanet));
- ```
Output:
- ```ts
- interface Untyped {
- /** @default "earth" */
- name: string;
- specs: {
- /** @default 9.8 */
- gravity: number;
- /**
- * planet moons
- * @default ["moon"]
- */
- moons: string[];
- };
- }
- ```
generateMarkdown
- ```js
- import { resolveSchema, generateMarkdown } from "untyped";
- const markdown = generateMarkdown(await resolveSchema(defaultPlanet));
- ```
Output:
- ```markdown
- # `name`
- - **Type**: `string`
- - **Default**: `"earth"`
- # `specs`
- ## `gravity`
- - **Type**: `number`
- - **Default**: `9.8`
- ## `moons`
- - **Type**: `array`
- - **Default**: `["moon"]`
- ```
💻 Development
- Clone this repository
- 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.