Skip to content

Commit 7502673

Browse files
authored
fix: schema added support for cases where schemas name contains '.' (#57)
1 parent 1444e71 commit 7502673

File tree

9 files changed

+6466
-8
lines changed

9 files changed

+6466
-8
lines changed

scripts/testCodeGen.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ const main = () => {
113113
});
114114
generateTypedefWithTemplateCode("test/infer.domain/index.yml", "test/code/typedef-with-template/infer.domain.ts", false, { sync: false });
115115

116+
generateTypedefWithTemplateCode("test/argo-rollout/index.json", "test/code/typedef-with-template/argo-rollout.ts", false, {
117+
sync: false,
118+
});
119+
116120
generateSplitCode("test/api.test.domain/index.yml", "test/code/split");
117121

118122
generateParameter("test/api.test.domain/index.yml", "test/code/parameter/api.test.domain.json");

src/internal/OpenApiTools/ConverterContext.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ export interface Types {
1616
* import/exportなどの予約語も裁く
1717
*/
1818
escapeDeclarationText: (text: string) => string;
19+
/**
20+
* Schemas.A.B.Cに対するEscape
21+
*/
22+
escapeReferenceDeclarationText: (text: string) => string;
1923
/**
2024
* 非破壊: PropertySignatureのname用のescape
2125
*/
@@ -54,6 +58,11 @@ export const create = (): Types => {
5458
return convertString(operationId);
5559
},
5660
escapeDeclarationText: (text: string) => {
61+
// console.log(`escapeDeclarationText: ${text}` + `-> ${convertReservedWord(convertString(text).replace(/\./g, "$"))}`.padStart(100, " "));
62+
return convertReservedWord(convertString(text).replace(/\./g, "$"));
63+
},
64+
escapeReferenceDeclarationText: (text: string) => {
65+
// console.log(`escapeDeclarationText3: ${text}` + `-> ${convertReservedWord(convertString(text))}`.padStart(100, " "));
5766
return convertReservedWord(convertString(text));
5867
},
5968
escapePropertySignatureName: (text: string) => {

src/internal/OpenApiTools/TypeNodeContext.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const generatePath = (entryPoint: string, currentPoint: string, referencePath: s
2525
};
2626
};
2727

28-
const calculateReferencePath = (store: Walker.Store, base: string, pathArray: string[]): ToTypeNode.ResolveReferencePath => {
28+
const calculateReferencePath = (store: Walker.Store, base: string, pathArray: string[], converterContext: ConverterContext.Types,): ToTypeNode.ResolveReferencePath => {
2929
let names: string[] = [];
3030
let unresolvedPaths: string[] = [];
3131
pathArray.reduce((previous, lastPath, index) => {
@@ -67,8 +67,8 @@ const calculateReferencePath = (store: Walker.Store, base: string, pathArray: st
6767
throw new DevelopmentError("Local Reference Error \n" + JSON.stringify({ pathArray, names, base }, null, 2));
6868
}
6969
return {
70-
name: names.join("."),
71-
maybeResolvedName: names.concat(unresolvedPaths).join("."),
70+
name: names.map(converterContext.escapeDeclarationText).join("."),
71+
maybeResolvedName: names.concat(unresolvedPaths).map(converterContext.escapeDeclarationText).join("."),
7272
unresolvedPaths,
7373
};
7474
};
@@ -81,7 +81,7 @@ export const create = (
8181
): ToTypeNode.Context => {
8282
const resolveReferencePath: ToTypeNode.Context["resolveReferencePath"] = (currentPoint, referencePath) => {
8383
const { pathArray, base } = generatePath(entryPoint, currentPoint, referencePath);
84-
return calculateReferencePath(store, base, pathArray);
84+
return calculateReferencePath(store, base, pathArray, converterContext);
8585
};
8686
const setReferenceHandler: ToTypeNode.Context["setReferenceHandler"] = (currentPoint, reference) => {
8787
if (store.hasStatement(reference.path, ["interface", "typeAlias"])) {

src/internal/OpenApiTools/Walker/Store.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class Store {
5050
});
5151
}
5252
public getRootStatements(): ts.Statement[] {
53-
// fs.writeFileSync("debug/tree.json", JSON.stringify(operator.getHierarchy(), null, 2), { encoding: "utf-8" });
53+
// Debug Point: 抽象的なデータ構造全体を把握するために出力すると良い
54+
// fs.writeFileSync("debug/tree.json", JSON.stringify(this.operator.getHierarchy(), null, 2), { encoding: "utf-8" });
5455
const statements = Def.componentNames.reduce<ts.Statement[]>((statements, componentName) => {
5556
const treeOfNamespace = this.getChildByPaths(componentName, "namespace");
5657
if (treeOfNamespace) {
@@ -78,6 +79,14 @@ class Store {
7879
throw new UnSupportError(`componentsから始まっていません。path=${path}`);
7980
}
8081
const targetPath = Path.posix.relative("components", path);
82+
// すでにinterfaceとして登録がある場合はスキップ
83+
if (this.hasStatement(targetPath, ["interface"])) {
84+
return;
85+
}
86+
// もしTypeAlias同じスコープに登録されている場合、既存のTypeAliasを削除する
87+
if (this.hasStatement(targetPath, ["typeAlias"])) {
88+
this.operator.remove(targetPath, "typeAlias");
89+
}
8190
this.operator.set(targetPath, Structure.createInstance(statement));
8291
}
8392
public getStatement<T extends Structure.DataStructure.Kind>(path: string, kind: T): Structure.DataStructure.GetChild<T> | undefined {

src/internal/OpenApiTools/components/Schemas.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export const generateNamespace = (
5353
export: true,
5454
name: convertContext.escapeDeclarationText(name),
5555
type: factory.TypeReferenceNode.create({
56-
name: convertContext.escapeDeclarationText(maybeResolvedName),
56+
name: convertContext.escapeReferenceDeclarationText(maybeResolvedName),
5757
}),
5858
}),
5959
});
@@ -81,7 +81,7 @@ export const generateNamespace = (
8181
name: convertContext.escapeDeclarationText(name),
8282
comment: reference.data.description,
8383
type: factory.TypeReferenceNode.create({
84-
name: convertContext.escapeDeclarationText(context.resolveReferencePath(currentPoint, reference.path).name),
84+
name: convertContext.escapeReferenceDeclarationText(context.resolveReferencePath(currentPoint, reference.path).name),
8585
}),
8686
}),
8787
});

src/internal/OpenApiTools/toTypeNode.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ export const convert: Convert = (
9797
// Type Aliasを作成 (or すでにある場合は作成しない)
9898
context.setReferenceHandler(currentPoint, reference);
9999
const { maybeResolvedName } = context.resolveReferencePath(currentPoint, reference.path);
100-
return factory.TypeReferenceNode.create({ name: converterContext.escapeDeclarationText(maybeResolvedName) });
100+
return factory.TypeReferenceNode.create({ name: converterContext.escapeReferenceDeclarationText(maybeResolvedName) });
101101
}
102102
// サポートしているディレクトリに対して存在する場合
103103
if (reference.componentName) {

0 commit comments

Comments
 (0)