ts-types-parser
v1.0.3
Published
Parse TypeScript types definitions into... something else
Downloads
9
Maintainers
Readme
TS Types Parser
Parse TypeScript types definitions into... something else.
Using cases
Parsing TS types allows you automatically for example:
- Prepare SQL code to generate tables according to TS models
- Writing dynamic API in other languages and preparing other languages to work with data send by or for such TS script
- Writing validation for models in any language (for example in TS itself)
Installing
- Use NPM like that:
npm i -g ts-types-parser- ...or just clone repo.
Usage
CLI
- If you installed as global module:
ts-types-parser rules.js- If clonned repo:
node cli.js rules.js- Example
rules-file.jsfile for CLI usage
module.exports = p => {
// Parser as p
// ...and rules here :)
};
Module
- If you installed as local module:
const Parser = require('ts-types-parser');
const parser = new Parser;
// Your rules here
parser.run();Rules - Parser class
Methods
setSource(path: string | string[])
Allows to setup new single or multiple sources files. That files should be valid TypeScript files, all of them will be joined into single long string.
Remember: You have to add all needed files to sources with types because exports aren't resolved.
setTarget(path: string)
Allows to setup file which will contain result. Whole file will be replaced if no delimiters are set.
setDelimiters(start: string, end: string)
Allows to setup delimiters for target file between which content will be replaced.
Remember: Those delimiters are used inside regular expression so you have to escape all special charaters.
mainType(name: string)
Given name will be used as "entry point" at parsing. For example: if your tree of types begins from interface Main or type Main you should call p.mainType('Main'). There can exists only single "main" type, if you need more recurslivy parsing then using multiple instances of Parser class will be solution.
expandTypes(arr: string[])
Given here types will be resolved at occurring. For example:
// some.d.ts
type Point {
x: number;
y: number;
};
interface Main {
one: Point;
two: Point;
};Without any expanding will iterate trough:
one # Point
two # PointWith p.expandTypes(['Point']) will iterate trough:
one # Point
one # object
one,x # number
one,y # number
two # Point
two # object
two,x # number
two,y # numbersetPathProxy(cb: (path: string[]) => any)
Allows modify all paths before any call. For example:
p.setPathProxy(x => x.filter(x => !/\d+$/.test(x)).join('#'));setIndent(indent: string)
Allows to set custom indent (default is 4 spaces). This indent will be used at leveling your result.
levelUp()
levelDown()
Level up or down current indent.
writeDescription(prefix: string = '// ')
Write description block into result in current place. Example:
// Automatically generated code by "ts-types-parser"
// Generated at Thu, 30 May 2019 22:07:35 GMT
// Source files:
// - types1.d.ts
// - types2.d.tslog({ optional: boolean, path: string, type: string })
Uses same object such will be send to parser and log given data in such way:
// test.d.ts
type Point {
x?: number;
y: number;
};
interface Main {
one?: Point;
two: Point;
};
// Result
one # Point [optional]
one # object
one,x # number [optional]
one,y # number
two # Point
two # object
two,x # number [optional]
two,y # numberused()
Set current path as used. See event unused for more informations.
write(txt: string)
Push new line into result, also marks current path as used.
run()
Runs parser ...and occasionally yells with errors.
Events
type Entry = { path: string[] | any, type: string, optional: boolean };
All paths in events are result of method which can be set using p.setPathProxy(cb). Default paths are array of strings.
walk -> Entry
Just walk through all paths.
type::<SOME_TYPE> -> Entry
Will be emitted only when selected type occurs.
unused -> Entry
Will be emitted when none of callbacks didn't call p.write() or p.used().
level-up -> Entry
level-down -> Entry
Fired when level of path has been level upped, it's something else than p.levelUp() and p.levelDown(). Useful when you need to close whole subtree in some scope. For Example:
p.on('level-up', ({ path }) => {
if (type === 'Array') {
p.write('Array(10).fill(0).forEach((_, i) => {');
p.levelUp();
}
});
p.on('level-down', ({ path }) => {
if (type === 'Array') {
p.levelDown();
p.write('});');
}
});will close Array content inside .forEach.
done -> void
Parsing done, but you still can write something at end of result.
TODO
- [ ] Ironically I should rewrite this script in TypeScript
- [ ] Probably not all cases are parsed, for exmaple
uniontypes - [ ] Script needs tests
- [ ] Script needs also more examples
License
This project is licensed under the Apache-2.0 License - see the LICENSE.md file for details
