feat: Application types generation from project GQL schema's (#8995)

This commit is contained in:
Adrien de Peretti
2024-09-06 11:45:32 +02:00
committed by GitHub
parent ac30a989f4
commit 2c5e72d141
92 changed files with 5129 additions and 443 deletions

View File

@@ -51,7 +51,7 @@ export function defineJoinerConfig(
alias?: JoinerServiceConfigAlias[]
schema?: string
models?: DmlEntity<any, any>[] | { name: string }[]
linkableKeys?: Record<string, string>
linkableKeys?: ModuleJoinerConfig["linkableKeys"]
primaryKeys?: string[]
} = {}
): Omit<
@@ -151,18 +151,19 @@ export function defineJoinerConfig(
schema = toGraphQLSchema([...modelDefinitions.values()])
}
if (!linkableKeys) {
const linkableKeysFromDml = buildLinkableKeysFromDmlObjects([
...modelDefinitions.values(),
])
const linkableKeysFromMikroOrm = buildLinkableKeysFromMikroOrmObjects([
...mikroOrmObjects.values(),
])
linkableKeys = {
...linkableKeysFromDml,
...linkableKeysFromMikroOrm,
}
const linkableKeysFromDml = buildLinkableKeysFromDmlObjects([
...modelDefinitions.values(),
])
const linkableKeysFromMikroOrm = buildLinkableKeysFromMikroOrmObjects([
...mikroOrmObjects.values(),
])
const mergedLinkableKeys = {
...linkableKeysFromDml,
...linkableKeysFromMikroOrm,
...linkableKeys,
}
linkableKeys = mergedLinkableKeys
if (!primaryKeys && modelDefinitions.size) {
const linkConfig = buildLinkConfigFromModelObjects(
@@ -370,6 +371,7 @@ export function buildLinkConfigFromModelObjects<
const linkableKeyName =
parsedProperty.dataType.options?.linkable ??
`${camelToSnakeCase(model.name).toLowerCase()}_${property}`
modelLinkConfig[property] = {
linkable: linkableKeyName,
primaryKey: property,
@@ -397,21 +399,24 @@ export function buildLinkConfigFromLinkableKeys<
for (const [linkable, modelName] of Object.entries(linkableKeys)) {
const kebabCasedModelName = camelToSnakeCase(toCamelCase(modelName))
const inferredReferenceProperty = linkable.replace(
`${kebabCasedModelName}_`,
""
)
const keyName = lowerCaseFirst(modelName)
const config = {
linkable: linkable,
primaryKey: inferredReferenceProperty,
serviceName,
field: lowerCaseFirst(modelName),
field: keyName,
}
linkConfig[lowerCaseFirst(modelName)] = {
[inferredReferenceProperty]: config,
linkConfig[keyName] ??= {
toJSON: () => config,
}
linkConfig[keyName][inferredReferenceProperty] = config
}
return linkConfig as Record<string, any>
@@ -432,6 +437,5 @@ export function buildModelsNameToLinkableKeysMap(
valueFrom: key.split("_").pop()!,
})
})
return entityLinkableKeysMap
}

View File

@@ -35,12 +35,12 @@ export function Module<
} {
const modelObjects = service[MedusaServiceModelObjectsSymbol] ?? {}
const defaultJoinerConfig = defineJoinerConfig(serviceName, {
models: Object.keys(modelObjects).length
? Object.values(modelObjects)
: undefined,
})
service.prototype.__joinerConfig ??= () => defaultJoinerConfig
service.prototype.__joinerConfig ??= () =>
defineJoinerConfig(serviceName, {
models: Object.keys(modelObjects).length
? Object.values(modelObjects)
: undefined,
})
let linkable = {} as Linkable