json-ts
v1.6.4
Published
Automatically generate Typescript Definition files or Flow types from JSON input
Downloads
16,254
Maintainers
Readme
npm install -g json-ts
Automatically generate Typescript Definition files or Flow types from JSON input.
Use it via the API, CLI, or Website
How does json-ts stack up against the competition?
|Feature |json-ts (this library) |json-to-ts |json2ts | |---|---|---|---| |simple literal types (number, string etc) |YES |YES |YES | |array type, all elements of same kind |YES |YES |YES | |merge multiple json files|YES (cli, v1.6 & above) |NO |NO | |optional members | YES | YES | NO | |array union types | YES |YES |NO | |correct handling of top-level values (strings, arrays, arrays of objects numbers etc) |YES |NO |NO | |recursive data structures (see here) |YES |NO |NO | |nested type literals (to account for invalid interface names) |YES |YES |NO | |output @flow types |YES |NO |NO | |Website |YES |YES |YES | |CLI |YES |NO |NO | |API |YES |YES |NO |
Quick-start
# install
npm install -g json-ts
# run against a single JSON file
json-ts dir/myfile.json
# run against multiple single JSON files (interfaces will be merged)
json-ts api/resp1.json api/resp2.json
Usage (CLI)
Note: only stdin (which requires the --stdin flag) & filepaths are supported right now. Later I will add support for Windows, reading data from network requests etc.
## piping via stdin
curl https://jsonplaceholder.typicode.com/posts/1 | json-ts --stdin
## reading single json file from disk
json-ts my-file.json
## reading multiple json files from disk
json-ts my-file.json my-other-file.json
... produces the following:
interface IRootObject {
userId: number;
id: number;
title: string;
body: string;
}
Usage (API)
npm install json-ts --save-dev
const { json2ts } = require('json-ts');
const json = `
{
"name": "Shane"
}
`;
console.log(json2ts(json))
... produces the following:
interface IRootObject {
name: string;
}
For more examples, see the Tests
Options
- namespace: string - if provided, interfaces will be wrapped in a namespace (see below)
# usage json-ts <filename> --namespace <namespace_name> # example json-ts data/my-file.json --namespace API
- flow: boolean - output types in Flow format.
# usage json-ts <filename> --flow # example json-ts data/my-file.json --flow
- prefix: string - override the
I
prefix on interface names# usage json-ts <filename> --prefix <prefix_string> # example (remove prefix) json-ts data/my-file.json --prefix ""
- rootName: string - override the
RootObject
name of the top-level interface# usage json-ts <filename> --rootName <rootname_string> # example json-ts data/my-file.json --rootName "Product"
TODO:
options
- [x] Allow choice of
I
prefix on interface names - [x] Allow naming of RootObject
- [ ] Allow choice of spaces/tabs
Core
- [x] support array types
- [x] support boolean types
- [x] support null types
- [x] output types for Flow via
--flow
- [x] PascalCase as default for all interface names
- [x] de-dupe interfaces (it's dumb atm, POC)
- [x] de-dupe interfaces where propname differs, but members are the same
- [x] merge interfaces by creating union types for members
- [x] union types for array that contain mixed literal types:
nums: [1, "2"] -> nums: number|string[]
(already works for complex objects) - [x] quoted member names when needed
- [x] handle invalid name for interface
- [x] support type alias declarations
- [x] Use Typescript factory methods/printer for output
- [x] Allow wrapping in namespace: eg:
declare namespace Projects { export interface ILoc { lat: number; lng: number; } ... }
CLI
- [x] CLI tool to accept stdin (with
--stdin
flag) - [x] CLI tool to accept json file as input
- [ ] CLI tool to accept URL as input (for validating against remote API)
- [ ] configurable output (filename/stdout etc)