Skip to content

Commit 0bd1a6c

Browse files
committed
inject defaults in codegen config
1 parent 25690ba commit 0bd1a6c

11 files changed

+69
-41
lines changed

src/config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ export const configSchema = object({
130130
}),
131131
),
132132
),
133+
/**
134+
* Denotes the generation strategy for union types. Defaults to `MARKER_INTERFACE`.
135+
* https://opensource.expediagroup.com/graphql-kotlin/docs/schema-generator/writing-schemas/unions/
136+
*/
133137
unionGeneration: optional(
134138
union([literal("ANNOTATION_CLASS"), literal("MARKER_INTERFACE")]),
135139
),

src/definitions/enum.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,5 @@ function buildEnumValueDefinition(
5252
config,
5353
definitionNode: node,
5454
});
55-
return `${annotations}${config.convert(node)}`;
55+
return `${annotations}${config.convert?.(node)}`;
5656
}

src/helpers/add-dependent-types.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,17 @@ export function addDependentTypes(
2020
config: CodegenConfig,
2121
schema: GraphQLSchema,
2222
) {
23-
if (config.onlyTypes && (config.includeDependentTypes ?? true)) {
24-
const onlyTypesNodes = config.onlyTypes
25-
.map((typeName) => schema.getType(typeName)?.astNode)
26-
.filter(Boolean);
27-
const dependentTypeNames = onlyTypesNodes.flatMap((node) =>
28-
getDependentTypeNames(schema, node, config),
29-
);
30-
const dependentTypesInScope = dependentTypeNames.filter((typeName) =>
31-
dependentTypeIsInScope(typeName, config),
32-
);
33-
config.onlyTypes.push(...dependentTypesInScope);
23+
if (!config.onlyTypes) {
24+
throw new Error(`config.onlyTypes is required to add dependent types`);
3425
}
26+
const onlyTypesNodes = config.onlyTypes
27+
.map((typeName) => schema.getType(typeName)?.astNode)
28+
.filter(Boolean);
29+
const dependentTypeNames = onlyTypesNodes.flatMap((node) =>
30+
getDependentTypeNames(schema, node, config),
31+
);
32+
const dependentTypesInScope = dependentTypeNames.filter((typeName) =>
33+
dependentTypeIsInScope(typeName, config),
34+
);
35+
config.onlyTypes.push(...dependentTypesInScope);
3536
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { GraphQLKotlinCodegenConfig } from "../plugin";
2+
import { buildPackageNameFromPath } from "@graphql-codegen/java-common";
3+
import { dirname, normalize } from "path";
4+
5+
export function buildConfigWithDefaults(
6+
config: GraphQLKotlinCodegenConfig,
7+
outputFile: string,
8+
) {
9+
const relevantPath = dirname(normalize(outputFile));
10+
11+
return {
12+
packageName: buildPackageNameFromPath(relevantPath),
13+
includeDependentTypes: true,
14+
unionGeneration: "MARKER_INTERFACE",
15+
...config,
16+
extraImports: [
17+
"com.expediagroup.graphql.generator.annotations.*",
18+
...(config.extraImports ?? ([] satisfies string[])),
19+
],
20+
} as const;
21+
}

src/helpers/build-directive-annotations.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ See the License for the specific language governing permissions and
1111
limitations under the License.
1212
*/
1313

14-
import { CodegenConfig, GraphQLKotlinCodegenConfig } from "../plugin";
14+
import { CodegenConfig } from "../plugin";
1515
import {
1616
DefinitionNode,
1717
isDeprecatedDescription,
@@ -75,7 +75,7 @@ export function buildDirectiveAnnotations(
7575
function buildKotlinAnnotations(
7676
directive: ConstDirectiveNode,
7777
kotlinAnnotations: NonNullable<
78-
GraphQLKotlinCodegenConfig["directiveReplacements"]
78+
CodegenConfig["directiveReplacements"]
7979
>[number]["kotlinAnnotations"],
8080
) {
8181
return kotlinAnnotations.map((kotlinAnnotation) => {

src/helpers/build-type-metadata.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export function buildTypeMetadata(
6060
};
6161
} else if (isUnionType(schemaType)) {
6262
const shouldTreatUnionAsInterface =
63-
config.unionGeneration !== "ANNOTATION_CLASS" ||
63+
config.unionGeneration === "MARKER_INTERFACE" ||
6464
config.externalUnionsAsInterfaces?.includes(schemaType.name);
6565
return {
6666
...commonMetadata,

src/helpers/dependent-type-utils.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ import { CodegenConfig } from "../plugin";
2222

2323
export function getDependentFieldTypeNames(
2424
node: TypeDefinitionNode,
25-
dependentTypesInScope: CodegenConfig["dependentTypesInScope"],
25+
config: CodegenConfig,
2626
) {
2727
return "fields" in node && node.fields
2828
? node.fields
2929
.map((field) => getFieldTypeName(field.type))
3030
.filter(
3131
(typeName) =>
32-
!dependentTypesInScope || dependentTypesInScope.includes(typeName),
32+
!config.dependentTypesInScope ||
33+
config.dependentTypesInScope.includes(typeName),
3334
)
3435
: [];
3536
}

src/helpers/get-dependent-type-names.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,14 @@ import {
1818
getDependentInterfaceNames,
1919
getDependentUnionNames,
2020
} from "./dependent-type-utils";
21-
import { GraphQLKotlinCodegenConfig } from "../plugin";
21+
import { CodegenConfig } from "../plugin";
2222

2323
export function getDependentTypeNames(
2424
schema: GraphQLSchema,
2525
node: TypeDefinitionNode,
26-
config: GraphQLKotlinCodegenConfig,
26+
config: CodegenConfig,
2727
): string[] {
28-
const namedTypes = getDependentFieldTypeNames(
29-
node,
30-
config.dependentTypesInScope,
31-
)
28+
const namedTypes = getDependentFieldTypeNames(node, config)
3229
.concat(getDependentUnionNames(node))
3330
.concat(getDependentInterfaceNames(node));
3431
const recursivelyFoundTypes = namedTypes

src/plugin.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,10 @@ See the License for the specific language governing permissions and
1111
limitations under the License.
1212
*/
1313

14-
import { dirname, normalize } from "path";
1514
import {
1615
getCachedDocumentNodeFromSchema,
1716
PluginFunction,
1817
} from "@graphql-codegen/plugin-helpers";
19-
import { buildPackageNameFromPath } from "@graphql-codegen/java-common";
2018
import { KotlinVisitor } from "./visitor";
2119
import {
2220
ParsedConfig,
@@ -26,13 +24,13 @@ import { Input, safeParse } from "valibot";
2624
import { configSchema } from "./config";
2725
import { addDependentTypes } from "./helpers/add-dependent-types";
2826
import { visit } from "graphql";
27+
import { buildConfigWithDefaults } from "./helpers/build-config-with-defaults";
2928

3029
export type GraphQLKotlinCodegenConfig = Partial<RawConfig & ParsedConfig> &
3130
Input<typeof configSchema>;
32-
export type CodegenConfig = RawConfig &
33-
ParsedConfig &
34-
Input<typeof configSchema>;
35-
export const plugin: PluginFunction<CodegenConfig> = (
31+
export type CodegenConfig = ReturnType<typeof buildConfigWithDefaults>;
32+
33+
export const plugin: PluginFunction<GraphQLKotlinCodegenConfig> = (
3634
schema,
3735
_,
3836
config,
@@ -41,7 +39,6 @@ export const plugin: PluginFunction<CodegenConfig> = (
4139
if (!info?.outputFile) {
4240
throw new Error("Missing outputFile in config");
4341
}
44-
const relevantPath = dirname(normalize(info.outputFile));
4542
const { issues } = safeParse(configSchema, config);
4643
if (issues) {
4744
throw new Error(
@@ -54,17 +51,20 @@ export const plugin: PluginFunction<CodegenConfig> = (
5451
);
5552
}
5653

57-
addDependentTypes(config, schema);
58-
const visitor = new KotlinVisitor(config, schema);
54+
const configWithDefaults = buildConfigWithDefaults(config, info.outputFile);
55+
56+
if (
57+
configWithDefaults.onlyTypes &&
58+
configWithDefaults.includeDependentTypes
59+
) {
60+
addDependentTypes(configWithDefaults, schema);
61+
}
62+
const visitor = new KotlinVisitor(configWithDefaults, schema);
5963
const astNode = getCachedDocumentNodeFromSchema(schema);
6064
const { definitions } = visit(astNode, visitor);
61-
const packageName = `package ${
62-
config.packageName ?? buildPackageNameFromPath(relevantPath)
63-
}\n`;
64-
const defaultImports = ["com.expediagroup.graphql.generator.annotations.*"];
65+
const packageName = `package ${configWithDefaults.packageName}\n`;
6566
const imports =
66-
defaultImports
67-
.concat(config.extraImports ?? [])
67+
configWithDefaults.extraImports
6868
.map((annotation) => `import ${annotation}`)
6969
.join("\n") + "\n";
7070
const typeDefinitions = definitions

src/visitor.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ import { buildInterfaceDefinition } from "./definitions/interface";
2626
import { buildInputObjectDefinition } from "./definitions/input";
2727
import { buildObjectTypeDefinition } from "./definitions/object";
2828
import { buildUnionTypeDefinition } from "./definitions/union";
29+
import { ParsedConfig } from "@graphql-codegen/visitor-plugin-common/typings/base-visitor";
2930

30-
export class KotlinVisitor extends BaseVisitor<RawConfig, CodegenConfig> {
31+
export class KotlinVisitor extends BaseVisitor<
32+
RawConfig,
33+
ParsedConfig & CodegenConfig
34+
> {
3135
constructor(
3236
rawConfig: CodegenConfig,
3337
protected _schema: GraphQLSchema,

test/plugin.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { buildSchema } from "graphql";
2-
import { CodegenConfig, plugin } from "../src/plugin";
2+
import { GraphQLKotlinCodegenConfig, plugin } from "../src/plugin";
33
import { describe, expect, it } from "bun:test";
44
import { Types } from "@graphql-codegen/plugin-helpers";
55
import * as glob from "glob";
@@ -9,7 +9,7 @@ function buildUnitTest({
99
config,
1010
}: {
1111
testName: string;
12-
config: CodegenConfig;
12+
config: GraphQLKotlinCodegenConfig;
1313
}) {
1414
it(testName, async () => {
1515
const filePath = `./test/unit/${testName}`;

0 commit comments

Comments
 (0)