8000 Updated docs, added ignoreClasses and ignoreMethods options · SebastienGllmt/typescript-is@916f063 · GitHub
[go: up one dir, main page]

Skip to content 8000

Commit 916f063

Browse files
committed
Updated docs, added ignoreClasses and ignoreMethods options
1 parent 68d35da commit 916f063

17 files changed

+251
-36
lines changed

README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,33 @@ npx ttsc
8686

8787
Please check the README of [ttypescript](https://github.com/cevek/ttypescript/blob/master/README.md) for information on how to use it in combination with `ts-node`, `webpack`, and `Rollup`.
8888

89+
## Options
90+
91+
There are some options to configure the transformer.
92+
93+
| Property | Description |
94+
|--|--|
95+
| `shortCircuit` | Boolean (default `false`). If `true`, all type guards will return `true`, i.e. no validation takes place. Can be used for example in production deployments where doing a lot of validation can cost too much CPU. |
96+
| `ignoreClasses` | Boolean (default: `false`). If `true`, when the transformer encounters a class, it will ignore it and simply return `true`. If `false`, an error is generated at compile time. |
97+
| `ignoreMethods` | Boolean (default: `false`). If `true`, when the transformer encounters a method, it will ignore it and simply return `true`. If `false`, an error is generated at compile time. |
98+
99+
If you are using `ttypescript`, you can include the options in your `tsconfig.json`:
100+
101+
```json
102+
{
103+
"compilerOptions": {
104+
"plugins": [
105+
{
106+
"transform": "typescript-is/lib/transform-inline/transformer",
107+
"shortCircuit": true,
108+
"ignoreClasses": true,
109+
"ignoreMethods": true
110+
}
111+
]
112+
}
113+
}
114+
```
115+
89116
# ⭐ How to use
90117

91118
*Before using, please make sure you've completed [configuring](#%EF%B8%8F-configuration) the transformer.*

debug/debug.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ const program = ts.createProgram([inFile], configParseResult.options);
2525
const visitorContext: PartialVisitorContext = {
2626
checker: program.getTypeChecker(),
2727
program,
28-
options: {},
28+
options: {
29+
shortCircuit: false
30+
},
2931
typeMapperStack: [],
3032
// mode: { type: 'type-check' },
3133
// pathStack: ['$'],

src/transform-inline/transformer.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ export default function transformer(program: ts.Program, options?: { [Key: strin
1111
const visitorContext: PartialVisitorContext = {
1212
program,
1313
checker: program.getTypeChecker(),
14-
options: options || {},
14+
options: {
15+
shortCircuit: !!(options && options.shortCircuit),
16+
ignoreClasses: !!(options && options.ignoreClasses),
17+
ignoreMethods: !!(options && options.ignoreMethods)
18+
},
1519
typeMapperStack: [],
1620
previousTypeReference: null
1721
};
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import * as ts from 'typescript';
22

3+
interface Options {
4+
shortCircuit: boolean;
5+
ignoreClasses: boolean;
6+
ignoreMethods: boolean;
7+
}
8+
39
export interface VisitorContext extends PartialVisitorContext {
410
functionNames: Set<string>;
511
functionMap: Map<string, ts.FunctionDeclaration>;
@@ -8,7 +14,7 @@ export interface VisitorContext extends PartialVisitorContext {
814
export interface PartialVisitorContext {
915
program: ts.Program;
1016
checker: ts.TypeChecker;
11-
options: { [Key: string]: unknown };
17+
options: Options;
1218
typeMapperStack: Map<ts.Type, ts.Type>[];
1319
previousTypeReference: ts.Type | null;
1420
}

src/transform-inline/visitor-indexed-access.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,23 @@ function visitRegularObjectType(type: ts.ObjectType, indexType: ts.Type, visitor
2020
if (!stringType) {
2121
throw new Error('A non-string type was used to index an object type.');
2222
}
23-
const functionNames = propertiesInfo.map((propertyInfo) => VisitorTypeCheck.visitType(propertyInfo.type, visitorContext));
23+
const functionNames = propertiesInfo.map((propertyInfo) =>
24+
propertyInfo.isMethod
25+
? VisitorUtils.getIgnoredTypeFunction(visitorContext)
26+
: VisitorTypeCheck.visitType(propertyInfo.type!, visitorContext)
27+
);
2428
return VisitorUtils.createDisjunctionFunction(functionNames, name);
2529
} else {
2630
const strings = sliceSet(stringType);
2731
if (strings.some((value) => propertiesInfo.every((propertyInfo) => propertyInfo.name !== value))) {
2832
throw new Error('Indexed access on object type with an index that does not exist.');
2933
}
3034
const stringPropertiesInfo = strings.map((value) => propertiesInfo.find((propertyInfo) => propertyInfo.name === value)!);
31-
const functionNames = stringPropertiesInfo.map((propertyInfo) => VisitorTypeCheck.visitType(propertyInfo.type, visitorContext));
35+
const functionNames = stringPropertiesInfo.map((propertyInfo) =>
36+
propertyInfo.isMethod
37+
? VisitorUtils.getIgnoredTypeFunction(visitorContext)
38+
: VisitorTypeCheck.visitType(propertyInfo.type!, visitorContext)
39+
);
3240
return VisitorUtils.createDisjunctionFunction(functionNames, name);
3341
}
3442
});
@@ -72,7 +80,6 @@ function visitArrayObjectType(type: ts.ObjectType, indexType: ts.Type, visitorCo
7280
}
7381

7482
function visitObjectType(type: ts.ObjectType, indexType: ts.Type, visitorContext: VisitorContext) {
75-
VisitorUtils.throwErrorIfClass(type);
7683
if (tsutils.isTupleType(type)) {
7784
// Tuple with finite length.
7885
return visitTupleObjectType(type, indexType, visitorContext);

src/transform-inline/visitor-is-number.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ function visitArrayObjectType() {
1616
}
1717

1818
function visitObjectType(type: ts.ObjectType, visitorContext: VisitorContext) {
19-
VisitorUtils.throwErrorIfClass(type);
2019
if (tsutils.isTupleType(type)) {
2120
// Tuple with finite length.
2221
return visitTupleObjectType();

src/transform-inline/visitor-is-string-keyof.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ function visitArrayObjectType() {
2424
}
2525

2626
function visitObjectType(type: ts.ObjectType, visitorContext: VisitorContext) {
27-
VisitorUtils.throwErrorIfClass(type);
2827
if (tsutils.isTupleType(type)) {
2928
// Tuple with finite length.
3029
return visitTupleObjectType();

src/transform-inline/visitor-is-string.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ function visitArrayObjectType() {
1818
}
1919

2020
function visitObjectType(type: ts.ObjectType, visitorContext: VisitorContext) {
21-
VisitorUtils.throwErrorIfClass(type);
2221
if (tsutils.isTupleType(type)) {
2322
// Tuple with finite length.
2423
return visitTupleObjectType();

src/transform-inline/visitor-keyof.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ function visitArrayObjectType(visitorContext: VisitorContext) {
7979
}
8080

8181
function visitObjectType(type: ts.ObjectType, visitorContext: VisitorContext) {
82-
VisitorUtils.throwErrorIfClass(type);
8382
if (tsutils.isTupleType(type)) {
8483
// Tuple with finite length.
8584
return visitTupleObjectType(visitorContext);

src/transform-inline/visitor-type-check.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,9 @@ function visitRegularObjectType(type: ts.ObjectType, visitorContext: VisitorCont
272272
),
273273
...properties.map((property) => {
274274
const propertyInfo = VisitorUtils.getPropertyInfo(property, visitorContext);
275-
const functionName = visitType(propertyInfo.type, visitorContext);
275+
const functionName = propertyInfo.isMethod
276+
? VisitorUtils.getIgnoredTypeFunction(visitorContext)
277+
: visitType(propertyInfo.type!, visitorContext);
276278
return ts.createBlock([
277279
ts.createIf(
278280
ts.createBinary(
@@ -410,7 +412,9 @@ function visitTypeParameter(type: ts.Type, visitorContext: VisitorContext) {
410412
}
411413

412414
function visitObjectType(type: ts.ObjectType, visitorContext: VisitorContext) {
413-
VisitorUtils.throwErrorIfClass(type);
415+
if (VisitorUtils.checkIsClass(type, visitorContext)) {
416+
return VisitorUtils.getIgnoredTypeFunction(visitorContext);
417+
}
414418
if (tsutils.isTupleType(type)) {
415419
// Tuple with finite length.
416420
return visitTupleObjectType(type, visitorContext);

0 commit comments

Comments
 (0)
0