Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ Options:
--help Show help [boolean]
--version Show version number [boolean]
--classpath, --cp The classpath to use [string]
--syncSuffix The sync suffix [string]
--asyncSuffix The async suffix [string]
--customInspect Whether to enable the 'customInspect' option [boolean]
```

### Notes
Expand Down
1,460 changes: 912 additions & 548 deletions package-lock.json

Large diffs are not rendered by default.

25 changes: 14 additions & 11 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "java-ts-definition-generator",
"version": "1.0.0",
"description": "",
"version": "1.1.0",
"description": "The typescript definition generator for the java-bridge package",
"main": "dist/index.prod.min.js",
"types": "dist/src/index.d.ts",
"scripts": {
Expand All @@ -19,15 +19,18 @@
"java-ts-gen": "./dist/java-ts-gen.js"
},
"dependencies": {
"ora": "^6.3.0",
"typescript": "^5.0.2",
"yargs": "^17.7.1"
"chalk": "^5.2.0",
"ora": "^7.0.1",
"semver": "^7.5.4",
"typescript": "^5.1.3",
"yargs": "^17.7.2"
},
"devDependencies": {
"@types/chai": "^4.3.4",
"@types/chai": "^4.3.5",
"@types/is-ci": "^3.0.0",
"@types/mocha": "^10.0.1",
"@types/node": "^18.15.11",
"@types/node": "^20.3.1",
"@types/semver": "^7.5.0",
"@types/webpack-node-externals": "^3.0.0",
"@types/yargs": "^17.0.24",
"chai": "^4.3.7",
Expand All @@ -36,11 +39,11 @@
"mocha": "^10.2.0",
"mocha-junit-reporter": "^2.2.0",
"mocha-multi-reporters": "^1.5.1",
"prettier": "^2.8.7",
"ts-loader": "^9.4.2",
"prettier": "^3.0.2",
"ts-loader": "^9.4.3",
"ts-node": "^10.9.1",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack": "^5.88.0",
"webpack-cli": "^5.1.4",
"webpack-node-externals": "^3.0.0"
},
"prettier": {
Expand Down
3 changes: 3 additions & 0 deletions src/TypescriptBulkDefinitionGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import TypescriptDefinitionGenerator, {
ModuleDeclaration,
ProgressCallback,
} from './TypescriptDefinitionGenerator';
import { GeneratorOpts } from './util/options';

/**
* Generates a lot of definitions for a lot of modules at once.
Expand Down Expand Up @@ -45,12 +46,14 @@ export class TypescriptBulkDefinitionGenerator {
*/
public async generate(
classnames: string[],
options: GeneratorOpts = {},
progressCallback: ProgressCallback | null = null
): Promise<number> {
let numResolved = 0;
for (const classname of classnames) {
const generator = new TypescriptDefinitionGenerator(
classname,
options,
progressCallback,
this.resolvedImports
);
Expand Down
105 changes: 42 additions & 63 deletions src/TypescriptDefinitionGenerator.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
import ts, { SyntaxKind } from 'typescript';
import { importClass, importClassAsync, JavaClass } from 'java-bridge';
import { importClass, importClassAsync } from 'java-bridge';
import fs from 'fs';
import path from 'path';
import { deepEquals, mergeObjects } from './util/util';
import type {
ClassClass,
DeclaredConstructorClass,
DeclaredMethodClass,
FieldClass,
ModifierClass,
} from './util/declarations';
import { GeneratorOpts, defaultGeneratorOpts } from './util/options';
import { checkOptionsForVersion } from './util/versions';

const sourceFile = ts.createSourceFile(
'source.ts',
Expand Down Expand Up @@ -37,59 +47,6 @@ export interface ModuleDeclaration {
*/
export type ProgressCallback = (classname: string) => void;

declare class ModifierClass extends JavaClass {
public static isPublic(val: number): Promise<boolean>;
public static isStatic(val: number): Promise<boolean>;
public static isStaticSync(val: number): boolean;
public static isFinal(val: number): Promise<boolean>;
public static isAbstract(val: number): Promise<boolean>;
}

declare class TypeClass extends JavaClass {
public getTypeName(): Promise<string>;
}

/**
* @ignore
*/
declare class DeclaredMethodClass extends JavaClass {
public getModifiers(): Promise<number>;
public getName(): Promise<string>;
public getReturnType(): Promise<TypeClass>;
public getParameterTypes(): Promise<TypeClass[]>;
public isDefault(): Promise<boolean>;
}

/**
* @ignore
*/
declare class DeclaredConstructorClass extends JavaClass {
public getModifiers(): Promise<number>;
public getParameterTypes(): Promise<TypeClass[]>;
}

/**
* @ignore
*/
declare class ClassClass extends JavaClass {
public getMethods(): Promise<DeclaredMethodClass[]>;
public getDeclaredConstructors(): Promise<DeclaredConstructorClass[]>;
public getFields(): Promise<FieldClass[]>;
public getModifiers(): Promise<number>;
public isInterface(): Promise<boolean>;
public isInterfaceSync(): boolean;
}

/**
* @ignore
*/
declare class FieldClass extends JavaClass {
public getModifiers(): Promise<number>;
public getName(): Promise<string>;
public getNameSync(): string;
public getType(): Promise<TypeClass>;
}

/**
* A list of methods which probably never return null
*/
Expand Down Expand Up @@ -126,6 +83,7 @@ export default class TypescriptDefinitionGenerator {
private readonly additionalImports: string[] = [];
private readonly importsToResolve: string[] = [];
private readonly interfaceImports: string[] = [];
private readonly options: Required<GeneratorOpts>;

/**
* Create a new `TypescriptDefinitionGenerator` instance
Expand All @@ -138,9 +96,13 @@ export default class TypescriptDefinitionGenerator {
*/
public constructor(
private readonly classname: string,
opts: GeneratorOpts = {},
private readonly progressCallback: ProgressCallback | null = null,
private readonly resolvedImports: string[] = []
) {}
) {
checkOptionsForVersion(opts);
this.options = mergeObjects(opts, defaultGeneratorOpts);
}

private static async convertMethods(
methods: DeclaredMethodClass[]
Expand Down Expand Up @@ -720,10 +682,19 @@ export default class TypescriptDefinitionGenerator {
);
}

let suffix = '';
if (name !== 'newInstanceAsync') {
if (isSync) {
suffix = this.options.syncSuffix;
} else {
suffix = this.options.asyncSuffix;
}
}

let declaration = ts.factory.createMethodDeclaration(
modifiers,
undefined,
name + (isSync ? 'Sync' : ''),
name + suffix,
undefined,
undefined,
this.convertParameters(m),
Expand Down Expand Up @@ -899,6 +870,15 @@ export default class TypescriptDefinitionGenerator {
simpleName: string,
isAbstractOrInterface: boolean
) {
let importOpts = '';
if (!deepEquals(this.options, defaultGeneratorOpts)) {
importOpts = `, {
syncSuffix: '${this.options.syncSuffix}',
asyncSuffix: '${this.options.asyncSuffix}',
customInspect: ${this.options.customInspect},
}`;
}

const statement = ts.factory.createClassDeclaration(
[ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
simpleName,
Expand All @@ -907,7 +887,7 @@ export default class TypescriptDefinitionGenerator {
ts.factory.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [
ts.factory.createExpressionWithTypeArguments(
ts.factory.createIdentifier(
`importClass<typeof ${simpleName}Class>('${this.classname}')`
`importClass<typeof ${simpleName}Class>('${this.classname}'${importOpts})`
),
undefined
),
Expand Down Expand Up @@ -987,9 +967,8 @@ export default class TypescriptDefinitionGenerator {
const fields = (await cls.getFields()).filter(onlyUnique);
const methods = await cls.getMethods();

const classMembers: ts.ClassElement[] = await this.convertFields(
fields
);
const classMembers: ts.ClassElement[] =
await this.convertFields(fields);

const convertedMethods =
await TypescriptDefinitionGenerator.convertMethods(methods);
Expand All @@ -1000,9 +979,8 @@ export default class TypescriptDefinitionGenerator {
const isAbstractOrInterface = await this.isAbstractOrInterface(cls);
if (!isAbstractOrInterface) {
const constructors = await cls.getDeclaredConstructors();
const convertedConstructors = await this.convertConstructors(
constructors
);
const convertedConstructors =
await this.convertConstructors(constructors);
classMembers.push(...convertedConstructors);
}

Expand Down Expand Up @@ -1079,6 +1057,7 @@ export default class TypescriptDefinitionGenerator {
for (const imported of this.additionalImports) {
const generator = new TypescriptDefinitionGenerator(
imported,
this.options,
this.progressCallback,
this.resolvedImports
);
Expand Down
Loading