Skip to content

Commit 639a2e3

Browse files
authored
add relaxed type detection support for function return types (#74)
Completes [ENT-157](https://linear.app/hasura/issue/ENT-157/add-relaxed-types-support-for-function-return-types) This PR adds support for automatically detecting whether the return type of a function has ambiguous types and therefore requires the `@allowrelaxedtypes` annotation (which is also added automatically). The main changes for this PR are in [this commit](bfa7117). The remaining changes are all updates to tests
1 parent 0c5ad9e commit 639a2e3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+14104
-21262
lines changed

src/app/generator/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import * as logger from "../../util/logger";
77
import * as schemaParser from "../parser/open-api/schema-parser";
88
import * as routeTypes from "../parser/open-api/route-types";
99
import * as paramGenerator from "./param-generator";
10+
import * as paramTypes from "../parser/open-api/param-types";
11+
12+
const cj = require("circular-json");
1013

1114
export async function generateCode(
1215
args: types.GenerateCodeInput,
@@ -27,10 +30,15 @@ export async function generateCode(
2730
const routeComponentsArray: functionsTsGenerator.RouteComponents[] = [];
2831

2932
for (let route of apiTsCode.routes) {
33+
// get the return type schema
34+
const returnTypeSchema = routeTypes.getResponseSchema(route);
35+
// check if the return type schema requires relaxed type tag
36+
paramTypes.isRelaxedTypeTagRequiredForSchema(returnTypeSchema, parsedSchemaStore);
37+
3038
const routeComponents: functionsTsGenerator.RouteComponents = {
3139
route: route,
3240
params: routeTypes.getAllParamsRendered(route, parsedSchemaStore),
33-
returnType: routeTypes.getResponseSchema(route),
41+
returnType: returnTypeSchema,
3442
};
3543

3644
routeComponentsArray.push(routeComponents);

src/app/generator/param-generator.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export function renderObjectTypeSchema(
127127
}
128128
const paramType = `{ ${renderedProperties.join(" ")} }`;
129129
schema._$requiresRelaxedTypeTag =
130-
types.isRelaxedTypeTagRequiredForObjectTypeSchema(schema);
130+
types.isRelaxedTypeTagRequiredForObjectTypeSchemaShallow(schema);
131131
return renderSchema(paramType, schema);
132132
}
133133

@@ -139,7 +139,7 @@ export function renderArrayTypeSchema(
139139
const renderedProperty = renderParams(childSchema, schemaStore)._$rendered!;
140140
const paramType = `(${renderedProperty})[]`;
141141
schema._$requiresRelaxedTypeTag =
142-
types.isRelaxedTypeTagRequiredForArrayTypeSchema(schema);
142+
types.isRelaxedTypeTagRequiredForArrayTypeSchemaShallow(schema);
143143
return renderSchema(paramType, schema);
144144
}
145145

src/app/generator/test-data/param-generator/golden-files/1password.json

Lines changed: 18 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,8 @@
2222
"requiresRelaxedTypeAnnotation": true
2323
},
2424
".__no_name.__no_name": {
25-
"rendered": "__undefined",
26-
"requiresRelaxedTypeAnnotation": false
27-
},
28-
".__no_name.__no_name.__no_name": {
29-
"rendered": "__undefined",
30-
"requiresRelaxedTypeAnnotation": false
25+
"rendered": "APIRequest",
26+
"requiresRelaxedTypeAnnotation": true
3127
}
3228
}
3329
},
@@ -37,19 +33,23 @@
3733
"path": {},
3834
"response": {
3935
".__no_name": {
40-
"rendered": "{\n dependencies?: (ServiceDependency)[],\n name: string,\n /** The Connect server's version */\n version: string,\n\n}",
36+
"rendered": "{ dependencies?: (ServiceDependency)[], name?: string, \n/** The Connect server's version */\n version?: string, }",
4137
"requiresRelaxedTypeAnnotation": false
4238
},
43-
".__no_name.__no_name": {
44-
"rendered": "__undefined",
39+
".__no_name.dependencies": {
40+
"rendered": " dependencies?: (ServiceDependency)[],",
4541
"requiresRelaxedTypeAnnotation": false
4642
},
47-
".__no_name.__no_name.__no_name": {
48-
"rendered": "__undefined",
43+
".__no_name.dependencies.__no_name": {
44+
"rendered": "ServiceDependency",
4945
"requiresRelaxedTypeAnnotation": false
5046
},
51-
".__no_name.__no_name.__no_name.__no_name": {
52-
"rendered": "__undefined",
47+
".__no_name.name": {
48+
"rendered": " name?: string,",
49+
"requiresRelaxedTypeAnnotation": false
50+
},
51+
".__no_name.version": {
52+
"rendered": "\n/** The Connect server's version */\n version?: string,",
5353
"requiresRelaxedTypeAnnotation": false
5454
}
5555
}
@@ -62,10 +62,6 @@
6262
".__no_name": {
6363
"rendered": "string",
6464
"requiresRelaxedTypeAnnotation": false
65-
},
66-
".__no_name.__no_name": {
67-
"rendered": "__undefined",
68-
"requiresRelaxedTypeAnnotation": false
6965
}
7066
}
7167
},
@@ -77,10 +73,6 @@
7773
".__no_name": {
7874
"rendered": "string",
7975
"requiresRelaxedTypeAnnotation": false
80-
},
81-
".__no_name.__no_name": {
82-
"rendered": "__undefined",
83-
"requiresRelaxedTypeAnnotation": false
8476
}
8577
}
8678
},
@@ -103,12 +95,8 @@
10395
"requiresRelaxedTypeAnnotation": true
10496
},
10597
".__no_name.__no_name": {
106-
"rendered": "__undefined",
107-
"requiresRelaxedTypeAnnotation": false
108-
},
109-
".__no_name.__no_name.__no_name": {
110-
"rendered": "__undefined",
111-
"requiresRelaxedTypeAnnotation": false
98+
"rendered": "Vault",
99+
"requiresRelaxedTypeAnnotation": true
112100
}
113101
}
114102
},
@@ -125,10 +113,6 @@
125113
".__no_name": {
126114
"rendered": "Vault",
127115
"requiresRelaxedTypeAnnotation": true
128-
},
129-
".__no_name.__no_name": {
130-
"rendered": "__undefined",
131-
"requiresRelaxedTypeAnnotation": false
132116
}
133117
}
134118
},
@@ -156,12 +140,8 @@
156140
"requiresRelaxedTypeAnnotation": true
157141
},
158142
".__no_name.__no_name": {
159-
"rendered": "__undefined",
160-
"requiresRelaxedTypeAnnotation": false
161-
},
162-
".__no_name.__no_name.__no_name": {
163-
"rendered": "__undefined",
164-
"requiresRelaxedTypeAnnotation": false
143+
"rendered": "Item",
144+
"requiresRelaxedTypeAnnotation": true
165145
}
166146
}
167147
},
@@ -187,10 +167,6 @@
187167
".__no_name": {
188168
"rendered": "FullItem",
189169
"requiresRelaxedTypeAnnotation": true
190-
},
191-
".__no_name.__no_name": {
192-
"rendered": "__undefined",
193-
"requiresRelaxedTypeAnnotation": false
194170
}
195171
}
196172
},
@@ -235,10 +211,6 @@
235211
".__no_name": {
236212
"rendered": "FullItem",
237213
"requiresRelaxedTypeAnnotation": true
238-
},
239-
".__no_name.__no_name": {
240-
"rendered": "__undefined",
241-
"requiresRelaxedTypeAnnotation": false
242214
}
243215
}
244216
},
@@ -268,10 +240,6 @@
268240
".__no_name": {
269241
"rendered": "FullItem",
270242
"requiresRelaxedTypeAnnotation": true
271-
},
272-
".__no_name.__no_name": {
273-
"rendered": "__undefined",
274-
"requiresRelaxedTypeAnnotation": false
275243
}
276244
}
277245
},
@@ -301,10 +269,6 @@
301269
".__no_name": {
302270
"rendered": "FullItem",
303271
"requiresRelaxedTypeAnnotation": true
304-
},
305-
".__no_name.__no_name": {
306-
"rendered": "__undefined",
307-
"requiresRelaxedTypeAnnotation": false
308272
}
309273
}
310274
},
@@ -336,11 +300,7 @@
336300
"requiresRelaxedTypeAnnotation": false
337301
},
338302
".__no_name.__no_name": {
339-
"rendered": "__undefined",
340-
"requiresRelaxedTypeAnnotation": false
341-
},
342-
".__no_name.__no_name.__no_name": {
343-
"rendered": "__undefined",
303+
"rendered": "File",
344304
"requiresRelaxedTypeAnnotation": false
345305
}
346306
}
@@ -375,10 +335,6 @@
375335
".__no_name": {
376336
"rendered": "File",
377337
"requiresRelaxedTypeAnnotation": false
378-
},
379-
".__no_name.__no_name": {
380-
"rendered": "__undefined",
381-
"requiresRelaxedTypeAnnotation": false
382338
}
383339
}
384340
},

src/app/generator/test-data/param-generator/golden-files/adobe.json

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -759,10 +759,6 @@
759759
".__no_name": {
760760
"rendered": "InstallStatus",
761761
"requiresRelaxedTypeAnnotation": false
762-
},
763-
".__no_name.__no_name": {
764-
"rendered": "__undefined",
765-
"requiresRelaxedTypeAnnotation": false
766762
}
767763
}
768764
},
@@ -928,10 +924,6 @@
928924
".__no_name": {
929925
"rendered": "string",
930926
"requiresRelaxedTypeAnnotation": false
931-
},
932-
".__no_name.__no_name": {
933-
"rendered": "__undefined",
934-
"requiresRelaxedTypeAnnotation": false
935927
}
936928
}
937929
},
@@ -1520,10 +1512,6 @@
15201512
".__no_name": {
15211513
"rendered": "TruststoreInfo",
15221514
"requiresRelaxedTypeAnnotation": false
1523-
},
1524-
".__no_name.__no_name": {
1525-
"rendered": "__undefined",
1526-
"requiresRelaxedTypeAnnotation": false
15271515
}
15281516
}
15291517
},
@@ -1605,10 +1593,6 @@
16051593
".__no_name": {
16061594
"rendered": "BundleInfo",
16071595
"requiresRelaxedTypeAnnotation": false
1608-
},
1609-
".__no_name.__no_name": {
1610-
"rendered": "__undefined",
1611-
"requiresRelaxedTypeAnnotation": false
16121596
}
16131597
}
16141598
},
@@ -1776,10 +1760,6 @@
17761760
".__no_name": {
17771761
"rendered": "SamlConfigurationInfo",
17781762
"requiresRelaxedTypeAnnotation": false
1779-
},
1780-
".__no_name.__no_name": {
1781-
"rendered": "__undefined",
1782-
"requiresRelaxedTypeAnnotation": false
17831763
}
17841764
}
17851765
},
@@ -1921,10 +1901,6 @@
19211901
".__no_name": {
19221902
"rendered": "KeystoreInfo",
19231903
"requiresRelaxedTypeAnnotation": false
1924-
},
1925-
".__no_name.__no_name": {
1926-
"rendered": "__undefined",
1927-
"requiresRelaxedTypeAnnotation": false
19281904
}
19291905
}
19301906
},
@@ -1945,10 +1921,6 @@
19451921
".__no_name": {
19461922
"rendered": "KeystoreInfo",
19471923
"requiresRelaxedTypeAnnotation": false
1948-
},
1949-
".__no_name.__no_name": {
1950-
"rendered": "__undefined",
1951-
"requiresRelaxedTypeAnnotation": false
19521924
}
19531925
}
19541926
},

0 commit comments

Comments
 (0)