@goast/typescript 0.8.0-beta.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +52 -52
- package/assets/client/angular/angular-service.utils.ts +82 -82
- package/assets/client/angular/request-builder.ts +377 -377
- package/assets/client/fetch/fetch-client.utils.ts +52 -52
- package/assets/client/k6/request-builder.js +448 -448
- package/assets/client/k6/request-builder.ts +366 -366
- package/assets/stubs/easy-network-stub/easy-network-stub.utils.ts +257 -257
- package/esm/src/generators/models/model-generator.d.ts +22 -0
- package/esm/src/generators/models/model-generator.d.ts.map +1 -1
- package/esm/src/generators/models/model-generator.js +37 -5
- package/esm/src/generators/services/angular-services/angular-service-generator.js +9 -9
- package/esm/src/generators/services/angular-services/angular-services-generator.js +2 -2
- package/esm/src/generators/services/easy-network-stub/easy-network-stub-generator.js +9 -9
- package/esm/src/generators/services/fetch-clients/fetch-client-generator.js +4 -4
- package/esm/src/generators/services/k6-clients/k6-client-generator.d.ts.map +1 -1
- package/esm/src/generators/services/k6-clients/k6-client-generator.js +23 -13
- package/esm/src/import-collection.d.ts.map +1 -1
- package/esm/src/import-collection.js +2 -2
- package/package.json +2 -2
- package/script/src/generators/models/model-generator.d.ts +22 -0
- package/script/src/generators/models/model-generator.d.ts.map +1 -1
- package/script/src/generators/models/model-generator.js +37 -5
- package/script/src/generators/services/angular-services/angular-service-generator.js +9 -9
- package/script/src/generators/services/angular-services/angular-services-generator.js +2 -2
- package/script/src/generators/services/easy-network-stub/easy-network-stub-generator.js +9 -9
- package/script/src/generators/services/fetch-clients/fetch-client-generator.js +4 -4
- package/script/src/generators/services/k6-clients/k6-client-generator.d.ts.map +1 -1
- package/script/src/generators/services/k6-clients/k6-client-generator.js +23 -13
- package/script/src/import-collection.d.ts.map +1 -1
- package/script/src/import-collection.js +1 -1
- package/src/mod.ts +7 -0
- package/src/src/assets.ts +9 -0
- package/src/src/ast/_index.ts +54 -0
- package/src/src/ast/common.ts +1 -0
- package/src/src/ast/index.ts +1 -0
- package/src/src/ast/node.ts +10 -0
- package/src/src/ast/nodes/argument.ts +40 -0
- package/src/src/ast/nodes/array-type.ts +49 -0
- package/src/src/ast/nodes/arrow-function.ts +91 -0
- package/src/src/ast/nodes/call.ts +55 -0
- package/src/src/ast/nodes/class.ts +133 -0
- package/src/src/ast/nodes/constructor-parameter.ts +70 -0
- package/src/src/ast/nodes/constructor.ts +77 -0
- package/src/src/ast/nodes/decorator.ts +76 -0
- package/src/src/ast/nodes/doc-tag.ts +291 -0
- package/src/src/ast/nodes/doc.ts +102 -0
- package/src/src/ast/nodes/enum-value.ts +72 -0
- package/src/src/ast/nodes/enum.ts +77 -0
- package/src/src/ast/nodes/export.ts +54 -0
- package/src/src/ast/nodes/function-type.ts +60 -0
- package/src/src/ast/nodes/function.ts +107 -0
- package/src/src/ast/nodes/generic-parameter.ts +71 -0
- package/src/src/ast/nodes/indexer.ts +60 -0
- package/src/src/ast/nodes/interface.ts +117 -0
- package/src/src/ast/nodes/intersection-type.ts +67 -0
- package/src/src/ast/nodes/lookup-type.ts +53 -0
- package/src/src/ast/nodes/method.ts +138 -0
- package/src/src/ast/nodes/object-type.ts +52 -0
- package/src/src/ast/nodes/object.ts +48 -0
- package/src/src/ast/nodes/parameter.ts +85 -0
- package/src/src/ast/nodes/property-accessor.ts +173 -0
- package/src/src/ast/nodes/property.ts +192 -0
- package/src/src/ast/nodes/reference.ts +194 -0
- package/src/src/ast/nodes/string.ts +49 -0
- package/src/src/ast/nodes/tuple.ts +53 -0
- package/src/src/ast/nodes/type-alias.ts +75 -0
- package/src/src/ast/nodes/typeof.ts +42 -0
- package/src/src/ast/nodes/types.ts +40 -0
- package/src/src/ast/nodes/union-type.ts +62 -0
- package/src/src/ast/nodes/variable.ts +73 -0
- package/src/src/ast/references/angular.ts +24 -0
- package/src/src/ast/references/easy-network-stub.ts +21 -0
- package/src/src/ast/references/index.ts +5 -0
- package/src/src/ast/references/k6.ts +8 -0
- package/src/src/ast/references/rxjs.ts +7 -0
- package/src/src/ast/references/typescript.ts +35 -0
- package/src/src/ast/utils/get-type-script-builder-options.ts +19 -0
- package/src/src/ast/utils/to-ts-node.ts +27 -0
- package/src/src/ast/utils/write-ts-generic-parameters.ts +25 -0
- package/src/src/ast/utils/write-ts-members.ts +28 -0
- package/src/src/ast/utils/write-ts-nodes.ts +35 -0
- package/src/src/ast/utils/write-ts-parameters.ts +25 -0
- package/src/src/common-results.ts +26 -0
- package/src/src/config.ts +96 -0
- package/src/src/file-builder.ts +137 -0
- package/src/src/generators/file-generator.ts +15 -0
- package/src/src/generators/index.ts +6 -0
- package/src/src/generators/models/index.ts +3 -0
- package/src/src/generators/models/model-generator.ts +530 -0
- package/src/src/generators/models/models-generator.ts +108 -0
- package/src/src/generators/models/models.ts +121 -0
- package/src/src/generators/services/angular-services/angular-service-generator.ts +431 -0
- package/src/src/generators/services/angular-services/angular-services-generator.ts +295 -0
- package/src/src/generators/services/angular-services/index.ts +3 -0
- package/src/src/generators/services/angular-services/models.ts +277 -0
- package/src/src/generators/services/angular-services/refs.ts +54 -0
- package/src/src/generators/services/easy-network-stub/easy-network-stub-generator.ts +250 -0
- package/src/src/generators/services/easy-network-stub/easy-network-stubs-generator.ts +211 -0
- package/src/src/generators/services/easy-network-stub/index.ts +3 -0
- package/src/src/generators/services/easy-network-stub/models.ts +124 -0
- package/src/src/generators/services/easy-network-stub/refs.ts +47 -0
- package/src/src/generators/services/fetch-clients/fetch-client-generator.ts +305 -0
- package/src/src/generators/services/fetch-clients/fetch-clients-generator.ts +163 -0
- package/src/src/generators/services/fetch-clients/index.ts +3 -0
- package/src/src/generators/services/fetch-clients/models.ts +130 -0
- package/src/src/generators/services/fetch-clients/refs.ts +21 -0
- package/src/src/generators/services/k6-clients/index.ts +3 -0
- package/src/src/generators/services/k6-clients/k6-client-generator.ts +515 -0
- package/src/src/generators/services/k6-clients/k6-clients-generator.ts +171 -0
- package/src/src/generators/services/k6-clients/models.ts +247 -0
- package/src/src/generators/services/k6-clients/refs.ts +16 -0
- package/src/src/import-collection.ts +236 -0
- package/src/src/utils.ts +79 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AstNodeOptions, Nullable, Prettify, SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { TsNode } from '../node.js';
|
|
4
|
+
import { getTypeScriptBuilderOptions } from '../utils/get-type-script-builder-options.js';
|
|
5
|
+
import { writeTsNodes } from '../utils/write-ts-nodes.js';
|
|
6
|
+
|
|
7
|
+
type Injects = never;
|
|
8
|
+
|
|
9
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
10
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
11
|
+
{
|
|
12
|
+
value: string;
|
|
13
|
+
template?: Nullable<boolean>;
|
|
14
|
+
}
|
|
15
|
+
>;
|
|
16
|
+
|
|
17
|
+
export class TsString<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<
|
|
18
|
+
TBuilder,
|
|
19
|
+
TInjects | Injects
|
|
20
|
+
> {
|
|
21
|
+
public value: string;
|
|
22
|
+
public template: boolean;
|
|
23
|
+
|
|
24
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
25
|
+
super(options);
|
|
26
|
+
this.value = options.value;
|
|
27
|
+
this.template = options.template ?? false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
protected override onWrite(builder: TBuilder): void {
|
|
31
|
+
const builderOptions = getTypeScriptBuilderOptions(builder);
|
|
32
|
+
let value = JSON.stringify(this.value);
|
|
33
|
+
if (this.template) {
|
|
34
|
+
value = `\`${value.slice(1, -1).replace(/`/g, '\\`')}\``;
|
|
35
|
+
} else if (builderOptions.useSingleQuotes) {
|
|
36
|
+
value = `'${value.slice(1, -1).replace(/'/g, "\\'")}'`;
|
|
37
|
+
}
|
|
38
|
+
builder.append(value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const createString = <TBuilder extends SourceBuilder>(
|
|
43
|
+
value: Options<TBuilder>['value'],
|
|
44
|
+
options?: Prettify<Omit<Options<TBuilder>, 'value'>>,
|
|
45
|
+
): TsString<TBuilder> => new TsString<TBuilder>({ ...options, value });
|
|
46
|
+
|
|
47
|
+
export const tsString: typeof createString & { write: typeof writeTsNodes } = Object.assign(createString, {
|
|
48
|
+
write: writeTsNodes,
|
|
49
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type AstNodeOptions, notNullish, type Nullable, type Prettify, type SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { TsNode } from '../node.js';
|
|
4
|
+
import { writeTsNodes } from '../utils/write-ts-nodes.js';
|
|
5
|
+
import type { TsType, TsValue } from './types.js';
|
|
6
|
+
|
|
7
|
+
type Injects = never;
|
|
8
|
+
|
|
9
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
10
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
11
|
+
{
|
|
12
|
+
elements: Nullable<TsType<TBuilder> | TsValue<TBuilder>>[];
|
|
13
|
+
asConst?: Nullable<boolean>;
|
|
14
|
+
}
|
|
15
|
+
>;
|
|
16
|
+
|
|
17
|
+
export class TsTuple<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<
|
|
18
|
+
TBuilder,
|
|
19
|
+
TInjects | Injects
|
|
20
|
+
> {
|
|
21
|
+
public elements: (TsType<TBuilder> | TsValue<TBuilder>)[];
|
|
22
|
+
public asConst: boolean;
|
|
23
|
+
|
|
24
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
25
|
+
super(options);
|
|
26
|
+
this.elements = options.elements.filter(notNullish);
|
|
27
|
+
this.asConst = options.asConst ?? false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
protected override onWrite(builder: TBuilder): void {
|
|
31
|
+
if (this.elements.length === 0) {
|
|
32
|
+
builder.append('[]');
|
|
33
|
+
} else {
|
|
34
|
+
const multiline = this.elements.length > 3;
|
|
35
|
+
builder.parenthesize('[]', (b) => writeTsNodes(b, this.elements, { separator: multiline ? ',\n' : ', ' }), {
|
|
36
|
+
multiline,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (this.asConst) {
|
|
41
|
+
builder.append(' as const');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const createTuple = <TBuilder extends SourceBuilder>(
|
|
47
|
+
elements: Options<TBuilder>['elements'],
|
|
48
|
+
options?: Prettify<Omit<Options<TBuilder>, 'elements'>>,
|
|
49
|
+
): TsTuple<TBuilder> => new TsTuple<TBuilder>({ ...options, elements });
|
|
50
|
+
|
|
51
|
+
export const tsTuple: typeof createTuple & { write: typeof writeTsNodes } = Object.assign(createTuple, {
|
|
52
|
+
write: writeTsNodes,
|
|
53
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AstNodeOptions,
|
|
3
|
+
type BasicAppendValue,
|
|
4
|
+
notNullish,
|
|
5
|
+
type Nullable,
|
|
6
|
+
type Prettify,
|
|
7
|
+
type SourceBuilder,
|
|
8
|
+
} from '@goast/core';
|
|
9
|
+
|
|
10
|
+
import { TsNode } from '../node.js';
|
|
11
|
+
import { writeTsNode, writeTsNodes } from '../utils/write-ts-nodes.js';
|
|
12
|
+
import type { TsDoc } from './doc.js';
|
|
13
|
+
import { type TsGenericParameter, tsGenericParameter } from './generic-parameter.js';
|
|
14
|
+
import type { TsType } from './types.js';
|
|
15
|
+
|
|
16
|
+
type Injects = never;
|
|
17
|
+
|
|
18
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
19
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
20
|
+
{
|
|
21
|
+
name: string;
|
|
22
|
+
doc?: Nullable<TsDoc<TBuilder>>;
|
|
23
|
+
generics?: Nullable<Nullable<TsGenericParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
|
|
24
|
+
type: TsType<TBuilder>;
|
|
25
|
+
export?: Nullable<boolean>;
|
|
26
|
+
}
|
|
27
|
+
>;
|
|
28
|
+
|
|
29
|
+
export class TsTypeAlias<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<
|
|
30
|
+
TBuilder,
|
|
31
|
+
TInjects | Injects
|
|
32
|
+
> {
|
|
33
|
+
public name: string;
|
|
34
|
+
public doc: TsDoc<TBuilder> | null;
|
|
35
|
+
public generics: (TsGenericParameter<TBuilder> | BasicAppendValue<TBuilder>)[];
|
|
36
|
+
public type: TsType<TBuilder>;
|
|
37
|
+
public export: boolean;
|
|
38
|
+
|
|
39
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
40
|
+
super(options);
|
|
41
|
+
this.name = options.name;
|
|
42
|
+
this.doc = options.doc ?? null;
|
|
43
|
+
this.generics = options.generics?.filter(notNullish) ?? [];
|
|
44
|
+
this.type = options.type;
|
|
45
|
+
this.export = options.export ?? false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
protected override onWrite(builder: TBuilder): void {
|
|
49
|
+
if (this.doc) writeTsNode(builder, this.doc);
|
|
50
|
+
if (this.export) builder.append('export ');
|
|
51
|
+
|
|
52
|
+
builder.append('type ');
|
|
53
|
+
builder.append(this.name);
|
|
54
|
+
tsGenericParameter.write(builder, this.generics);
|
|
55
|
+
|
|
56
|
+
builder.append(' = ');
|
|
57
|
+
builder.indent((b) => {
|
|
58
|
+
writeTsNode(b, this.type);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
builder.append(';');
|
|
62
|
+
|
|
63
|
+
builder.appendLine();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const createTypeAlias = <TBuilder extends SourceBuilder>(
|
|
68
|
+
name: Options<TBuilder>['name'],
|
|
69
|
+
type: Options<TBuilder>['type'],
|
|
70
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name' | 'type'>>,
|
|
71
|
+
): TsTypeAlias<TBuilder> => new TsTypeAlias<TBuilder>({ ...options, name, type });
|
|
72
|
+
|
|
73
|
+
export const tsTypeAlias: typeof createTypeAlias & { write: typeof writeTsNodes } = Object.assign(createTypeAlias, {
|
|
74
|
+
write: writeTsNodes,
|
|
75
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AstNodeOptions, SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { TsNode } from '../node.js';
|
|
4
|
+
import { writeTsNode, writeTsNodes } from '../utils/write-ts-nodes.js';
|
|
5
|
+
import type { TsValue } from './types.js';
|
|
6
|
+
|
|
7
|
+
type Injects = 'value';
|
|
8
|
+
|
|
9
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
10
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
11
|
+
{
|
|
12
|
+
value: TsValue<TBuilder>;
|
|
13
|
+
}
|
|
14
|
+
>;
|
|
15
|
+
|
|
16
|
+
export class TsTypeof<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<
|
|
17
|
+
TBuilder,
|
|
18
|
+
TInjects | Injects
|
|
19
|
+
> {
|
|
20
|
+
public value: TsValue<TBuilder>;
|
|
21
|
+
|
|
22
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
23
|
+
super(options);
|
|
24
|
+
this.value = options.value;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
protected override onWrite(builder: TBuilder): void {
|
|
28
|
+
builder.append('typeof ');
|
|
29
|
+
builder.append(this.inject.beforeValue);
|
|
30
|
+
writeTsNode(builder, this.value);
|
|
31
|
+
builder.append(this.inject.afterValue);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const createTypeof = <TBuilder extends SourceBuilder>(
|
|
36
|
+
value: Options<TBuilder>['value'],
|
|
37
|
+
options?: Omit<Options<TBuilder>, 'value'>,
|
|
38
|
+
): TsTypeof<TBuilder> => new TsTypeof<TBuilder>({ ...options, value });
|
|
39
|
+
|
|
40
|
+
export const tsTypeof: typeof createTypeof & { write: typeof writeTsNodes } = Object.assign(createTypeof, {
|
|
41
|
+
write: writeTsNodes,
|
|
42
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { BasicAppendValue, SourceBuilder } from '@goast/core';
|
|
2
|
+
import type { TsArrayType } from './array-type.js';
|
|
3
|
+
import type { TsArrowFunction } from './arrow-function.js';
|
|
4
|
+
import type { TsCall } from './call.js';
|
|
5
|
+
import type { TsClass } from './class.js';
|
|
6
|
+
import type { TsFunctionType } from './function-type.js';
|
|
7
|
+
import type { TsFunction } from './function.js';
|
|
8
|
+
import type { TsIntersectionType } from './intersection-type.js';
|
|
9
|
+
import type { TsLookupType } from './lookup-type.js';
|
|
10
|
+
import type { TsObjectType } from './object-type.js';
|
|
11
|
+
import type { TsObject } from './object.js';
|
|
12
|
+
import type { TsReference } from './reference.js';
|
|
13
|
+
import type { TsString } from './string.js';
|
|
14
|
+
import type { TsTuple } from './tuple.js';
|
|
15
|
+
import type { TsTypeof } from './typeof.js';
|
|
16
|
+
import type { TsUnionType } from './union-type.js';
|
|
17
|
+
|
|
18
|
+
export type TsType<TBuilder extends SourceBuilder> =
|
|
19
|
+
| BasicAppendValue<TBuilder>
|
|
20
|
+
| TsIntersectionType<TBuilder>
|
|
21
|
+
| TsUnionType<TBuilder>
|
|
22
|
+
| TsArrayType<TBuilder>
|
|
23
|
+
| TsTuple<TBuilder>
|
|
24
|
+
| TsFunctionType<TBuilder>
|
|
25
|
+
| TsObjectType<TBuilder>
|
|
26
|
+
| TsString<TBuilder>
|
|
27
|
+
| TsLookupType<TBuilder>
|
|
28
|
+
| TsTypeof<TBuilder>
|
|
29
|
+
| TsReference<TBuilder>;
|
|
30
|
+
|
|
31
|
+
export type TsValue<TBuilder extends SourceBuilder> =
|
|
32
|
+
| BasicAppendValue<TBuilder>
|
|
33
|
+
| TsObject<TBuilder>
|
|
34
|
+
| TsTuple<TBuilder>
|
|
35
|
+
| TsString<TBuilder>
|
|
36
|
+
| TsArrowFunction<TBuilder>
|
|
37
|
+
| TsFunction<TBuilder>
|
|
38
|
+
| TsClass<TBuilder>
|
|
39
|
+
| TsCall<TBuilder>
|
|
40
|
+
| TsReference<TBuilder>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type AstNodeOptions, notNullish, type Nullable, type Prettify, type SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { TsNode } from '../node.js';
|
|
4
|
+
import { writeTsNode, writeTsNodes } from '../utils/write-ts-nodes.js';
|
|
5
|
+
import type { TsType } from './types.js';
|
|
6
|
+
|
|
7
|
+
type Injects = never;
|
|
8
|
+
|
|
9
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
10
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
11
|
+
{
|
|
12
|
+
types: Nullable<TsType<TBuilder>>[];
|
|
13
|
+
}
|
|
14
|
+
>;
|
|
15
|
+
|
|
16
|
+
export class TsUnionType<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<
|
|
17
|
+
TBuilder,
|
|
18
|
+
TInjects | Injects
|
|
19
|
+
> {
|
|
20
|
+
public types: TsType<TBuilder>[];
|
|
21
|
+
|
|
22
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
23
|
+
super(options);
|
|
24
|
+
this.types = options.types.filter(notNullish);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
protected override onWrite(builder: TBuilder): void {
|
|
28
|
+
const types = this.types.length === 0 ? ['never'] : resolveNestedUnionTypes(this);
|
|
29
|
+
if (types.length === 1) {
|
|
30
|
+
writeTsNode(builder, types[0]);
|
|
31
|
+
} else {
|
|
32
|
+
const multiline = types.length > 3;
|
|
33
|
+
if (multiline) {
|
|
34
|
+
builder.appendLine().append('| ');
|
|
35
|
+
}
|
|
36
|
+
builder.forEach(types, (b, t) => b.parenthesize('()', (b) => writeTsNode(b, t)), {
|
|
37
|
+
separator: multiline ? '\n| ' : ' | ',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const createUnionType = <TBuilder extends SourceBuilder>(
|
|
44
|
+
types: Options<TBuilder>['types'],
|
|
45
|
+
options?: Prettify<Omit<Options<TBuilder>, 'types'>>,
|
|
46
|
+
): TsUnionType<TBuilder> => new TsUnionType<TBuilder>({ ...options, types });
|
|
47
|
+
|
|
48
|
+
export const tsUnionType: typeof createUnionType & { write: typeof writeTsNodes } = Object.assign(createUnionType, {
|
|
49
|
+
write: writeTsNodes,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
function resolveNestedUnionTypes<TBuilder extends SourceBuilder>(node: TsUnionType<TBuilder>): TsType<TBuilder>[] {
|
|
53
|
+
const types: TsType<TBuilder>[] = [];
|
|
54
|
+
for (const type of node.types) {
|
|
55
|
+
if (type instanceof TsUnionType) {
|
|
56
|
+
types.push(...resolveNestedUnionTypes(type));
|
|
57
|
+
} else {
|
|
58
|
+
types.push(type);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return types;
|
|
62
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { AstNodeOptions, Nullable, Prettify, SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { TsNode } from '../node.js';
|
|
4
|
+
import { writeTsNode, writeTsNodes } from '../utils/write-ts-nodes.js';
|
|
5
|
+
import type { TsDoc } from './doc.js';
|
|
6
|
+
import type { TsType, TsValue } from './types.js';
|
|
7
|
+
|
|
8
|
+
type Injects = never;
|
|
9
|
+
|
|
10
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
11
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
12
|
+
{
|
|
13
|
+
name: string;
|
|
14
|
+
doc?: Nullable<TsDoc<TBuilder>>;
|
|
15
|
+
type?: Nullable<TsType<TBuilder>>;
|
|
16
|
+
value?: Nullable<TsValue<TBuilder>>;
|
|
17
|
+
export?: Nullable<boolean>;
|
|
18
|
+
readonly?: Nullable<boolean>;
|
|
19
|
+
}
|
|
20
|
+
>;
|
|
21
|
+
|
|
22
|
+
export class TsVariable<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<
|
|
23
|
+
TBuilder,
|
|
24
|
+
TInjects | Injects
|
|
25
|
+
> {
|
|
26
|
+
public name: string;
|
|
27
|
+
public doc: TsDoc<TBuilder> | null;
|
|
28
|
+
public type: TsType<TBuilder> | null;
|
|
29
|
+
public value: TsValue<TBuilder> | null;
|
|
30
|
+
public export: boolean;
|
|
31
|
+
public readonly: boolean;
|
|
32
|
+
|
|
33
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
34
|
+
super(options);
|
|
35
|
+
this.name = options.name;
|
|
36
|
+
this.doc = options.doc ?? null;
|
|
37
|
+
this.type = options.type ?? null;
|
|
38
|
+
this.value = options.value ?? null;
|
|
39
|
+
this.export = options.export ?? false;
|
|
40
|
+
this.readonly = options.readonly ?? false;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
protected override onWrite(builder: TBuilder): void {
|
|
44
|
+
if (this.doc) writeTsNode(builder, this.doc);
|
|
45
|
+
if (this.export) builder.append('export ');
|
|
46
|
+
|
|
47
|
+
builder.append(this.readonly ? 'const ' : 'let ');
|
|
48
|
+
builder.append(this.name);
|
|
49
|
+
|
|
50
|
+
if (this.type) {
|
|
51
|
+
builder.append(': ');
|
|
52
|
+
writeTsNode(builder, this.type);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (this.value) {
|
|
56
|
+
builder.append(' = ');
|
|
57
|
+
writeTsNode(builder, this.value);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
builder.append(';');
|
|
61
|
+
|
|
62
|
+
builder.appendLine();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const createVariable = <TBuilder extends SourceBuilder>(
|
|
67
|
+
name: Options<TBuilder>['name'],
|
|
68
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name'>>,
|
|
69
|
+
): TsVariable<TBuilder> => new TsVariable<TBuilder>({ ...options, name });
|
|
70
|
+
|
|
71
|
+
export const tsVariable: typeof createVariable & { write: typeof writeTsNodes } = Object.assign(createVariable, {
|
|
72
|
+
write: writeTsNodes,
|
|
73
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type TsGenericModuleReferenceFactory,
|
|
3
|
+
type TsModuleReferenceFactory,
|
|
4
|
+
tsReference,
|
|
5
|
+
} from '../nodes/reference.js';
|
|
6
|
+
|
|
7
|
+
// @angular/core
|
|
8
|
+
export const inject: TsModuleReferenceFactory = tsReference.factory('inject', '@angular/core');
|
|
9
|
+
export const injectable: TsModuleReferenceFactory = tsReference.factory('Injectable', '@angular/core');
|
|
10
|
+
export const provider: TsModuleReferenceFactory = tsReference.factory('Provider', '@angular/core', {
|
|
11
|
+
importType: 'type-import',
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
// @angular/common/http
|
|
15
|
+
export const httpClient: TsModuleReferenceFactory = tsReference.factory('HttpClient', '@angular/common/http');
|
|
16
|
+
export const httpContext: TsModuleReferenceFactory = tsReference.factory('HttpContext', '@angular/common/http');
|
|
17
|
+
export const httpResponse: TsGenericModuleReferenceFactory<1> = tsReference.genericFactory<1>(
|
|
18
|
+
'HttpResponse',
|
|
19
|
+
'@angular/common/http',
|
|
20
|
+
);
|
|
21
|
+
export const httpErrorResponse: TsModuleReferenceFactory = tsReference.factory(
|
|
22
|
+
'HttpErrorResponse',
|
|
23
|
+
'@angular/common/http',
|
|
24
|
+
);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type TsGenericModuleReferenceFactory,
|
|
3
|
+
type TsModuleReferenceFactory,
|
|
4
|
+
tsReference,
|
|
5
|
+
} from '../nodes/reference.js';
|
|
6
|
+
|
|
7
|
+
export const easyNetworkStub: TsModuleReferenceFactory = tsReference.factory('EasyNetworkStub', 'easy-network-stub');
|
|
8
|
+
export const httpMethod: TsModuleReferenceFactory = tsReference.factory('HttpMethod', 'easy-network-stub', {
|
|
9
|
+
importType: 'type-import',
|
|
10
|
+
});
|
|
11
|
+
export const routeResponseCallback: TsGenericModuleReferenceFactory<2> = tsReference.genericFactory<2>(
|
|
12
|
+
'RouteResponseCallback',
|
|
13
|
+
'easy-network-stub',
|
|
14
|
+
{
|
|
15
|
+
importType: 'type-import',
|
|
16
|
+
},
|
|
17
|
+
);
|
|
18
|
+
export const errorResponse: TsGenericModuleReferenceFactory<1> = tsReference.genericFactory<1>(
|
|
19
|
+
'ErrorResponse',
|
|
20
|
+
'easy-network-stub',
|
|
21
|
+
);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type TsModuleReferenceFactory, tsReference } from '../nodes/reference.js';
|
|
2
|
+
|
|
3
|
+
// k6
|
|
4
|
+
export const jsonValue: TsModuleReferenceFactory = tsReference.factory('JSONValue', 'k6');
|
|
5
|
+
|
|
6
|
+
// h6/http
|
|
7
|
+
export const response: TsModuleReferenceFactory = tsReference.factory('Response', 'k6/http');
|
|
8
|
+
export const params: TsModuleReferenceFactory = tsReference.factory('Params', 'k6/http');
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type TsModuleReferenceFactory, tsReference } from '../nodes/reference.js';
|
|
2
|
+
|
|
3
|
+
export const observable: TsModuleReferenceFactory = tsReference.factory('Observable', 'rxjs');
|
|
4
|
+
export const firstValueFrom: TsModuleReferenceFactory = tsReference.factory('firstValueFrom', 'rxjs');
|
|
5
|
+
export const filter: TsModuleReferenceFactory = tsReference.factory('filter', 'rxjs');
|
|
6
|
+
export const map: TsModuleReferenceFactory = tsReference.factory('map', 'rxjs');
|
|
7
|
+
export const take: TsModuleReferenceFactory = tsReference.factory('take', 'rxjs');
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type TsGenericReferenceFactory, tsReference, type TsReferenceFactory } from '../nodes/reference.js';
|
|
2
|
+
|
|
3
|
+
export const any: TsReferenceFactory = tsReference.factory('any');
|
|
4
|
+
export const unknown: TsReferenceFactory = tsReference.factory('unknown');
|
|
5
|
+
export const void_: TsReferenceFactory = tsReference.factory('void');
|
|
6
|
+
export const never: TsReferenceFactory = tsReference.factory('never');
|
|
7
|
+
export const number: TsReferenceFactory = tsReference.factory('number');
|
|
8
|
+
export const string: TsReferenceFactory = tsReference.factory('string');
|
|
9
|
+
export const boolean: TsReferenceFactory = tsReference.factory('boolean');
|
|
10
|
+
export const bigint: TsReferenceFactory = tsReference.factory('bigint');
|
|
11
|
+
export const symbol: TsReferenceFactory = tsReference.factory('symbol');
|
|
12
|
+
export const object: TsReferenceFactory = tsReference.factory('object');
|
|
13
|
+
export const undefined_: TsReferenceFactory = tsReference.factory('undefined');
|
|
14
|
+
export const null_: TsReferenceFactory = tsReference.factory('null');
|
|
15
|
+
|
|
16
|
+
export const array: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('Array');
|
|
17
|
+
export const record: TsGenericReferenceFactory<2> = tsReference.genericFactory<2>('Record');
|
|
18
|
+
export const map: TsGenericReferenceFactory<2> = tsReference.genericFactory<2>('Map');
|
|
19
|
+
export const set: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('Set');
|
|
20
|
+
export const promise: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('Promise');
|
|
21
|
+
|
|
22
|
+
export const readonlyArray: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('ReadonlyArray');
|
|
23
|
+
export const readonly: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('Readonly');
|
|
24
|
+
export const partial: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('Partial');
|
|
25
|
+
export const required: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('Required');
|
|
26
|
+
export const pick: TsGenericReferenceFactory<2> = tsReference.genericFactory<2>('Pick');
|
|
27
|
+
export const omit: TsGenericReferenceFactory<2> = tsReference.genericFactory<2>('Omit');
|
|
28
|
+
export const exclude: TsGenericReferenceFactory<2> = tsReference.genericFactory<2>('Exclude');
|
|
29
|
+
export const extract: TsGenericReferenceFactory<2> = tsReference.genericFactory<2>('Extract');
|
|
30
|
+
export const nonNullable: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('NonNullable');
|
|
31
|
+
export const parameters: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('Parameters');
|
|
32
|
+
export const returnType: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('ReturnType');
|
|
33
|
+
export const instanceType: TsGenericReferenceFactory<1> = tsReference.genericFactory<1>('InstanceType');
|
|
34
|
+
|
|
35
|
+
export const blob: TsReferenceFactory = tsReference.factory('Blob');
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { defaultOpenApiGeneratorConfig, type SourceBuilder, type StringBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { defaultTypeScriptGeneratorConfig, type TypeScriptGeneratorConfig } from '../../config.js';
|
|
4
|
+
import { TypeScriptFileBuilder } from '../../file-builder.js';
|
|
5
|
+
|
|
6
|
+
const tsConfigSymbol = Symbol();
|
|
7
|
+
type _BuilderWithConfig = SourceBuilder & { [tsConfigSymbol]?: TypeScriptGeneratorConfig };
|
|
8
|
+
|
|
9
|
+
export function getTypeScriptBuilderOptions(builder: StringBuilder): TypeScriptGeneratorConfig {
|
|
10
|
+
if (builder instanceof TypeScriptFileBuilder) {
|
|
11
|
+
return builder.options;
|
|
12
|
+
}
|
|
13
|
+
if (tsConfigSymbol in builder.options) {
|
|
14
|
+
return builder.options[tsConfigSymbol] as TypeScriptGeneratorConfig;
|
|
15
|
+
}
|
|
16
|
+
const options = { ...defaultOpenApiGeneratorConfig, ...defaultTypeScriptGeneratorConfig, ...builder.options };
|
|
17
|
+
(builder as _BuilderWithConfig)[tsConfigSymbol] = options;
|
|
18
|
+
return options;
|
|
19
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { BasicAppendValue, SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { type TsObject, tsObject } from '../nodes/object.js';
|
|
4
|
+
import { tsProperty } from '../nodes/property.js';
|
|
5
|
+
import { type TsString, tsString } from '../nodes/string.js';
|
|
6
|
+
import { type TsTuple, tsTuple } from '../nodes/tuple.js';
|
|
7
|
+
|
|
8
|
+
export function toTsNode<TBuilder extends SourceBuilder>(object: Record<string, unknown>): TsObject<TBuilder>;
|
|
9
|
+
export function toTsNode<TBuilder extends SourceBuilder>(tuple: unknown[]): TsTuple<TBuilder>;
|
|
10
|
+
export function toTsNode<TBuilder extends SourceBuilder>(string: string): TsString<TBuilder>;
|
|
11
|
+
export function toTsNode<TBuilder extends SourceBuilder>(value: unknown): BasicAppendValue<TBuilder>;
|
|
12
|
+
export function toTsNode<TBuilder extends SourceBuilder>(value: unknown): unknown {
|
|
13
|
+
if (Array.isArray(value)) {
|
|
14
|
+
return tsTuple(value.map((x) => toTsNode<TBuilder>(x)));
|
|
15
|
+
}
|
|
16
|
+
if (typeof value === 'object' && value !== null) {
|
|
17
|
+
const result = tsObject<TBuilder>();
|
|
18
|
+
for (const [k, v] of Object.entries(value)) {
|
|
19
|
+
result.members.push(tsProperty(k, { value: toTsNode(v) }));
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
if (value === null || value === undefined || typeof value === 'boolean' || typeof value === 'number') {
|
|
24
|
+
return String(value);
|
|
25
|
+
}
|
|
26
|
+
return tsString(String(value));
|
|
27
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AppendValue,
|
|
3
|
+
notNullish,
|
|
4
|
+
type Nullable,
|
|
5
|
+
type SingleOrMultiple,
|
|
6
|
+
type SourceBuilder,
|
|
7
|
+
toArray,
|
|
8
|
+
} from '@goast/core';
|
|
9
|
+
|
|
10
|
+
import type { TsNode } from '../node.js';
|
|
11
|
+
import { writeTsNodes } from './write-ts-nodes.js';
|
|
12
|
+
|
|
13
|
+
export function writeTsGenericParameters<TBuilder extends SourceBuilder>(
|
|
14
|
+
builder: TBuilder,
|
|
15
|
+
nodes: SingleOrMultiple<Nullable<TsNode<TBuilder> | AppendValue<TBuilder>>>,
|
|
16
|
+
): void {
|
|
17
|
+
const filteredNodes = toArray(nodes).filter(notNullish);
|
|
18
|
+
const multiline = filteredNodes.length > 2;
|
|
19
|
+
builder.parenthesizeIf(
|
|
20
|
+
filteredNodes.length > 0,
|
|
21
|
+
'<>',
|
|
22
|
+
(b) => writeTsNodes(b, filteredNodes, { separator: multiline ? ',\n' : ', ' }),
|
|
23
|
+
{ multiline },
|
|
24
|
+
);
|
|
25
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type AppendValue, isAppendValue, notNullish, type Nullable, type SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import type { TsNode } from '../node.js';
|
|
4
|
+
import { tsDoc } from '../nodes/doc.js';
|
|
5
|
+
import { TsMethod } from '../nodes/method.js';
|
|
6
|
+
import { TsProperty } from '../nodes/property.js';
|
|
7
|
+
import { writeTsNode } from './write-ts-nodes.js';
|
|
8
|
+
|
|
9
|
+
export function writeTsMembers<TBuilder extends SourceBuilder>(
|
|
10
|
+
builder: TBuilder,
|
|
11
|
+
members: Nullable<AppendValue<TBuilder> | TsNode<TBuilder>>[],
|
|
12
|
+
options?: { alreadyHasMembers?: boolean },
|
|
13
|
+
): void {
|
|
14
|
+
const filteredMembers = members.filter(notNullish);
|
|
15
|
+
builder.forEach(filteredMembers, (b, m, i) =>
|
|
16
|
+
b.if(
|
|
17
|
+
() =>
|
|
18
|
+
!(m instanceof TsProperty && tsDoc.isEmpty(m.doc) && m.decorators.length === 0) &&
|
|
19
|
+
!(m instanceof TsMethod && !m.body && tsDoc.isEmpty(m.doc) && m.decorators.length === 0) &&
|
|
20
|
+
!isAppendValue(m),
|
|
21
|
+
(b) =>
|
|
22
|
+
b
|
|
23
|
+
.if(i > 0 || !!options?.alreadyHasMembers, (b) => b.ensurePreviousLineEmpty())
|
|
24
|
+
.append((b) => writeTsNode(b, m))
|
|
25
|
+
.if(i < filteredMembers.length - 1, (b) => b.ensurePreviousLineEmpty()),
|
|
26
|
+
(b) => b.append((b) => writeTsNode(b, m)).ensureCurrentLineEmpty(),
|
|
27
|
+
));
|
|
28
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AppendValue,
|
|
3
|
+
notNullish,
|
|
4
|
+
type Nullable,
|
|
5
|
+
type Separator,
|
|
6
|
+
type SingleOrMultiple,
|
|
7
|
+
type SourceBuilder,
|
|
8
|
+
toArray,
|
|
9
|
+
} from '@goast/core';
|
|
10
|
+
|
|
11
|
+
import { TsNode } from '../node.js';
|
|
12
|
+
|
|
13
|
+
export function writeTsNode<TBuilder extends SourceBuilder>(
|
|
14
|
+
builder: TBuilder,
|
|
15
|
+
node: Nullable<AppendValue<TBuilder> | TsNode<TBuilder>>,
|
|
16
|
+
): void {
|
|
17
|
+
if (node instanceof TsNode) {
|
|
18
|
+
node.write(builder);
|
|
19
|
+
} else {
|
|
20
|
+
builder.append(node);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function writeTsNodes<TBuilder extends SourceBuilder>(
|
|
25
|
+
builder: TBuilder,
|
|
26
|
+
nodes: SingleOrMultiple<Nullable<AppendValue<TBuilder> | TsNode<TBuilder>>>,
|
|
27
|
+
options?: { separator?: Separator<TBuilder, AppendValue<TBuilder> | TsNode<TBuilder>> },
|
|
28
|
+
): void {
|
|
29
|
+
const filteredNodes = toArray(nodes).filter(notNullish);
|
|
30
|
+
if (filteredNodes.length === 1) {
|
|
31
|
+
writeTsNode(builder, filteredNodes[0]);
|
|
32
|
+
} else if (filteredNodes.length > 1) {
|
|
33
|
+
builder.forEach(filteredNodes, writeTsNode, { separator: options?.separator });
|
|
34
|
+
}
|
|
35
|
+
}
|