Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit ddb41d8

Browse files
authored
refactor: restructured project (#202)
* refactor: restructured project * ignore dist/tests during coverage * ignore tests as well
1 parent 8780ece commit ddb41d8

File tree

12 files changed

+98
-48
lines changed

12 files changed

+98
-48
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@
66
coverage/
77
.nyc_output/
88
npm-debug.log
9+
dist/

.vscode/tasks.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
// See https://go.microsoft.com/fwlink/?LinkId=733558
3+
// for the documentation about the tasks.json format
4+
"version": "0.1.0",
5+
"command": "npm",
6+
"isShellCommand": true,
7+
"showOutput": "silent",
8+
"suppressTaskName": true,
9+
"tasks": [
10+
{
11+
"taskName": "build",
12+
"args": [
13+
"run",
14+
"build",
15+
"--",
16+
"--watch"
17+
],
18+
"echoCommand": true,
19+
"isBuildCommand": true,
20+
"isWatching": true
21+
}
22+
]
23+
}

cli.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/usr/bin/env node
2-
var react2dts = require('./index');
2+
var react2dts = require('./dist/src/index');
33
var minimist = require('minimist');
44

55
var options = minimist(process.argv.slice(2), {

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22
"name": "react-to-typescript-definitions",
33
"version": "0.13.0",
44
"description": "Create typescript definitions files (d.ts) from react components",
5-
"main": "index.js",
5+
"main": "dist/src/index.js",
66
"bin": {
77
"react2dts": "cli.js"
88
},
99
"files": [
10-
"index.js",
10+
"dist",
1111
"cli.js",
12-
"index.d.ts",
13-
"index.js.map"
12+
"index.d.ts"
1413
],
1514
"scripts": {
1615
"start": "npm test",
@@ -19,7 +18,7 @@
1918
"build": "tsc --sourceMap",
2019
"build:inline": "tsc --inlineSourceMap",
2120
"pretest": "npm run clean && npm run build:inline",
22-
"test": "nyc --all --reporter lcov ./node_modules/.bin/mocha --require source-map-support --recursive tests/*-test.js",
21+
"test": "nyc --all --reporter lcov ./node_modules/.bin/mocha --require source-map-support --recursive dist/tests/*-test.js",
2322
"coverage": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls",
2423
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -w",
2524
"prerelease": "npm test && npm run build",
@@ -71,6 +70,7 @@
7170
"exclude": [
7271
"node_modules",
7372
"coverage",
73+
"dist/tests",
7474
"tests"
7575
]
7676
}

index.ts renamed to src/index.ts

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,23 @@ import * as babylon from 'babylon';
33
import * as dom from 'dts-dom';
44

55
export interface InstanceOfResolver {
6-
(name: string): string;
6+
(name: string): string|undefined;
77
};
88

99
export interface IOptions {
10+
1011
/**
1112
* Resolves type names to import paths.
1213
*
1314
* @return Path to given name if resolveable, undefined otherwise
1415
*/
1516
instanceOfResolver?: InstanceOfResolver;
17+
1618
/**
1719
* The Generator generating .d.ts code with.
1820
*
1921
* This option is deprecated with 0.13 and is not supported anymore.
2022
* any new feature will not work with the deprecated Generator interface.
21-
2223
* @deprecated
2324
*/
2425
generator?: Generator;
@@ -71,11 +72,11 @@ export function cli(options: any): void {
7172
});
7273
}
7374

74-
export function generateFromFile(moduleName: string, path: string, options?: IOptions): string {
75+
export function generateFromFile(moduleName: string|null, path: string, options?: IOptions): string {
7576
return generateFromSource(moduleName, fs.readFileSync(path).toString(), options);
7677
}
7778

78-
export function generateFromSource(moduleName: string, code: string, options: IOptions = {}): string {
79+
export function generateFromSource(moduleName: string|null, code: string, options: IOptions = {}): string {
7980
const ast = babylon.parse(code, {
8081
sourceType: 'module',
8182
allowReturnOutsideFunction: true,
@@ -101,9 +102,9 @@ export function generateFromSource(moduleName: string, code: string, options: IO
101102
return generateFromAst(moduleName, ast, options);
102103
}
103104

104-
const defaultInstanceOfResolver: InstanceOfResolver = (name: string): string => undefined;
105+
const defaultInstanceOfResolver: InstanceOfResolver = (_name: string): undefined => undefined;
105106

106-
export function generateFromAst(moduleName: string, ast: any, options: IOptions = {}): string {
107+
export function generateFromAst(moduleName: string|null, ast: any, options: IOptions = {}): string {
107108
const parsingResult = parseAst(ast, options.instanceOfResolver);
108109
if (options.generator) {
109110
return deprecatedGenerator(options.generator, moduleName, parsingResult);
@@ -117,7 +118,7 @@ export function generateFromAst(moduleName: string, ast: any, options: IOptions
117118
if (propTypes) {
118119
Object.keys(propTypes).forEach(propName => {
119120
const prop = propTypes[propName];
120-
if (prop.importPath) {
121+
if (prop.importType && prop.importPath) {
121122
code += dom.emit(dom.create.importDefault(prop.importType, prop.importPath));
122123
}
123124
});
@@ -135,7 +136,7 @@ export function generateFromAst(moduleName: string, ast: any, options: IOptions
135136
if (propTypes) {
136137
Object.keys(propTypes).forEach(propName => {
137138
const prop = propTypes[propName];
138-
if (prop.importPath) {
139+
if (prop.importType && prop.importPath) {
139140
m.members.push(dom.create.importDefault(prop.importType, prop.importPath));
140141
}
141142
});
@@ -190,14 +191,14 @@ function createReactClassDeclaration(classname: string, exportType: ExportType,
190191
return classDecl;
191192
}
192193

193-
function deprecatedGenerator(generator: Generator, moduleName: string,
194+
function deprecatedGenerator(generator: Generator, moduleName: string|null,
194195
{exportType, classname, propTypes}: IParsingResult): string {
195196
const generateTypings = () => {
196197
generator.import('* as React', 'react');
197198
if (propTypes) {
198199
Object.keys(propTypes).forEach(propName => {
199200
const prop = propTypes[propName];
200-
if (prop.importPath) {
201+
if (prop.importType && prop.importPath) {
201202
generator.import(prop.importType, prop.importPath);
202203
}
203204
});
@@ -229,15 +230,15 @@ interface IParsingResult {
229230
propTypes: IPropTypes;
230231
}
231232

232-
function parseAst(ast: any, instanceOfResolver: InstanceOfResolver): IParsingResult {
233-
let exportType: ExportType;
234-
let classname: string;
233+
function parseAst(ast: any, instanceOfResolver?: InstanceOfResolver): IParsingResult {
234+
let exportType: ExportType|undefined;
235+
let classname: string|undefined;
235236
let propTypes: IPropTypes = {};
236237
walk(ast.program, {
237-
'ExportNamedDeclaration': exportNode => {
238+
'ExportNamedDeclaration': () => {
238239
exportType = ExportType.named;
239240
},
240-
'ExportDefaultDeclaration': exportNode => {
241+
'ExportDefaultDeclaration': () => {
241242
exportType = ExportType.default;
242243
},
243244
'ClassDeclaration': classNode => {
@@ -275,14 +276,20 @@ function parseAst(ast: any, instanceOfResolver: InstanceOfResolver): IParsingRes
275276
}
276277
});
277278
}
279+
if (exportType === undefined) {
280+
throw new Error('No exported class found');
281+
}
282+
if (!classname) {
283+
throw new Error('Anonymous classes are not supported');
284+
}
278285
return {
279286
exportType,
280287
classname,
281288
propTypes
282289
};
283290
}
284291

285-
function parsePropTypes(node: any, instanceOfResolver: InstanceOfResolver): IPropTypes {
292+
function parsePropTypes(node: any, instanceOfResolver?: InstanceOfResolver): IPropTypes {
286293
let propTypes: IPropTypes = {};
287294
walk(node, {
288295
'ObjectProperty': propertyNode => {
@@ -369,7 +376,7 @@ function isRequiredPropType(node: any, instanceOfResolver: InstanceOfResolver):
369376
}
370377

371378
/**
372-
* This is for internal use only
379+
* @internal
373380
*/
374381
export function getTypeFromPropType(node: IASTNode, instanceOfResolver = defaultInstanceOfResolver): IProp {
375382
const result: IProp = {

tests/generator-test.d.ts

Whitespace-only changes.

tests/generator-test.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { assert } from 'chai';
2-
import { Generator, generateFromSource } from '../index';
2+
import { Generator, generateFromSource } from '../src/index';
33

44
describe('The Generator', () => {
55
let generator: Generator;
@@ -58,25 +58,31 @@ describe('Generating typings with given custom generator', () => {
5858
});
5959

6060
it('should delare a module if name given', () => {
61-
let name: string = undefined;
61+
let name: string|undefined;
6262
generator.declareModule = moduleName => {
6363
name = moduleName;
6464
};
6565

66-
generateFromSource('module', '', {generator});
66+
const source = `
67+
export class Test {}
68+
`;
69+
generateFromSource('module', source, {generator});
6770

6871
assert.equal(name, 'module');
6972
});
7073

7174
it('should import react', () => {
72-
let decl: string = undefined;
73-
let from: string = undefined;
75+
let decl: string|undefined;
76+
let from: string|undefined;
7477
generator.import = (_decl, _from) => {
7578
decl = _decl;
7679
from = _from;
7780
};
7881

79-
generateFromSource(null, '', {generator});
82+
const source = `
83+
export class Test {}
84+
`;
85+
generateFromSource(null, source, {generator});
8086

8187
assert.equal(decl, '* as React');
8288
assert.equal(from, 'react');

tests/parse-prop-types-test.d.ts

Whitespace-only changes.

tests/parse-prop-types-test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { assert } from 'chai';
22
import * as dom from 'dts-dom';
3-
import { getTypeFromPropType, IProp } from '../index';
3+
import { getTypeFromPropType, IProp } from '../src/index';
44

55
describe('The PropType parser', () => {
66
const instanceOfResolver = (): any => undefined;
@@ -265,7 +265,7 @@ describe('The PropType parser', () => {
265265
}
266266
]
267267
};
268-
const result: IProp = getTypeFromPropType(ast, (name: string): string => './some/path');
268+
const result: IProp = getTypeFromPropType(ast, (): string => './some/path');
269269
assert.equal(result.type, 'typeof Message');
270270
assert.deepEqual(result.type2, dom.create.typeof(dom.create.namedTypeReference('Message')));
271271
assert.equal(result.optional, true);

tests/parsing-test.d.ts

Whitespace-only changes.

0 commit comments

Comments
 (0)