@goast/kotlin 0.5.11-beta.2 → 0.5.11
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/client/okhttp3/ApiAbstractions.kt +30 -30
- package/assets/client/okhttp3/ApiClient.kt +252 -252
- package/assets/client/okhttp3/ApiResponse.kt +43 -43
- package/assets/client/okhttp3/Errors.kt +21 -21
- package/assets/client/okhttp3/PartConfig.kt +11 -11
- package/assets/client/okhttp3/RequestConfig.kt +18 -18
- package/assets/client/okhttp3/RequestMethod.kt +8 -8
- package/assets/client/okhttp3/ResponseExtensions.kt +24 -24
- package/assets/client/spring-reactive-web-clients/ApiRequestFile.kt +33 -33
- package/esm/src/generators/services/okhttp3-clients/okhttp3-client-generator.js +28 -28
- package/esm/src/generators/services/okhttp3-clients/okhttp3-clients-generator.js +9 -9
- package/esm/src/generators/services/spring-controllers/spring-controller-generator.js +9 -9
- package/package.json +1 -1
- package/script/src/generators/services/okhttp3-clients/okhttp3-client-generator.js +28 -28
- package/script/src/generators/services/okhttp3-clients/okhttp3-clients-generator.js +9 -9
- package/script/src/generators/services/spring-controllers/spring-controller-generator.js +9 -9
- package/src/mod.ts +8 -0
- package/src/src/assets.ts +9 -0
- package/src/src/ast/_index.ts +66 -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/annotation.ts +79 -0
- package/src/src/ast/nodes/argument.ts +62 -0
- package/src/src/ast/nodes/call.ts +75 -0
- package/src/src/ast/nodes/class.ts +178 -0
- package/src/src/ast/nodes/collection-literal.ts +49 -0
- package/src/src/ast/nodes/constructor.ts +126 -0
- package/src/src/ast/nodes/doc-tag.ts +138 -0
- package/src/src/ast/nodes/doc.ts +111 -0
- package/src/src/ast/nodes/enum-value.ts +100 -0
- package/src/src/ast/nodes/enum.ts +163 -0
- package/src/src/ast/nodes/function.ts +178 -0
- package/src/src/ast/nodes/generic-parameter.ts +54 -0
- package/src/src/ast/nodes/init-block.ts +38 -0
- package/src/src/ast/nodes/interface.ts +133 -0
- package/src/src/ast/nodes/lambda-type.ts +73 -0
- package/src/src/ast/nodes/lambda.ts +74 -0
- package/src/src/ast/nodes/object.ts +102 -0
- package/src/src/ast/nodes/parameter.ts +118 -0
- package/src/src/ast/nodes/property.ts +225 -0
- package/src/src/ast/nodes/reference.ts +178 -0
- package/src/src/ast/nodes/string.ts +114 -0
- package/src/src/ast/nodes/types.ts +23 -0
- package/src/src/ast/references/index.ts +10 -0
- package/src/src/ast/references/jackson.ts +59 -0
- package/src/src/ast/references/jakarta.ts +14 -0
- package/src/src/ast/references/java.ts +27 -0
- package/src/src/ast/references/kotlin.ts +41 -0
- package/src/src/ast/references/kotlinx.ts +14 -0
- package/src/src/ast/references/okhttp3.ts +5 -0
- package/src/src/ast/references/reactor.ts +5 -0
- package/src/src/ast/references/spring-reactive.ts +37 -0
- package/src/src/ast/references/spring.ts +86 -0
- package/src/src/ast/references/swagger.ts +23 -0
- package/src/src/ast/utils/get-kotlin-builder-options.ts +19 -0
- package/src/src/ast/utils/to-kt-node.ts +31 -0
- package/src/src/ast/utils/write-kt-annotations.ts +15 -0
- package/src/src/ast/utils/write-kt-arguments.ts +45 -0
- package/src/src/ast/utils/write-kt-enum-values.ts +27 -0
- package/src/src/ast/utils/write-kt-generic-parameters.ts +12 -0
- package/src/src/ast/utils/write-kt-members.ts +25 -0
- package/src/src/ast/utils/write-kt-node.ts +37 -0
- package/src/src/ast/utils/write-kt-parameters.ts +25 -0
- package/src/src/common-results.ts +4 -0
- package/src/src/config.ts +61 -0
- package/src/src/file-builder.ts +112 -0
- package/src/src/generators/file-generator.ts +29 -0
- package/src/src/generators/index.ts +5 -0
- package/src/src/generators/models/args.ts +136 -0
- package/src/src/generators/models/index.ts +4 -0
- package/src/src/generators/models/model-generator.ts +725 -0
- package/src/src/generators/models/models-generator.ts +65 -0
- package/src/src/generators/models/models.ts +95 -0
- package/src/src/generators/services/okhttp3-clients/args.ts +90 -0
- package/src/src/generators/services/okhttp3-clients/index.ts +4 -0
- package/src/src/generators/services/okhttp3-clients/models.ts +73 -0
- package/src/src/generators/services/okhttp3-clients/okhttp3-client-generator.ts +613 -0
- package/src/src/generators/services/okhttp3-clients/okhttp3-clients-generator.ts +188 -0
- package/src/src/generators/services/okhttp3-clients/refs.ts +59 -0
- package/src/src/generators/services/spring-controllers/args.ts +95 -0
- package/src/src/generators/services/spring-controllers/index.ts +4 -0
- package/src/src/generators/services/spring-controllers/models.ts +76 -0
- package/src/src/generators/services/spring-controllers/refs.ts +17 -0
- package/src/src/generators/services/spring-controllers/spring-controller-generator.ts +1109 -0
- package/src/src/generators/services/spring-controllers/spring-controllers-generator.ts +140 -0
- package/src/src/generators/services/spring-reactive-web-clients/args.ts +103 -0
- package/src/src/generators/services/spring-reactive-web-clients/index.ts +4 -0
- package/src/src/generators/services/spring-reactive-web-clients/models.ts +62 -0
- package/src/src/generators/services/spring-reactive-web-clients/refs.ts +11 -0
- package/src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.ts +579 -0
- package/src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-clients-generator.ts +125 -0
- package/src/src/import-collection.ts +98 -0
- package/src/src/types.ts +3 -0
- package/src/src/utils.ts +47 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AppendValue,
|
|
3
|
+
type AstNodeOptions,
|
|
4
|
+
notNullish,
|
|
5
|
+
type Nullable,
|
|
6
|
+
type Prettify,
|
|
7
|
+
type SourceBuilder,
|
|
8
|
+
} from '@goast/core';
|
|
9
|
+
|
|
10
|
+
import type { KtAccessModifier } from '../common.js';
|
|
11
|
+
import { KtNode } from '../node.js';
|
|
12
|
+
import { writeKtNode, writeKtNodes } from '../utils/write-kt-node.js';
|
|
13
|
+
import { type KtAnnotation, ktAnnotation } from './annotation.js';
|
|
14
|
+
import { type KtArgument, ktArgument } from './argument.js';
|
|
15
|
+
import type { KtDoc } from './doc.js';
|
|
16
|
+
import type { KtType, KtValue } from './types.js';
|
|
17
|
+
|
|
18
|
+
type AccessorInjects = 'annotations' | 'modifiers' | 'params' | 'body';
|
|
19
|
+
|
|
20
|
+
type AccessorOptions<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
21
|
+
typeof KtNode<TBuilder, TInjects | AccessorInjects>,
|
|
22
|
+
{
|
|
23
|
+
accessModifier?: Nullable<KtAccessModifier>;
|
|
24
|
+
annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
|
|
25
|
+
body?: Nullable<AppendValue<TBuilder>>;
|
|
26
|
+
singleExpression?: Nullable<boolean>;
|
|
27
|
+
}
|
|
28
|
+
>;
|
|
29
|
+
|
|
30
|
+
export abstract class KtPropertyAccessor<
|
|
31
|
+
TBuilder extends SourceBuilder,
|
|
32
|
+
TInjects extends string = never,
|
|
33
|
+
> extends KtNode<TBuilder, TInjects | AccessorInjects> {
|
|
34
|
+
public abstract get kind(): 'get' | 'set';
|
|
35
|
+
public accessModifier: KtAccessModifier | null;
|
|
36
|
+
public annotations: KtAnnotation<TBuilder>[];
|
|
37
|
+
public body: AppendValue<TBuilder> | null;
|
|
38
|
+
public singleExpression: boolean;
|
|
39
|
+
|
|
40
|
+
constructor(options: AccessorOptions<TBuilder, TInjects>) {
|
|
41
|
+
super(options);
|
|
42
|
+
this.accessModifier = options.accessModifier ?? null;
|
|
43
|
+
this.annotations = options.annotations?.filter(notNullish) ?? [];
|
|
44
|
+
this.body = options.body ?? null;
|
|
45
|
+
this.singleExpression = options.singleExpression ?? false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
protected override onWrite(builder: TBuilder): void {
|
|
49
|
+
builder.append(this.inject.beforeAnnotations);
|
|
50
|
+
ktAnnotation.write(builder, this.annotations, { multiline: true });
|
|
51
|
+
builder.append(this.inject.afterAnnotations);
|
|
52
|
+
|
|
53
|
+
builder.append(this.inject.beforeModifiers);
|
|
54
|
+
if (this.accessModifier) builder.append(this.accessModifier, ' ');
|
|
55
|
+
builder.append(this.inject.afterModifiers);
|
|
56
|
+
|
|
57
|
+
builder.append(this.kind);
|
|
58
|
+
|
|
59
|
+
if (this.body) {
|
|
60
|
+
builder.append(this.inject.beforeParams);
|
|
61
|
+
builder.append(this.kind === 'set' ? '(value)' : '()');
|
|
62
|
+
builder.append(this.inject.afterParams);
|
|
63
|
+
|
|
64
|
+
if (this.singleExpression) {
|
|
65
|
+
builder.append(' = ', this.inject.beforeBody);
|
|
66
|
+
builder.indent(this.body);
|
|
67
|
+
} else {
|
|
68
|
+
builder.append(' ', this.inject.beforeBody);
|
|
69
|
+
builder.parenthesize('{}', this.body, { multiline: true });
|
|
70
|
+
}
|
|
71
|
+
builder.append(this.inject.afterBody);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
builder.appendLine();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export class KtPropertyGetter<TBuilder extends SourceBuilder> extends KtPropertyAccessor<TBuilder> {
|
|
78
|
+
public override readonly kind = 'get' as const;
|
|
79
|
+
}
|
|
80
|
+
export class KtPropertySetter<TBuilder extends SourceBuilder> extends KtPropertyAccessor<TBuilder> {
|
|
81
|
+
public override readonly kind = 'set' as const;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
type Injects = 'doc' | 'annotations' | 'modifiers' | 'name' | 'type' | 'default' | 'delegate';
|
|
85
|
+
|
|
86
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
87
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
88
|
+
{
|
|
89
|
+
doc?: Nullable<KtDoc<TBuilder>>;
|
|
90
|
+
name: string;
|
|
91
|
+
type?: KtType<TBuilder>;
|
|
92
|
+
annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
|
|
93
|
+
accessModifier?: Nullable<KtAccessModifier>;
|
|
94
|
+
getter?: Nullable<KtPropertyGetter<TBuilder>>;
|
|
95
|
+
setter?: Nullable<KtPropertySetter<TBuilder>>;
|
|
96
|
+
default?: Nullable<KtValue<TBuilder>>;
|
|
97
|
+
delegate?: Nullable<KtType<TBuilder>>;
|
|
98
|
+
delegateArguments?: Nullable<Nullable<KtArgument<TBuilder> | KtValue<TBuilder>>[]>;
|
|
99
|
+
mutable?: Nullable<boolean>;
|
|
100
|
+
const?: Nullable<boolean>;
|
|
101
|
+
lateinit?: Nullable<boolean>;
|
|
102
|
+
open?: Nullable<boolean>;
|
|
103
|
+
override?: Nullable<boolean>;
|
|
104
|
+
abstract?: Nullable<boolean>;
|
|
105
|
+
}
|
|
106
|
+
>;
|
|
107
|
+
|
|
108
|
+
export class KtProperty<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
109
|
+
TBuilder,
|
|
110
|
+
TInjects | Injects
|
|
111
|
+
> {
|
|
112
|
+
public doc: KtDoc<TBuilder> | null;
|
|
113
|
+
public name: string;
|
|
114
|
+
public type: KtType<TBuilder> | null;
|
|
115
|
+
public annotations: KtAnnotation<TBuilder>[];
|
|
116
|
+
public accessModifier: KtAccessModifier | null;
|
|
117
|
+
public getter: KtPropertyGetter<TBuilder> | null;
|
|
118
|
+
public setter: KtPropertySetter<TBuilder> | null;
|
|
119
|
+
public default: KtValue<TBuilder> | null;
|
|
120
|
+
public delegate: KtType<TBuilder> | null;
|
|
121
|
+
public delegateArguments: (KtArgument<TBuilder> | KtValue<TBuilder>)[] | null;
|
|
122
|
+
public mutable: boolean;
|
|
123
|
+
public const: boolean;
|
|
124
|
+
public lateinit: boolean;
|
|
125
|
+
public open: boolean;
|
|
126
|
+
public override: boolean;
|
|
127
|
+
public abstract: boolean;
|
|
128
|
+
|
|
129
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
130
|
+
super(options);
|
|
131
|
+
this.doc = options.doc ?? null;
|
|
132
|
+
this.name = options.name;
|
|
133
|
+
this.type = options.type ?? null;
|
|
134
|
+
this.annotations = options.annotations?.filter(notNullish) ?? [];
|
|
135
|
+
this.accessModifier = options.accessModifier ?? null;
|
|
136
|
+
this.getter = options.getter ?? null;
|
|
137
|
+
this.setter = options.setter ?? null;
|
|
138
|
+
this.default = options.default ?? null;
|
|
139
|
+
this.delegate = options.delegate ?? null;
|
|
140
|
+
this.delegateArguments = options.delegateArguments?.filter(notNullish) ?? null;
|
|
141
|
+
this.mutable = options.mutable ?? false;
|
|
142
|
+
this.const = options.const ?? false;
|
|
143
|
+
this.lateinit = options.lateinit ?? false;
|
|
144
|
+
this.open = options.open ?? false;
|
|
145
|
+
this.override = options.override ?? false;
|
|
146
|
+
this.abstract = options.abstract ?? false;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
protected override onWrite(builder: TBuilder): void {
|
|
150
|
+
builder.append(this.inject.beforeDoc);
|
|
151
|
+
this.doc?.write(builder);
|
|
152
|
+
builder.append(this.inject.afterDoc);
|
|
153
|
+
|
|
154
|
+
builder.append(this.inject.beforeAnnotations);
|
|
155
|
+
ktAnnotation.write(builder, this.annotations, { multiline: true });
|
|
156
|
+
builder.append(this.inject.afterAnnotations);
|
|
157
|
+
|
|
158
|
+
builder.append(this.inject.beforeModifiers);
|
|
159
|
+
if (this.accessModifier) builder.append(this.accessModifier, ' ');
|
|
160
|
+
if (this.const) builder.append('const ');
|
|
161
|
+
if (this.lateinit) builder.append('lateinit ');
|
|
162
|
+
if (this.abstract) builder.append('abstract ');
|
|
163
|
+
if (this.override) builder.append('override ');
|
|
164
|
+
if (this.open) builder.append('open ');
|
|
165
|
+
builder.append(this.inject.afterModifiers);
|
|
166
|
+
|
|
167
|
+
builder.append(this.mutable || !!this.setter ? 'var ' : 'val ');
|
|
168
|
+
builder.append(this.inject.beforeName, this.name, this.inject.afterName);
|
|
169
|
+
|
|
170
|
+
if (this.type || (!this.default && !this.getter?.body)) {
|
|
171
|
+
builder.append(': ', this.inject.beforeType);
|
|
172
|
+
writeKtNode(builder, this.type ?? 'Any?');
|
|
173
|
+
builder.append(this.inject.afterType);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (this.default) {
|
|
177
|
+
builder.append(' = ', this.inject.beforeDefault);
|
|
178
|
+
writeKtNode(builder, this.default);
|
|
179
|
+
builder.append(this.inject.afterDefault);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (this.delegate) {
|
|
183
|
+
builder.append(' by ', this.inject.beforeDelegate);
|
|
184
|
+
writeKtNode(builder, this.delegate);
|
|
185
|
+
if (this.delegateArguments) {
|
|
186
|
+
ktArgument.write(builder, this.delegateArguments);
|
|
187
|
+
}
|
|
188
|
+
builder.append(this.inject.afterDelegate);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
builder.appendLine();
|
|
192
|
+
|
|
193
|
+
if (this.getter || this.setter) {
|
|
194
|
+
builder.indent((b) => {
|
|
195
|
+
this.getter?.write(b);
|
|
196
|
+
this.setter?.write(b);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
builder.ensureCurrentLineEmpty();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const createPropertyGetter = <TBuilder extends SourceBuilder>(
|
|
205
|
+
options?: AccessorOptions<TBuilder>,
|
|
206
|
+
): KtPropertyGetter<TBuilder> => new KtPropertyGetter<TBuilder>(options ?? {});
|
|
207
|
+
|
|
208
|
+
const createPropertySetter = <TBuilder extends SourceBuilder>(
|
|
209
|
+
options?: AccessorOptions<TBuilder>,
|
|
210
|
+
): KtPropertySetter<TBuilder> => new KtPropertySetter<TBuilder>(options ?? {});
|
|
211
|
+
|
|
212
|
+
const createProperty = <TBuilder extends SourceBuilder>(
|
|
213
|
+
name: Options<TBuilder>['name'],
|
|
214
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name'>>,
|
|
215
|
+
): KtProperty<TBuilder> => new KtProperty<TBuilder>({ ...options, name });
|
|
216
|
+
|
|
217
|
+
export const ktProperty: typeof createProperty & {
|
|
218
|
+
getter: typeof createPropertyGetter;
|
|
219
|
+
setter: typeof createPropertySetter;
|
|
220
|
+
write: typeof writeKtNodes;
|
|
221
|
+
} = Object.assign(createProperty, {
|
|
222
|
+
getter: createPropertyGetter,
|
|
223
|
+
setter: createPropertySetter,
|
|
224
|
+
write: writeKtNodes,
|
|
225
|
+
});
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AstNodeOptions,
|
|
3
|
+
notNullish,
|
|
4
|
+
type Nullable,
|
|
5
|
+
type Prettify,
|
|
6
|
+
type SourceBuilder,
|
|
7
|
+
type TupleWithCount,
|
|
8
|
+
} from '@goast/core';
|
|
9
|
+
|
|
10
|
+
import { KotlinFileBuilder } from '../../file-builder.js';
|
|
11
|
+
import { KtNode } from '../node.js';
|
|
12
|
+
import { writeKtNode, writeKtNodes } from '../utils/write-kt-node.js';
|
|
13
|
+
import { ktGenericParameter } from './generic-parameter.js';
|
|
14
|
+
import type { KtType } from './types.js';
|
|
15
|
+
|
|
16
|
+
import type { KtCall } from './call.js';
|
|
17
|
+
|
|
18
|
+
type Injects = never;
|
|
19
|
+
|
|
20
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
21
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
22
|
+
{
|
|
23
|
+
name: string;
|
|
24
|
+
packageName?: Nullable<string>;
|
|
25
|
+
generics?: Nullable<Nullable<KtType<TBuilder>>[]>;
|
|
26
|
+
nullable?: Nullable<boolean>;
|
|
27
|
+
classReference?: Nullable<boolean>;
|
|
28
|
+
subReference?: Nullable<KtReference<TBuilder> | KtCall<TBuilder>>;
|
|
29
|
+
}
|
|
30
|
+
>;
|
|
31
|
+
|
|
32
|
+
type _AddImportHandler<T> = {
|
|
33
|
+
// deno-lint-ignore no-explicit-any
|
|
34
|
+
builderClass: abstract new (...args: any) => T;
|
|
35
|
+
// deno-lint-ignore no-explicit-any
|
|
36
|
+
handler: (builder: T, reference: KtReference<any>) => void;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export class KtReference<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
40
|
+
TBuilder,
|
|
41
|
+
TInjects | Injects
|
|
42
|
+
> {
|
|
43
|
+
// deno-lint-ignore no-explicit-any
|
|
44
|
+
private static readonly addImportHandlers: _AddImportHandler<any>[] = [
|
|
45
|
+
{
|
|
46
|
+
builderClass: KotlinFileBuilder,
|
|
47
|
+
handler: (builder, reference) => builder.addImport(reference.name, reference.packageName),
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
public name: string;
|
|
52
|
+
public packageName: string | null;
|
|
53
|
+
public generics: KtType<TBuilder>[];
|
|
54
|
+
public nullable: boolean;
|
|
55
|
+
public classReference: boolean;
|
|
56
|
+
public subReference: KtReference<TBuilder> | KtCall<TBuilder> | null;
|
|
57
|
+
|
|
58
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
59
|
+
super(options);
|
|
60
|
+
this.name = options.name;
|
|
61
|
+
this.packageName = options.packageName ?? null;
|
|
62
|
+
this.generics = options.generics?.filter(notNullish) ?? [];
|
|
63
|
+
this.nullable = options.nullable ?? false;
|
|
64
|
+
this.classReference = options.classReference ?? false;
|
|
65
|
+
this.subReference = options.subReference ?? null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public addImport(builder: TBuilder): void {
|
|
69
|
+
if (this.packageName) {
|
|
70
|
+
const handler = KtReference.addImportHandlers.find((h) => builder instanceof h.builderClass);
|
|
71
|
+
if (handler) {
|
|
72
|
+
handler.handler(builder, this);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
protected override onWrite(builder: TBuilder): void {
|
|
78
|
+
builder.append(this.name);
|
|
79
|
+
ktGenericParameter.write(builder, this.generics);
|
|
80
|
+
if (this.classReference) {
|
|
81
|
+
builder.append('::class');
|
|
82
|
+
} else if (this.subReference) {
|
|
83
|
+
builder.append('::');
|
|
84
|
+
writeKtNode(builder, this.subReference);
|
|
85
|
+
} else if (this.nullable) {
|
|
86
|
+
builder.append('?');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
this.addImport(builder);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public static registerAddImportHandler<TBuilder extends SourceBuilder>(
|
|
93
|
+
builderClass: _AddImportHandler<TBuilder>['builderClass'],
|
|
94
|
+
handler: _AddImportHandler<TBuilder>['handler'],
|
|
95
|
+
): void {
|
|
96
|
+
KtReference.addImportHandlers.push({ builderClass, handler });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const createReference = <TBuilder extends SourceBuilder>(
|
|
101
|
+
name: Options<TBuilder>['name'],
|
|
102
|
+
packageName?: Options<TBuilder>['packageName'],
|
|
103
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name' | 'packageName'>>,
|
|
104
|
+
): KtReference<TBuilder> => new KtReference<TBuilder>({ ...options, name, packageName });
|
|
105
|
+
|
|
106
|
+
export type KtReferenceFactory =
|
|
107
|
+
& (<TBuilder extends SourceBuilder>(
|
|
108
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name' | 'packageName'>>,
|
|
109
|
+
) => KtReference<TBuilder>)
|
|
110
|
+
& {
|
|
111
|
+
refName: string;
|
|
112
|
+
packageName: Nullable<string>;
|
|
113
|
+
matches: (value: unknown) => value is KtReference<never>;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export type KtGenericReferenceFactory<TGenericCount extends number | number[]> =
|
|
117
|
+
& (<TBuilder extends SourceBuilder>(
|
|
118
|
+
generics: TupleWithCount<KtType<TBuilder>, TGenericCount>,
|
|
119
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name' | 'packageName' | 'generics'>>,
|
|
120
|
+
) => KtReference<TBuilder>)
|
|
121
|
+
& {
|
|
122
|
+
refName: string;
|
|
123
|
+
packageName: Nullable<string>;
|
|
124
|
+
infer: <TBuilder extends SourceBuilder>(
|
|
125
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name' | 'packageName' | 'generics'>>,
|
|
126
|
+
) => KtReference<TBuilder>;
|
|
127
|
+
matches: (value: unknown) => value is KtReference<never>;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const createFactory = (name: string, packageName?: Nullable<string>): KtReferenceFactory => {
|
|
131
|
+
return Object.assign(
|
|
132
|
+
<TBuilder extends SourceBuilder>(options?: Prettify<Omit<Options<TBuilder>, 'name' | 'packageName'>>) =>
|
|
133
|
+
createReference<TBuilder>(name, packageName, options),
|
|
134
|
+
{
|
|
135
|
+
refName: name,
|
|
136
|
+
packageName,
|
|
137
|
+
matches: (value: unknown): value is KtReference<never> =>
|
|
138
|
+
value instanceof KtReference && value.name === name && value.packageName === (packageName ?? null),
|
|
139
|
+
},
|
|
140
|
+
);
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const createGenericFactory = <TGenericCount extends number | number[]>(
|
|
144
|
+
name: string,
|
|
145
|
+
packageName?: Nullable<string>,
|
|
146
|
+
): KtGenericReferenceFactory<TGenericCount> => {
|
|
147
|
+
return Object.assign(
|
|
148
|
+
<TBuilder extends SourceBuilder>(
|
|
149
|
+
generics: TupleWithCount<KtType<TBuilder>, TGenericCount>,
|
|
150
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name' | 'packageName' | 'generics'>>,
|
|
151
|
+
) => createReference<TBuilder>(name, packageName, { ...options, generics }),
|
|
152
|
+
{
|
|
153
|
+
refName: name,
|
|
154
|
+
packageName,
|
|
155
|
+
infer: <TBuilder extends SourceBuilder>(
|
|
156
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name' | 'packageName' | 'generics'>>,
|
|
157
|
+
) => createReference<TBuilder>(name, packageName, options),
|
|
158
|
+
matches: (value: unknown): value is KtReference<never> =>
|
|
159
|
+
value instanceof KtReference && value.name === name && value.packageName === (packageName ?? null),
|
|
160
|
+
},
|
|
161
|
+
);
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const importRefs = <TBuilder extends SourceBuilder>(builder: TBuilder, references: KtReference<TBuilder>[]): void => {
|
|
165
|
+
references.forEach((ref) => ref.addImport(builder));
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export const ktReference: typeof createReference & {
|
|
169
|
+
factory: typeof createFactory;
|
|
170
|
+
genericFactory: typeof createGenericFactory;
|
|
171
|
+
write: typeof writeKtNodes;
|
|
172
|
+
import: typeof importRefs;
|
|
173
|
+
} = Object.assign(createReference, {
|
|
174
|
+
factory: createFactory,
|
|
175
|
+
genericFactory: createGenericFactory,
|
|
176
|
+
write: writeKtNodes,
|
|
177
|
+
import: importRefs,
|
|
178
|
+
});
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { type AstNodeOptions, type Nullable, type Prettify, type SourceBuilder, spliceString } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { KtNode } from '../node.js';
|
|
4
|
+
import { writeKtNodes } from '../utils/write-kt-node.js';
|
|
5
|
+
import { ktArgument } from './argument.js';
|
|
6
|
+
|
|
7
|
+
type Injects = never;
|
|
8
|
+
|
|
9
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
10
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
11
|
+
{
|
|
12
|
+
value?: Nullable<string>;
|
|
13
|
+
template?: Nullable<boolean>;
|
|
14
|
+
multiline?: Nullable<boolean>;
|
|
15
|
+
trimMargin?: Nullable<boolean>;
|
|
16
|
+
marginPrefix?: Nullable<string>;
|
|
17
|
+
autoAddMarginPrefix?: Nullable<boolean>;
|
|
18
|
+
}
|
|
19
|
+
>;
|
|
20
|
+
|
|
21
|
+
export class KtString<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
22
|
+
TBuilder,
|
|
23
|
+
TInjects | Injects
|
|
24
|
+
> {
|
|
25
|
+
public value: string | null;
|
|
26
|
+
public template: boolean;
|
|
27
|
+
public multiline: boolean;
|
|
28
|
+
public trimMargin: boolean;
|
|
29
|
+
public marginPrefix: string | null;
|
|
30
|
+
public autoAddMarginPrefix: boolean;
|
|
31
|
+
|
|
32
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
33
|
+
super(options);
|
|
34
|
+
this.value = options?.value ?? null;
|
|
35
|
+
this.template = options?.template ?? false;
|
|
36
|
+
this.multiline = options?.multiline ?? false;
|
|
37
|
+
this.trimMargin = options?.trimMargin ?? true;
|
|
38
|
+
this.marginPrefix = options?.marginPrefix ?? null;
|
|
39
|
+
this.autoAddMarginPrefix = options?.autoAddMarginPrefix ?? true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected override onWrite(builder: TBuilder): void {
|
|
43
|
+
if (this.value === null) {
|
|
44
|
+
builder.append('null');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let value = JSON.stringify(this.value).slice(1, -1);
|
|
49
|
+
if (this.multiline) {
|
|
50
|
+
value = value.replace(/\\n/g, '\n').replace(/\\r/g, '\r');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!this.template) {
|
|
54
|
+
value = value.replace(/\$/g, '\\$');
|
|
55
|
+
} else {
|
|
56
|
+
const originalParts = this.findTemplateParts(this.value);
|
|
57
|
+
const escapedParts = this.findTemplateParts(value);
|
|
58
|
+
if (originalParts.length !== escapedParts.length) {
|
|
59
|
+
throw new Error('Template parts count mismatch');
|
|
60
|
+
}
|
|
61
|
+
for (let i = originalParts.length - 1; i >= 0; i--) {
|
|
62
|
+
const original = originalParts[i];
|
|
63
|
+
const escaped = escapedParts[i];
|
|
64
|
+
value = spliceString(value, escaped.index, escaped.value.length, original.value);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
builder.append(this.multiline ? '"""' + (this.trimMargin ? '\n' : '') : '"');
|
|
69
|
+
|
|
70
|
+
if (this.multiline && this.trimMargin) {
|
|
71
|
+
builder.indent((b) => {
|
|
72
|
+
if (this.autoAddMarginPrefix) {
|
|
73
|
+
b.appendWithLinePrefix(this.marginPrefix ?? '|', value);
|
|
74
|
+
} else {
|
|
75
|
+
b.append(value);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
b.append('\n""".trimMargin');
|
|
79
|
+
ktArgument.write(b, [this.marginPrefix ? new KtString<TBuilder>({ value: this.marginPrefix }) : null]);
|
|
80
|
+
});
|
|
81
|
+
} else {
|
|
82
|
+
builder.append(value, this.multiline ? '"""' : '"');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
protected findTemplateParts(value: string): { value: string; index: number }[] {
|
|
87
|
+
const parts: { value: string; index: number }[] = [];
|
|
88
|
+
let start: number | undefined = undefined;
|
|
89
|
+
let bracketCount = 0;
|
|
90
|
+
for (let i = 0; i < value.length; i++) {
|
|
91
|
+
if (value[i] === '$' && value[i + 1] === '{') {
|
|
92
|
+
start = i;
|
|
93
|
+
} else if (value[i] === '{') {
|
|
94
|
+
bracketCount++;
|
|
95
|
+
} else if (value[i] === '}') {
|
|
96
|
+
bracketCount--;
|
|
97
|
+
if (bracketCount === 0 && start !== undefined) {
|
|
98
|
+
parts.push({ value: value.slice(start, i + 1), index: start });
|
|
99
|
+
start = undefined;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return parts;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const createString = <TBuilder extends SourceBuilder>(
|
|
108
|
+
value: Options<TBuilder>['value'],
|
|
109
|
+
options?: Prettify<Omit<Options<TBuilder>, 'value'>>,
|
|
110
|
+
): KtString<TBuilder> => new KtString<TBuilder>({ ...options, value });
|
|
111
|
+
|
|
112
|
+
export const ktString: typeof createString & { write: typeof writeKtNodes } = Object.assign(createString, {
|
|
113
|
+
write: writeKtNodes,
|
|
114
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { BasicAppendValue, SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import type { KtCall } from './call.js';
|
|
4
|
+
import type { KtCollectionLiteral } from './collection-literal.js';
|
|
5
|
+
import type { KtLambdaType } from './lambda-type.js';
|
|
6
|
+
import type { KtLambda } from './lambda.js';
|
|
7
|
+
import type { KtObject } from './object.js';
|
|
8
|
+
import type { KtReference } from './reference.js';
|
|
9
|
+
import type { KtString } from './string.js';
|
|
10
|
+
|
|
11
|
+
export type KtType<TBuilder extends SourceBuilder> =
|
|
12
|
+
| KtReference<TBuilder>
|
|
13
|
+
| KtLambdaType<TBuilder>
|
|
14
|
+
| BasicAppendValue<TBuilder>;
|
|
15
|
+
|
|
16
|
+
export type KtValue<TBuilder extends SourceBuilder> =
|
|
17
|
+
| KtReference<TBuilder>
|
|
18
|
+
| KtString<TBuilder>
|
|
19
|
+
| KtCall<TBuilder>
|
|
20
|
+
| KtObject<TBuilder>
|
|
21
|
+
| KtLambda<TBuilder>
|
|
22
|
+
| KtCollectionLiteral<TBuilder>
|
|
23
|
+
| BasicAppendValue<TBuilder>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * as jackson from './jackson.js';
|
|
2
|
+
export * as jakarta from './jakarta.js';
|
|
3
|
+
export * as java from './java.js';
|
|
4
|
+
export * from './kotlin.js';
|
|
5
|
+
export * as kotlinx from './kotlinx.js';
|
|
6
|
+
export * as okhttp3 from './okhttp3.js';
|
|
7
|
+
export * as reactor from './reactor.js';
|
|
8
|
+
export * as springReactive from './spring-reactive.js';
|
|
9
|
+
export * as spring from './spring.js';
|
|
10
|
+
export * as swagger from './swagger.js';
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import type { SpringBootVersion } from '../../config.js';
|
|
4
|
+
import { type KtReference, ktReference, type KtReferenceFactory } from '../nodes/reference.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Resolves a Jackson package name for the targeted Spring Boot version.
|
|
8
|
+
*
|
|
9
|
+
* Jackson 3 (the default in Spring Boot 4) moved every package **except annotations** from
|
|
10
|
+
* `com.fasterxml.jackson.*` to `tools.jackson.*`. Annotations stay on `com.fasterxml.jackson.annotation`.
|
|
11
|
+
*/
|
|
12
|
+
const jacksonPackage = (subPackage: string, springBootVersion: SpringBootVersion): string =>
|
|
13
|
+
`${springBootVersion === 4 ? 'tools.jackson' : 'com.fasterxml.jackson'}.${subPackage}`;
|
|
14
|
+
|
|
15
|
+
// com.fasterxml.jackson.annotation
|
|
16
|
+
export const jsonTypeInfo: KtReferenceFactory = ktReference.factory('JsonTypeInfo', 'com.fasterxml.jackson.annotation');
|
|
17
|
+
export const jsonSubTypes: KtReferenceFactory = ktReference.factory('JsonSubTypes', 'com.fasterxml.jackson.annotation');
|
|
18
|
+
export const jsonClassDescription: KtReferenceFactory = ktReference.factory(
|
|
19
|
+
'JsonClassDescription',
|
|
20
|
+
'com.fasterxml.jackson.annotation',
|
|
21
|
+
);
|
|
22
|
+
export const jsonProperty: KtReferenceFactory = ktReference.factory('JsonProperty', 'com.fasterxml.jackson.annotation');
|
|
23
|
+
export const jsonPropertyDescription: KtReferenceFactory = ktReference.factory(
|
|
24
|
+
'JsonPropertyDescription',
|
|
25
|
+
'com.fasterxml.jackson.annotation',
|
|
26
|
+
);
|
|
27
|
+
export const jsonInclude: KtReferenceFactory = ktReference.factory('JsonInclude', 'com.fasterxml.jackson.annotation');
|
|
28
|
+
export const jsonIgnore: KtReferenceFactory = ktReference.factory('JsonIgnore', 'com.fasterxml.jackson.annotation');
|
|
29
|
+
export const jsonAnySetter: KtReferenceFactory = ktReference.factory(
|
|
30
|
+
'JsonAnySetter',
|
|
31
|
+
'com.fasterxml.jackson.annotation',
|
|
32
|
+
);
|
|
33
|
+
export const jsonAnyGetter: KtReferenceFactory = ktReference.factory(
|
|
34
|
+
'JsonAnyGetter',
|
|
35
|
+
'com.fasterxml.jackson.annotation',
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
// com.fasterxml.jackson.databind (Jackson 2) / tools.jackson.databind (Jackson 3, Spring Boot 4)
|
|
39
|
+
export const objectMapper = <TBuilder extends SourceBuilder>(
|
|
40
|
+
springBootVersion: SpringBootVersion = 3,
|
|
41
|
+
): KtReference<TBuilder> => ktReference<TBuilder>('ObjectMapper', jacksonPackage('databind', springBootVersion));
|
|
42
|
+
export const serializationFeature = <TBuilder extends SourceBuilder>(
|
|
43
|
+
springBootVersion: SpringBootVersion = 3,
|
|
44
|
+
): KtReference<TBuilder> =>
|
|
45
|
+
ktReference<TBuilder>('SerializationFeature', jacksonPackage('databind', springBootVersion));
|
|
46
|
+
export const deserializationFeature = <TBuilder extends SourceBuilder>(
|
|
47
|
+
springBootVersion: SpringBootVersion = 3,
|
|
48
|
+
): KtReference<TBuilder> =>
|
|
49
|
+
ktReference<TBuilder>('DeserializationFeature', jacksonPackage('databind', springBootVersion));
|
|
50
|
+
|
|
51
|
+
// com.fasterxml.jackson.module.kotlin (Jackson 2) / tools.jackson.module.kotlin (Jackson 3, Spring Boot 4)
|
|
52
|
+
export const jacksonObjectMapper = <TBuilder extends SourceBuilder>(
|
|
53
|
+
springBootVersion: SpringBootVersion = 3,
|
|
54
|
+
): KtReference<TBuilder> =>
|
|
55
|
+
ktReference<TBuilder>('jacksonObjectMapper', jacksonPackage('module.kotlin', springBootVersion));
|
|
56
|
+
export const jacksonMapperBuilder = <TBuilder extends SourceBuilder>(
|
|
57
|
+
springBootVersion: SpringBootVersion = 3,
|
|
58
|
+
): KtReference<TBuilder> =>
|
|
59
|
+
ktReference<TBuilder>('jacksonMapperBuilder', jacksonPackage('module.kotlin', springBootVersion));
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ktReference, type KtReferenceFactory } from '../nodes/reference.js';
|
|
2
|
+
|
|
3
|
+
// jakarta.annotation
|
|
4
|
+
export const generated: KtReferenceFactory = ktReference.factory('Generated', 'jakarta.annotation');
|
|
5
|
+
|
|
6
|
+
// jakarta.validation
|
|
7
|
+
export const valid: KtReferenceFactory = ktReference.factory('Valid', 'jakarta.validation');
|
|
8
|
+
|
|
9
|
+
// jakarta.validation.constraints
|
|
10
|
+
export const pattern: KtReferenceFactory = ktReference.factory('Pattern', 'jakarta.validation.constraints');
|
|
11
|
+
export const min: KtReferenceFactory = ktReference.factory('Min', 'jakarta.validation.constraints');
|
|
12
|
+
export const max: KtReferenceFactory = ktReference.factory('Max', 'jakarta.validation.constraints');
|
|
13
|
+
export const notEmpty: KtReferenceFactory = ktReference.factory('NotEmpty', 'jakarta.validation.constraints');
|
|
14
|
+
export const size: KtReferenceFactory = ktReference.factory('Size', 'jakarta.validation.constraints');
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type KtGenericReferenceFactory, ktReference, type KtReferenceFactory } from '../nodes/reference.js';
|
|
2
|
+
|
|
3
|
+
// java.io
|
|
4
|
+
export const file: KtReferenceFactory = ktReference.factory('File', 'java.io');
|
|
5
|
+
export const ioException: KtReferenceFactory = ktReference.factory('IOException', 'java.io');
|
|
6
|
+
|
|
7
|
+
// java.lang
|
|
8
|
+
export const illegalStateException: KtReferenceFactory = ktReference.factory('IllegalStateException', 'java.lang');
|
|
9
|
+
export const system: KtReferenceFactory = ktReference.factory('System', 'java.lang');
|
|
10
|
+
export const unsupportedOperationException: KtReferenceFactory = ktReference.factory(
|
|
11
|
+
'UnsupportedOperationException',
|
|
12
|
+
'java.lang',
|
|
13
|
+
);
|
|
14
|
+
export const void_: KtReferenceFactory = ktReference.factory('Void', 'java.lang');
|
|
15
|
+
|
|
16
|
+
// java.net
|
|
17
|
+
export const uri: KtReferenceFactory = ktReference.factory('URI', 'java.net');
|
|
18
|
+
|
|
19
|
+
// java.time
|
|
20
|
+
export const offsetDateTime: KtReferenceFactory = ktReference.factory('OffsetDateTime', 'java.time');
|
|
21
|
+
export const offsetTime: KtReferenceFactory = ktReference.factory('OffsetTime', 'java.time');
|
|
22
|
+
export const localDateTime: KtReferenceFactory = ktReference.factory('LocalDateTime', 'java.time');
|
|
23
|
+
export const localDate: KtReferenceFactory = ktReference.factory('LocalDate', 'java.time');
|
|
24
|
+
export const localTime: KtReferenceFactory = ktReference.factory('LocalTime', 'java.time');
|
|
25
|
+
|
|
26
|
+
// java.util
|
|
27
|
+
export const optional: KtGenericReferenceFactory<1> = ktReference.genericFactory<1>('Optional', 'java.util');
|