Skip to content

Commit a5d099b

Browse files
committed
T-257 Added support for nested fields
1 parent c6356df commit a5d099b

File tree

15 files changed

+12503
-376
lines changed

15 files changed

+12503
-376
lines changed

codegen.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,27 @@ generates:
2020
plugins:
2121
- 'typescript'
2222
- 'typescript-resolvers'
23+
src/generated/fields.ts:
24+
plugins:
25+
- generateFields.js
26+
config:
27+
maxDepth: 3
28+
baseTypes:
29+
- Organization
30+
- Marketplace
31+
- Product
32+
- CampaignTemplate
33+
- User
34+
- Token
35+
- Entitlement
36+
- MediaChannel
37+
- MarketingCampaign
38+
- MarketingAd
39+
- Catalog
40+
- Vendor
41+
- VendorToken
42+
- Result
43+
- CreativeFont
44+
- CreativeImage
45+
- CreativeTemplate
46+
- CreativeLayer

generateFields.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
const { format } = require('prettier');
2+
3+
const getBaseType = type => (type.ofType ? getBaseType(type.ofType) : type);
4+
5+
const generateFields = ({ type, maxDepth }, fields, parents = []) =>
6+
Object.values(fields)
7+
.map(field => {
8+
const nextFields = getBaseType(field.type)._fields;
9+
const value =
10+
parents.map(parent => `${parent} {`).join('') +
11+
field.name +
12+
parents.map(_parent => '}').join('');
13+
14+
if (!nextFields) {
15+
return `${field.name}: ${type ? 'string' : `'${value}'`}`;
16+
}
17+
if (parents.length > maxDepth) {
18+
return;
19+
}
20+
return `${field.name}: {
21+
${generateFields({ type, maxDepth }, nextFields, [
22+
...parents,
23+
field.name,
24+
])}
25+
}`;
26+
})
27+
.filter(Boolean);
28+
29+
module.exports = {
30+
plugin: (schema, _documents, { maxDepth, baseTypes }) => {
31+
const typeMap = schema.getTypeMap();
32+
const final = Object.values(typeMap)
33+
.filter(type => baseTypes.includes(type.name))
34+
.map(
35+
type => `export type ${type.name}Fields = {
36+
${generateFields({ type: true, maxDepth }, type._fields)}
37+
};
38+
export const ${type.name}Fields: ${type.name}Fields = {
39+
${generateFields({ type: false, maxDepth }, type._fields)}
40+
};`,
41+
)
42+
.join('');
43+
44+
return format(final, {
45+
parser: 'typescript',
46+
trailingComma: 'all',
47+
tabWidth: 4,
48+
singleQuote: true,
49+
});
50+
},
51+
};

index.node.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

index.web.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package-lock.json

Lines changed: 0 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
"graphql": "14.5.8",
4545
"prettier": "1.19.1",
4646
"ts-loader": "6.2.1",
47-
"ts-transformer-keys": "0.4.1",
4847
"typescript": "3.7.3",
4948
"webpack": "4.41.2",
5049
"webpack-cli": "3.3.10"

0 commit comments

Comments
 (0)