@goast/typescript 0.6.3-beta.1 → 0.7.1
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/assets/stubs/easy-network-stub/easy-network-stub.utils.ts +9 -7
- package/esm/src/generators/services/easy-network-stub/refs.d.ts +1 -0
- package/esm/src/generators/services/easy-network-stub/refs.d.ts.map +1 -1
- package/esm/src/generators/services/easy-network-stub/refs.js +1 -0
- package/package.json +2 -2
- package/script/src/generators/services/easy-network-stub/refs.d.ts +1 -0
- package/script/src/generators/services/easy-network-stub/refs.d.ts.map +1 -1
- package/script/src/generators/services/easy-network-stub/refs.js +1 -0
- 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 +89 -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 +481 -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 +414 -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 +285 -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 +474 -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 +72 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { AstNodeOptions, Nullable, Prettify, SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import type { TsAccessModifier } from '../common.js';
|
|
4
|
+
import { writeTsNode } from '../utils/write-ts-nodes.js';
|
|
5
|
+
import { writeTsParameters } from '../utils/write-ts-parameters.js';
|
|
6
|
+
import { tsDecorator } from './decorator.js';
|
|
7
|
+
import { TsParameter } from './parameter.js';
|
|
8
|
+
|
|
9
|
+
type Injects = 'modifiers';
|
|
10
|
+
|
|
11
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
12
|
+
typeof TsParameter<TBuilder, TInjects | Injects>,
|
|
13
|
+
{
|
|
14
|
+
accessModifier?: Nullable<TsAccessModifier>;
|
|
15
|
+
readonly?: Nullable<boolean>;
|
|
16
|
+
}
|
|
17
|
+
>;
|
|
18
|
+
|
|
19
|
+
export class TsConstructorParameter<TBuilder extends SourceBuilder, TInjects extends string = never>
|
|
20
|
+
extends TsParameter<
|
|
21
|
+
TBuilder,
|
|
22
|
+
TInjects | Injects
|
|
23
|
+
> {
|
|
24
|
+
public accessModifier: TsAccessModifier | null;
|
|
25
|
+
public readonly: boolean;
|
|
26
|
+
|
|
27
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
28
|
+
super(options);
|
|
29
|
+
this.accessModifier = options.accessModifier ?? null;
|
|
30
|
+
this.readonly = options.readonly ?? false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected override onWrite(builder: TBuilder): void {
|
|
34
|
+
builder.append(this.inject.beforeDecorators);
|
|
35
|
+
tsDecorator.write(builder, this.decorators);
|
|
36
|
+
builder.append(this.inject.afterDecorators);
|
|
37
|
+
|
|
38
|
+
builder.append(this.inject.beforeModifiers);
|
|
39
|
+
if (this.accessModifier) builder.append(this.accessModifier, ' ');
|
|
40
|
+
if (this.readonly) builder.append('readonly ');
|
|
41
|
+
builder.append(this.inject.afterModifiers);
|
|
42
|
+
|
|
43
|
+
builder.append(this.inject.beforeName, this.name, this.inject.afterName);
|
|
44
|
+
if (this.optional) builder.append('?');
|
|
45
|
+
|
|
46
|
+
if (this.type) {
|
|
47
|
+
builder.append(': ');
|
|
48
|
+
builder.append(this.inject.beforeType);
|
|
49
|
+
writeTsNode(builder, this.type);
|
|
50
|
+
builder.append(this.inject.afterType);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (this.default) {
|
|
54
|
+
builder.append(' = ');
|
|
55
|
+
builder.append(this.inject.beforeDefault);
|
|
56
|
+
writeTsNode(builder, this.default);
|
|
57
|
+
builder.append(this.inject.afterDefault);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const createConstructorParameter = <TBuilder extends SourceBuilder>(
|
|
63
|
+
name: Options<TBuilder>['name'],
|
|
64
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name'>>,
|
|
65
|
+
): TsConstructorParameter<TBuilder> => new TsConstructorParameter<TBuilder>({ ...options, name });
|
|
66
|
+
|
|
67
|
+
export const tsConstructorParameter: typeof createConstructorParameter & { write: typeof writeTsParameters } = Object
|
|
68
|
+
.assign(createConstructorParameter, {
|
|
69
|
+
write: writeTsParameters,
|
|
70
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AppendValue,
|
|
3
|
+
type AstNodeOptions,
|
|
4
|
+
type BasicAppendValue,
|
|
5
|
+
notNullish,
|
|
6
|
+
type Nullable,
|
|
7
|
+
type SourceBuilder,
|
|
8
|
+
} from '@goast/core';
|
|
9
|
+
|
|
10
|
+
import { TsNode } from '../node.js';
|
|
11
|
+
import { writeTsNodes } from '../utils/write-ts-nodes.js';
|
|
12
|
+
import type { TsConstructorParameter } from './constructor-parameter.js';
|
|
13
|
+
import { type TsDecorator, tsDecorator } from './decorator.js';
|
|
14
|
+
import { type TsDoc, tsDoc } from './doc.js';
|
|
15
|
+
import { tsParameter } from './parameter.js';
|
|
16
|
+
|
|
17
|
+
type Injects = 'params' | 'doc' | 'decorators' | 'body';
|
|
18
|
+
|
|
19
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
20
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
21
|
+
{
|
|
22
|
+
doc?: Nullable<TsDoc<TBuilder>>;
|
|
23
|
+
decorators?: Nullable<Nullable<TsDecorator<TBuilder>>[]>;
|
|
24
|
+
parameters?: Nullable<Nullable<TsConstructorParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
|
|
25
|
+
body?: Nullable<AppendValue<TBuilder>>;
|
|
26
|
+
}
|
|
27
|
+
>;
|
|
28
|
+
|
|
29
|
+
export class TsConstructor<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<
|
|
30
|
+
TBuilder,
|
|
31
|
+
TInjects | Injects
|
|
32
|
+
> {
|
|
33
|
+
public doc: TsDoc<TBuilder> | null;
|
|
34
|
+
public decorators: TsDecorator<TBuilder>[];
|
|
35
|
+
public parameters: (TsConstructorParameter<TBuilder> | BasicAppendValue<TBuilder>)[];
|
|
36
|
+
public body: AppendValue<TBuilder> | null;
|
|
37
|
+
|
|
38
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
39
|
+
super(options);
|
|
40
|
+
this.doc = options.doc ?? null;
|
|
41
|
+
this.decorators = options.decorators?.filter(notNullish) ?? [];
|
|
42
|
+
this.parameters = options.parameters?.filter(notNullish) ?? [];
|
|
43
|
+
this.body = options.body ?? null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
protected override onWrite(builder: TBuilder): void {
|
|
47
|
+
builder.append(this.inject.beforeDoc);
|
|
48
|
+
tsDoc.get(this.doc, { parameters: this.parameters })?.write(builder);
|
|
49
|
+
builder.append(this.inject.afterDoc);
|
|
50
|
+
|
|
51
|
+
builder.append(this.inject.beforeDecorators);
|
|
52
|
+
tsDecorator.write(builder, this.decorators, { multiline: true });
|
|
53
|
+
builder.append(this.inject.afterDecorators);
|
|
54
|
+
|
|
55
|
+
builder.append('constructor');
|
|
56
|
+
builder.append(this.inject.beforeParams);
|
|
57
|
+
tsParameter.write(builder, this.parameters);
|
|
58
|
+
builder.append(this.inject.afterParams);
|
|
59
|
+
builder.append(' ');
|
|
60
|
+
|
|
61
|
+
builder.append(this.inject.beforeBody);
|
|
62
|
+
builder.parenthesize('{}', this.body, { multiline: !!this.body });
|
|
63
|
+
builder.append(this.inject.afterBody);
|
|
64
|
+
|
|
65
|
+
builder.appendLine();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const createConstructor = <TBuilder extends SourceBuilder>(options?: Options<TBuilder>): TsConstructor<TBuilder> =>
|
|
70
|
+
new TsConstructor<TBuilder>(options ?? {});
|
|
71
|
+
|
|
72
|
+
export const tsConstructor: typeof createConstructor & { write: typeof writeTsNodes } = Object.assign(
|
|
73
|
+
createConstructor,
|
|
74
|
+
{
|
|
75
|
+
write: writeTsNodes,
|
|
76
|
+
},
|
|
77
|
+
);
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AppendValue,
|
|
3
|
+
type AstNodeOptions,
|
|
4
|
+
type BasicAppendValue,
|
|
5
|
+
notNullish,
|
|
6
|
+
type Nullable,
|
|
7
|
+
type Prettify,
|
|
8
|
+
type SingleOrMultiple,
|
|
9
|
+
type SourceBuilder,
|
|
10
|
+
toArray,
|
|
11
|
+
} from '@goast/core';
|
|
12
|
+
|
|
13
|
+
import { TsNode } from '../node.js';
|
|
14
|
+
import { writeTsNode } from '../utils/write-ts-nodes.js';
|
|
15
|
+
import { type TsArgument, tsArgument } from './argument.js';
|
|
16
|
+
import type { TsReference } from './reference.js';
|
|
17
|
+
import type { TsValue } from './types.js';
|
|
18
|
+
|
|
19
|
+
type Injects = 'function' | 'arguments';
|
|
20
|
+
|
|
21
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
22
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
23
|
+
{
|
|
24
|
+
function: TsReference<TBuilder> | BasicAppendValue<TBuilder>;
|
|
25
|
+
arguments?: Nullable<Nullable<TsArgument<TBuilder> | TsValue<TBuilder>>[]>;
|
|
26
|
+
}
|
|
27
|
+
>;
|
|
28
|
+
|
|
29
|
+
export class TsDecorator<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<
|
|
30
|
+
TBuilder,
|
|
31
|
+
TInjects | Injects
|
|
32
|
+
> {
|
|
33
|
+
public function: TsReference<TBuilder> | BasicAppendValue<TBuilder>;
|
|
34
|
+
public arguments: (TsArgument<TBuilder> | TsValue<TBuilder>)[] | null;
|
|
35
|
+
|
|
36
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
37
|
+
super(options);
|
|
38
|
+
this.function = options.function;
|
|
39
|
+
this.arguments = options.arguments?.filter(notNullish) ?? null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected override onWrite(builder: TBuilder): void {
|
|
43
|
+
builder.append('@');
|
|
44
|
+
builder.append(this.inject.beforeFunction);
|
|
45
|
+
writeTsNode(builder, this.function);
|
|
46
|
+
builder.append(this.inject.afterFunction);
|
|
47
|
+
|
|
48
|
+
if (this.arguments) {
|
|
49
|
+
builder.append(this.inject.beforeArguments);
|
|
50
|
+
tsArgument.write(builder, this.arguments);
|
|
51
|
+
builder.append(this.inject.afterArguments);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const createDecorator = <TBuilder extends SourceBuilder>(
|
|
57
|
+
fn: Options<TBuilder>['function'],
|
|
58
|
+
args?: Options<TBuilder>['arguments'],
|
|
59
|
+
options?: Prettify<Omit<Options<TBuilder>, 'function' | 'arguments'>>,
|
|
60
|
+
): TsDecorator<TBuilder> => new TsDecorator<TBuilder>({ ...options, function: fn, arguments: args });
|
|
61
|
+
|
|
62
|
+
const writeDecorators = <TBuilder extends SourceBuilder>(
|
|
63
|
+
builder: TBuilder,
|
|
64
|
+
nodes: SingleOrMultiple<Nullable<TsDecorator<TBuilder> | AppendValue<TBuilder>>>,
|
|
65
|
+
options?: { multiline?: boolean },
|
|
66
|
+
): void => {
|
|
67
|
+
const filteredNodes = toArray(nodes).filter(notNullish);
|
|
68
|
+
builder.forEach(filteredNodes, (b, d) => {
|
|
69
|
+
writeTsNode(b, d);
|
|
70
|
+
b.append(options?.multiline ? '\n' : ' ');
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const tsDecorator: typeof createDecorator & { write: typeof writeDecorators } = Object.assign(createDecorator, {
|
|
75
|
+
write: writeDecorators,
|
|
76
|
+
});
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AstNodeOptions,
|
|
3
|
+
type BasicAppendValue,
|
|
4
|
+
basicAppendValueGroup,
|
|
5
|
+
notNullish,
|
|
6
|
+
type Nullable,
|
|
7
|
+
type ParametersWithOverloads,
|
|
8
|
+
type Prettify,
|
|
9
|
+
type SourceBuilder,
|
|
10
|
+
type StringSuggestions,
|
|
11
|
+
} from '@goast/core';
|
|
12
|
+
|
|
13
|
+
import { isTypeScriptAppendValue } from '../../file-builder.js';
|
|
14
|
+
import { TsNode } from '../node.js';
|
|
15
|
+
import { writeTsNode, writeTsNodes } from '../utils/write-ts-nodes.js';
|
|
16
|
+
import type { TsType } from './types.js';
|
|
17
|
+
|
|
18
|
+
type Injects = never;
|
|
19
|
+
|
|
20
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
21
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
22
|
+
{
|
|
23
|
+
tag: string;
|
|
24
|
+
type?: Nullable<TsType<TBuilder>>;
|
|
25
|
+
text?: Nullable<BasicAppendValue<TBuilder>>;
|
|
26
|
+
}
|
|
27
|
+
>;
|
|
28
|
+
|
|
29
|
+
export class TsDocTag<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<
|
|
30
|
+
TBuilder,
|
|
31
|
+
TInjects | Injects
|
|
32
|
+
> {
|
|
33
|
+
public tag: string;
|
|
34
|
+
public type: TsType<TBuilder> | null;
|
|
35
|
+
public text: BasicAppendValue<TBuilder> | null;
|
|
36
|
+
|
|
37
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
38
|
+
super(options);
|
|
39
|
+
this.tag = options.tag;
|
|
40
|
+
this.type = options.type ?? null;
|
|
41
|
+
this.text = options.text ?? null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
protected override onWrite(builder: TBuilder): void {
|
|
45
|
+
builder.append('@', this.tag);
|
|
46
|
+
|
|
47
|
+
if (this.type) {
|
|
48
|
+
builder.append(' ');
|
|
49
|
+
builder.parenthesize('{}', (b) => writeTsNode(b, this.type));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (this.text) {
|
|
53
|
+
builder.append(' ', this.text);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
type _TsDocTagOpt<TBuilder extends SourceBuilder> = Prettify<Omit<Options<TBuilder>, 'tag'>>;
|
|
59
|
+
|
|
60
|
+
type _TsDocTagArgsMap<TBuilder extends SourceBuilder> =
|
|
61
|
+
& {
|
|
62
|
+
access(
|
|
63
|
+
access: StringSuggestions<'package' | 'private' | 'protected' | 'public'>,
|
|
64
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
65
|
+
): never;
|
|
66
|
+
author(authorName: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
67
|
+
author(
|
|
68
|
+
authorName: BasicAppendValue<TBuilder>,
|
|
69
|
+
emailAddress: BasicAppendValue<TBuilder>,
|
|
70
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
71
|
+
): never;
|
|
72
|
+
borrows(
|
|
73
|
+
thatNamepath: BasicAppendValue<TBuilder>,
|
|
74
|
+
thisNamepath: BasicAppendValue<TBuilder>,
|
|
75
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
76
|
+
): never;
|
|
77
|
+
params(
|
|
78
|
+
paramName: BasicAppendValue<TBuilder>,
|
|
79
|
+
paramDescription: BasicAppendValue<TBuilder>,
|
|
80
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
81
|
+
): never;
|
|
82
|
+
example(
|
|
83
|
+
caption: BasicAppendValue<TBuilder>,
|
|
84
|
+
code: BasicAppendValue<TBuilder>,
|
|
85
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
86
|
+
): never;
|
|
87
|
+
example(code: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
88
|
+
exports(
|
|
89
|
+
moduleName: BasicAppendValue<TBuilder>,
|
|
90
|
+
exportName: BasicAppendValue<TBuilder>,
|
|
91
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
92
|
+
): never;
|
|
93
|
+
kind(
|
|
94
|
+
kindName: StringSuggestions<
|
|
95
|
+
| 'class'
|
|
96
|
+
| 'constant'
|
|
97
|
+
| 'event'
|
|
98
|
+
| 'external'
|
|
99
|
+
| 'file'
|
|
100
|
+
| 'function'
|
|
101
|
+
| 'member'
|
|
102
|
+
| 'mixin'
|
|
103
|
+
| 'module'
|
|
104
|
+
| 'namespace'
|
|
105
|
+
| 'typedef'
|
|
106
|
+
>,
|
|
107
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
108
|
+
): never;
|
|
109
|
+
license(identifier: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
110
|
+
listens(eventName: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
111
|
+
mixes(otherObjectPath: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
112
|
+
mixin(mixinName: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
113
|
+
requires(moduleName: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
114
|
+
variation(variationNumber: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
115
|
+
}
|
|
116
|
+
& {
|
|
117
|
+
[K in 'virtual' | 'abstract']: (options?: _TsDocTagOpt<TBuilder>) => never;
|
|
118
|
+
}
|
|
119
|
+
& {
|
|
120
|
+
[K in 'alias' | 'augments' | 'callback' | 'extends' | 'lends' | 'name' | 'see' | 'this']: (
|
|
121
|
+
namePath: BasicAppendValue<TBuilder>,
|
|
122
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
123
|
+
) => never;
|
|
124
|
+
}
|
|
125
|
+
& {
|
|
126
|
+
[
|
|
127
|
+
K in
|
|
128
|
+
| 'async'
|
|
129
|
+
| 'generator'
|
|
130
|
+
| 'global'
|
|
131
|
+
| 'hideconstructor'
|
|
132
|
+
| 'ignore'
|
|
133
|
+
| 'inheritdoc'
|
|
134
|
+
| 'inner'
|
|
135
|
+
| 'instance'
|
|
136
|
+
| 'override'
|
|
137
|
+
| 'static'
|
|
138
|
+
| 'enum'
|
|
139
|
+
| 'package'
|
|
140
|
+
| 'private'
|
|
141
|
+
| 'protected'
|
|
142
|
+
| 'implements'
|
|
143
|
+
| 'type'
|
|
144
|
+
]: (options?: _TsDocTagOpt<TBuilder>) => never;
|
|
145
|
+
}
|
|
146
|
+
& {
|
|
147
|
+
[
|
|
148
|
+
K in
|
|
149
|
+
| 'class'
|
|
150
|
+
| 'constructor'
|
|
151
|
+
| 'const'
|
|
152
|
+
| 'function'
|
|
153
|
+
| 'func'
|
|
154
|
+
| 'method'
|
|
155
|
+
| 'constant'
|
|
156
|
+
| 'member'
|
|
157
|
+
| 'constructs'
|
|
158
|
+
| 'interface'
|
|
159
|
+
| 'var'
|
|
160
|
+
| 'yield'
|
|
161
|
+
| 'yields'
|
|
162
|
+
| 'module'
|
|
163
|
+
| 'namespace'
|
|
164
|
+
| 'typedef'
|
|
165
|
+
]: {
|
|
166
|
+
(name: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
167
|
+
(options?: _TsDocTagOpt<TBuilder>): never;
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
& {
|
|
171
|
+
[
|
|
172
|
+
K in
|
|
173
|
+
| 'return'
|
|
174
|
+
| 'returns'
|
|
175
|
+
| 'throws'
|
|
176
|
+
| 'exception'
|
|
177
|
+
| 'classdesc'
|
|
178
|
+
| 'copyright'
|
|
179
|
+
| 'deprecated'
|
|
180
|
+
| 'desc'
|
|
181
|
+
| 'description'
|
|
182
|
+
| 'file'
|
|
183
|
+
| 'fileoverview'
|
|
184
|
+
| 'overview'
|
|
185
|
+
| 'public'
|
|
186
|
+
| 'readonly'
|
|
187
|
+
| 'since'
|
|
188
|
+
| 'summary'
|
|
189
|
+
| 'todo'
|
|
190
|
+
| 'tutorial'
|
|
191
|
+
| 'version'
|
|
192
|
+
]: {
|
|
193
|
+
(description: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
194
|
+
(options?: _TsDocTagOpt<TBuilder>): never;
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
& {
|
|
198
|
+
[K in 'default' | 'defaultvalue']: {
|
|
199
|
+
(value: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
200
|
+
(options?: _TsDocTagOpt<TBuilder>): never;
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
& {
|
|
204
|
+
[K in 'event' | 'fires']: (
|
|
205
|
+
className: BasicAppendValue<TBuilder>,
|
|
206
|
+
eventName: BasicAppendValue<TBuilder>,
|
|
207
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
208
|
+
) => never;
|
|
209
|
+
}
|
|
210
|
+
& {
|
|
211
|
+
[K in 'external' | 'host']: (nameOfExternal: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>) => never;
|
|
212
|
+
}
|
|
213
|
+
& {
|
|
214
|
+
[K in 'memberof' | 'memberof!']: (
|
|
215
|
+
parentNamepath: BasicAppendValue<TBuilder>,
|
|
216
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
217
|
+
) => never;
|
|
218
|
+
}
|
|
219
|
+
& {
|
|
220
|
+
[K in 'param' | 'arg' | 'argument' | 'prop' | 'property' | 'template']: {
|
|
221
|
+
(
|
|
222
|
+
name: BasicAppendValue<TBuilder>,
|
|
223
|
+
description: BasicAppendValue<TBuilder>,
|
|
224
|
+
options?: _TsDocTagOpt<TBuilder>,
|
|
225
|
+
): never;
|
|
226
|
+
(name: BasicAppendValue<TBuilder>, options?: _TsDocTagOpt<TBuilder>): never;
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
type _TsDocTagArgs<
|
|
231
|
+
TTagName extends StringSuggestions<keyof _TsDocTagArgsMap<TBuilder>>,
|
|
232
|
+
TBuilder extends SourceBuilder,
|
|
233
|
+
> = TTagName extends keyof _TsDocTagArgsMap<TBuilder>
|
|
234
|
+
// deno-lint-ignore no-explicit-any
|
|
235
|
+
? _TsDocTagArgsMap<TBuilder>[TTagName] extends (...args: any[]) => any
|
|
236
|
+
? ParametersWithOverloads<_TsDocTagArgsMap<TBuilder>[TTagName]>
|
|
237
|
+
: never
|
|
238
|
+
: [options?: _TsDocTagOpt<TBuilder>];
|
|
239
|
+
|
|
240
|
+
function createDocTag<
|
|
241
|
+
TTagName extends StringSuggestions<keyof _TsDocTagArgsMap<TBuilder>>,
|
|
242
|
+
TBuilder extends SourceBuilder,
|
|
243
|
+
>(
|
|
244
|
+
tag: TTagName,
|
|
245
|
+
...args: _TsDocTagArgs<TTagName, TBuilder>
|
|
246
|
+
): TsDocTag<TBuilder>;
|
|
247
|
+
// deno-lint-ignore no-explicit-any
|
|
248
|
+
function createDocTag<TBuilder extends SourceBuilder>(tag: string, ...args: any[]): TsDocTag<TBuilder> {
|
|
249
|
+
let opt: _TsDocTagOpt<TBuilder> = {};
|
|
250
|
+
if (args.length > 0) {
|
|
251
|
+
const lastArg = args[args.length - 1];
|
|
252
|
+
if (!isTypeScriptAppendValue(lastArg) && !!lastArg) {
|
|
253
|
+
opt = args.pop() as _TsDocTagOpt<TBuilder>;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
let params = args as BasicAppendValue<TBuilder>[];
|
|
258
|
+
|
|
259
|
+
if (tag === 'author' && params.length === 2) {
|
|
260
|
+
params[1] = `<${params[1]}>`;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (tag === 'borrows') {
|
|
264
|
+
params.splice(1, 0, 'as');
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (tag === 'example') {
|
|
268
|
+
if (typeof params[0] === 'string') {
|
|
269
|
+
params[0] = `<caption>${params[0]}</caption>`;
|
|
270
|
+
}
|
|
271
|
+
if (params[1] && isTypeScriptAppendValue(params[1])) {
|
|
272
|
+
params.splice(1, 0, '\n');
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if ((tag === 'event' || tag === 'fires') && typeof params[0] === 'string' && typeof params[1] === 'string') {
|
|
277
|
+
params.splice(0, 2, `${params[0]}#${params[1]}`);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
params = [...params, opt.text].filter(notNullish);
|
|
281
|
+
return new TsDocTag({
|
|
282
|
+
tag,
|
|
283
|
+
type: opt.type,
|
|
284
|
+
text: params.length > 0 ? basicAppendValueGroup<TBuilder>(params, ' ') : null,
|
|
285
|
+
inject: opt.inject,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export const tsDocTag: typeof createDocTag & { write: typeof writeTsNodes } = Object.assign(createDocTag, {
|
|
290
|
+
write: writeTsNodes,
|
|
291
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AstNodeOptions,
|
|
3
|
+
type BasicAppendValue,
|
|
4
|
+
createOverwriteProxy,
|
|
5
|
+
getIsInstanceOf,
|
|
6
|
+
notNullish,
|
|
7
|
+
type Nullable,
|
|
8
|
+
type SourceBuilder,
|
|
9
|
+
} from '@goast/core';
|
|
10
|
+
|
|
11
|
+
import { TsNode } from '../node.js';
|
|
12
|
+
import { writeTsNodes } from '../utils/write-ts-nodes.js';
|
|
13
|
+
import { type TsDocTag, tsDocTag } from './doc-tag.js';
|
|
14
|
+
import { TsGenericParameter } from './generic-parameter.js';
|
|
15
|
+
import { TsParameter } from './parameter.js';
|
|
16
|
+
|
|
17
|
+
type Injects = never;
|
|
18
|
+
|
|
19
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
20
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
21
|
+
{
|
|
22
|
+
description?: Nullable<BasicAppendValue<TBuilder>>;
|
|
23
|
+
tags?: Nullable<Nullable<TsDocTag<TBuilder>>[]>;
|
|
24
|
+
}
|
|
25
|
+
>;
|
|
26
|
+
|
|
27
|
+
export class TsDoc<TBuilder extends SourceBuilder, TInjects extends string = never>
|
|
28
|
+
extends TsNode<TBuilder, TInjects | Injects> {
|
|
29
|
+
public description: BasicAppendValue<TBuilder> | null;
|
|
30
|
+
public tags: TsDocTag<TBuilder>[];
|
|
31
|
+
|
|
32
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
33
|
+
super(options);
|
|
34
|
+
this.description = options.description ?? null;
|
|
35
|
+
this.tags = options.tags?.filter(notNullish) ?? [];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
protected override onWrite(builder: TBuilder): void {
|
|
39
|
+
if (!this.description && this.tags.length === 0) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
builder
|
|
44
|
+
.ensureCurrentLineEmpty()
|
|
45
|
+
.parenthesize(
|
|
46
|
+
['/**', ' */'],
|
|
47
|
+
(b) =>
|
|
48
|
+
b.appendWithLinePrefix(' * ', (b) => {
|
|
49
|
+
if (this.description) {
|
|
50
|
+
b.append(this.description);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (this.tags.length > 0) {
|
|
54
|
+
b.ensurePreviousLineEmpty();
|
|
55
|
+
tsDocTag.write(b, this.tags, { separator: '\n' });
|
|
56
|
+
}
|
|
57
|
+
}),
|
|
58
|
+
{ multiline: true, indent: false },
|
|
59
|
+
)
|
|
60
|
+
.appendLine();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const createDoc = <TBuilder extends SourceBuilder>(options?: Options<TBuilder>): TsDoc<TBuilder> =>
|
|
65
|
+
new TsDoc<TBuilder>(options ?? {});
|
|
66
|
+
|
|
67
|
+
function getDoc<TBuilder extends SourceBuilder>(
|
|
68
|
+
baseDoc: TsDoc<TBuilder> | null,
|
|
69
|
+
options: {
|
|
70
|
+
parameters?: Nullable<Nullable<TsParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
|
|
71
|
+
generics?: Nullable<Nullable<TsGenericParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
|
|
72
|
+
},
|
|
73
|
+
): TsDoc<TBuilder> | null {
|
|
74
|
+
const paramsWithDesc = options.parameters
|
|
75
|
+
?.filter(getIsInstanceOf(TsParameter<TBuilder>))
|
|
76
|
+
.filter((x): x is TsParameter<TBuilder> & { description: NonNullable<unknown> } => !!x.description) ?? [];
|
|
77
|
+
const genericsWithDesc = options.generics
|
|
78
|
+
?.filter(getIsInstanceOf(TsGenericParameter<TBuilder>))
|
|
79
|
+
.filter((x): x is TsGenericParameter<TBuilder> & { description: NonNullable<unknown> } => !!x.description) ?? [];
|
|
80
|
+
if (paramsWithDesc.length === 0 && genericsWithDesc.length === 0) {
|
|
81
|
+
return baseDoc;
|
|
82
|
+
}
|
|
83
|
+
const doc = baseDoc ? createOverwriteProxy(baseDoc) : createDoc<TBuilder>();
|
|
84
|
+
const paramTags = paramsWithDesc.map<TsDocTag<TBuilder>>((p) => tsDocTag('param', p.name, p.description));
|
|
85
|
+
const genericTags = genericsWithDesc.map<TsDocTag<TBuilder>>((p) => tsDocTag('template', p.name, p.description));
|
|
86
|
+
doc.tags.splice(0, 0, ...genericTags, ...paramTags);
|
|
87
|
+
return doc;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function isDocEmpty(doc: Nullable<TsDoc<SourceBuilder>>): boolean {
|
|
91
|
+
return !doc || (!doc.description && doc.tags.length === 0);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export const tsDoc: typeof createDoc & {
|
|
95
|
+
write: typeof writeTsNodes;
|
|
96
|
+
get: typeof getDoc;
|
|
97
|
+
isEmpty: typeof isDocEmpty;
|
|
98
|
+
} = Object.assign(createDoc, {
|
|
99
|
+
write: writeTsNodes,
|
|
100
|
+
get: getDoc,
|
|
101
|
+
isEmpty: isDocEmpty,
|
|
102
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AppendValue,
|
|
3
|
+
AstNodeOptions,
|
|
4
|
+
BasicAppendValue,
|
|
5
|
+
Nullable,
|
|
6
|
+
Prettify,
|
|
7
|
+
SingleOrMultiple,
|
|
8
|
+
SourceBuilder,
|
|
9
|
+
} from '@goast/core';
|
|
10
|
+
|
|
11
|
+
import { TsNode } from '../node.js';
|
|
12
|
+
import { writeTsNode, writeTsNodes } from '../utils/write-ts-nodes.js';
|
|
13
|
+
import type { TsDoc } from './doc.js';
|
|
14
|
+
import type { TsString } from './string.js';
|
|
15
|
+
|
|
16
|
+
type Injects = 'doc' | 'name' | 'value';
|
|
17
|
+
|
|
18
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
19
|
+
typeof TsNode<TBuilder, TInjects | Injects>,
|
|
20
|
+
{
|
|
21
|
+
doc?: Nullable<TsDoc<TBuilder>>;
|
|
22
|
+
name: string;
|
|
23
|
+
value?: Nullable<TsString<TBuilder> | BasicAppendValue<TBuilder>>;
|
|
24
|
+
}
|
|
25
|
+
>;
|
|
26
|
+
|
|
27
|
+
export class TsEnumValue<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<
|
|
28
|
+
TBuilder,
|
|
29
|
+
TInjects | Injects
|
|
30
|
+
> {
|
|
31
|
+
public doc: TsDoc<TBuilder> | null;
|
|
32
|
+
public name: string;
|
|
33
|
+
public value: TsString<TBuilder> | BasicAppendValue<TBuilder> | null;
|
|
34
|
+
|
|
35
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
36
|
+
super(options);
|
|
37
|
+
this.name = options.name;
|
|
38
|
+
this.doc = options.doc ?? null;
|
|
39
|
+
this.value = options.value ?? null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected override onWrite(builder: TBuilder): void {
|
|
43
|
+
builder.append(this.inject.beforeDoc);
|
|
44
|
+
this.doc?.write(builder);
|
|
45
|
+
builder.append(this.inject.afterDoc);
|
|
46
|
+
|
|
47
|
+
builder.append(this.inject.beforeName, this.name, this.inject.afterName);
|
|
48
|
+
|
|
49
|
+
if (this.value) {
|
|
50
|
+
builder.append(' = ');
|
|
51
|
+
builder.append(this.inject.beforeValue);
|
|
52
|
+
writeTsNode(builder, this.value);
|
|
53
|
+
builder.append(this.inject.afterValue);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const createEnumValue = <TBuilder extends SourceBuilder>(
|
|
59
|
+
name: Options<TBuilder>['name'],
|
|
60
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name'>>,
|
|
61
|
+
): TsEnumValue<TBuilder> => new TsEnumValue<TBuilder>({ ...options, name });
|
|
62
|
+
|
|
63
|
+
const writeEnumValues = <TBuilder extends SourceBuilder>(
|
|
64
|
+
builder: TBuilder,
|
|
65
|
+
nodes: SingleOrMultiple<Nullable<TsEnumValue<TBuilder> | AppendValue<TBuilder>>>,
|
|
66
|
+
): void => {
|
|
67
|
+
writeTsNodes(builder, nodes, { separator: ',\n' });
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const tsEnumValue: typeof createEnumValue & { write: typeof writeEnumValues } = Object.assign(createEnumValue, {
|
|
71
|
+
write: writeEnumValues,
|
|
72
|
+
});
|