Skip to content

Add an option graphQLSchemaPrefix to add constants prefix for each generated GraphQL schema #466

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/openapi-to-graphql/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ Schema options:

- `createSubscriptionsFromCallbacks` (type: `boolean`, default: `false`): Generates subscription fields from [callback objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#CallbackObject). The keys ([runtime expressions](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#runtimeExpression)) of the callback objects will be interpolated as the topic of a publish/subscription connection using [graphql-subscriptions](https://github.com/apollographql/graphql-subscriptions). Read the [doc](./docs/subscriptions.md) for explanations and examples regarding its usage.

- `graphQLSchemaPrefix` (type: `string`, default: `''`): For add a constants prefix for each generated GraphQL schema, i.e. passing `CustomName` for this option, generated `Product` type will be change to `CustomNameProduct`.
***

Resolver options:
Expand Down
16 changes: 11 additions & 5 deletions packages/openapi-to-graphql/src/auth_builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import debug from 'debug'
import { handleWarning, sortObject, MitigationTypes } from './utils'
import { createDataDef } from './preprocessor'
import crossFetch from 'cross-fetch'
import {InternalOptions} from './types/options';

const translationLog = debug('translation')

Expand All @@ -43,7 +44,8 @@ export function createAndLoadViewer<TSource, TContext, TArgs>(
queryFields: object,
operationType: GraphQLOperationType,
data: PreprocessingData<TSource, TContext, TArgs>,
fetch: typeof crossFetch
fetch: typeof crossFetch,
options: InternalOptions<TSource, TContext, TArgs>
): { [key: string]: GraphQLFieldConfig<TSource, TContext, TArgs> } {
const results = {}
/**
Expand Down Expand Up @@ -153,7 +155,8 @@ export function createAndLoadViewer<TSource, TContext, TArgs>(
anyAuthObjectName,
anyAuthFields,
data,
fetch
fetch,
options,
)

return results
Expand Down Expand Up @@ -252,7 +255,8 @@ function getViewerAnyAuthOT<TSource, TContext, TArgs>(
name: string,
queryFields: GraphQLFieldConfigMap<any, any>,
data: PreprocessingData<TSource, TContext, TArgs>,
fetch: typeof crossFetch
fetch: typeof crossFetch,
options: InternalOptions<TSource, TContext, TArgs>
): GraphQLFieldConfig<TSource, TContext, TArgs> {
// Resolve function:
const resolve: GraphQLFieldResolver<TSource, TContext, TArgs> = (
Expand All @@ -277,14 +281,16 @@ function getViewerAnyAuthOT<TSource, TContext, TArgs>(
data.security[protocolName].schema,
true,
data,
data.security[protocolName].oas
data.security[protocolName].oas,
options,
)

const type = getGraphQLType({
def,
data,
isInputObjectType: true,
fetch
fetch,
options
})

const saneProtocolName = Oas3Tools.sanitize(
Expand Down
40 changes: 28 additions & 12 deletions packages/openapi-to-graphql/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,10 @@ const DEFAULT_OPTIONS: InternalOptions<any, any, any> = {
provideErrorExtensions: true,
equivalentToMessages: true,

fetch: crossFetch
fetch: crossFetch,

// Add prefix for each schema generated
graphQLSchemaPrefix: ''
}

/**
Expand Down Expand Up @@ -214,7 +217,9 @@ export function translateOpenAPIToGraphQL<TSource, TContext, TArgs>(
provideErrorExtensions,
equivalentToMessages,

fetch
fetch,

graphQLSchemaPrefix
}: InternalOptions<TSource, TContext, TArgs>
): Result<TSource, TContext, TArgs> {
const options = {
Expand Down Expand Up @@ -256,7 +261,9 @@ export function translateOpenAPIToGraphQL<TSource, TContext, TArgs>(
provideErrorExtensions,
equivalentToMessages,

fetch
fetch,

graphQLSchemaPrefix,
}
translationLog(`Options: ${JSON.stringify(options)}`)

Expand Down Expand Up @@ -383,7 +390,8 @@ export function translateOpenAPIToGraphQL<TSource, TContext, TArgs>(
authQueryFields,
GraphQLOperationType.Query,
data,
fetch
fetch,
options
)
)
}
Expand All @@ -395,7 +403,8 @@ export function translateOpenAPIToGraphQL<TSource, TContext, TArgs>(
authMutationFields,
GraphQLOperationType.Mutation,
data,
fetch
fetch,
options
)
)
}
Expand All @@ -407,7 +416,8 @@ export function translateOpenAPIToGraphQL<TSource, TContext, TArgs>(
authSubscriptionFields,
GraphQLOperationType.Subscription,
data,
fetch
fetch,
options
)
)
}
Expand Down Expand Up @@ -493,7 +503,8 @@ function addQueryFields<TSource, TContext, TArgs>({
requestOptions,
fileUploadOptions,
connectOptions,
fetch
fetch,
options
)

const saneOperationId = Oas3Tools.sanitize(
Expand Down Expand Up @@ -672,7 +683,8 @@ function addMutationFields<TSource, TContext, TArgs>({
requestOptions,
fileUploadOptions,
connectOptions,
fetch
fetch,
options,
)

const saneOperationId = Oas3Tools.sanitize(
Expand Down Expand Up @@ -819,7 +831,8 @@ function addSubscriptionFields<TSource, TContext, TArgs>({
requestOptions,
fileUploadOptions,
connectOptions,
fetch
fetch,
options
)

const saneOperationId = Oas3Tools.sanitize(
Expand Down Expand Up @@ -923,14 +936,16 @@ function getFieldForOperation<TSource, TContext, TArgs>(
requestOptions: Partial<RequestOptions<TSource, TContext, TArgs>>,
fileUploadOptions: FileUploadOptions,
connectOptions: ConnectOptions,
fetch: typeof crossFetch
fetch: typeof crossFetch,
options: InternalOptions<TSource, TContext, TArgs>
): GraphQLFieldConfig<TSource, TContext | SubscriptionContext, TArgs> {
// Create GraphQL Type for response:
const type = getGraphQLType({
def: operation.responseDefinition,
data,
operation,
fetch
fetch,
options
}) as GraphQLOutputType

const payloadSchemaName = operation.payloadDefinition
Expand All @@ -948,7 +963,8 @@ function getFieldForOperation<TSource, TContext, TArgs>(
parameters: operation.parameters,
operation,
data,
fetch
fetch,
options
})

// Get resolver and subscribe function for Subscription fields
Expand Down
50 changes: 37 additions & 13 deletions packages/openapi-to-graphql/src/preprocessor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ function processOperation<TSource, TContext, TArgs>(
payloadSchema as SchemaObject,
true,
data,
oas
oas,
options
)
: undefined

Expand All @@ -132,6 +133,7 @@ function processOperation<TSource, TContext, TArgs>(
false,
data,
oas,
options,
links
)

Expand Down Expand Up @@ -675,6 +677,7 @@ export function createDataDef<TSource, TContext, TArgs>(
isInputObjectType: boolean,
data: PreprocessingData<TSource, TContext, TArgs>,
oas: Oas3,
options: InternalOptions<TSource, TContext, TArgs>,
links?: { [key: string]: LinkObject }
): DataDefinition {
const preferredName = getPreferredName(names)
Expand Down Expand Up @@ -747,14 +750,24 @@ export function createDataDef<TSource, TContext, TArgs>(
return existingDataDef
}

let namesFormSchema: Oas3Tools.SchemaNames = names
// Add the prefix to the name
if (options.graphQLSchemaPrefix) {
namesFormSchema = Object.fromEntries(
Object.entries(names).map(([key, value]) =>
[key, value ? options.graphQLSchemaPrefix + '-' + value : value]
)
)
}

// There is no preexisting data definition, so create a new one

const name = getSchemaName(names, data.usedTypeNames)
const name = getSchemaName(namesFormSchema, data.usedTypeNames)

let saneInputName: string
let saneName: string

if (name === names.fromExtension) {
if (name === namesFormSchema.fromExtension) {
saneName = name
saneInputName = name + 'Input'
} else {
Expand Down Expand Up @@ -828,7 +841,8 @@ export function createDataDef<TSource, TContext, TArgs>(
def.required,
isInputObjectType,
data,
oas
oas,
options
)
} else {
handleWarning({
Expand Down Expand Up @@ -869,7 +883,8 @@ export function createDataDef<TSource, TContext, TArgs>(
itemsSchema as SchemaObject,
isInputObjectType,
data,
oas
oas,
options
)

// Add list item reference
Expand All @@ -893,7 +908,8 @@ export function createDataDef<TSource, TContext, TArgs>(
isInputObjectType,
def,
data,
oas
oas,
options
)
} else {
throw new Error(
Expand All @@ -919,7 +935,8 @@ export function createDataDef<TSource, TContext, TArgs>(
isInputObjectType,
def,
data,
oas
oas,
options
)
} else {
throw new Error(
Expand Down Expand Up @@ -1226,7 +1243,8 @@ function addObjectPropertiesToDataDef<TSource, TContext, TArgs>(
required: string[],
isInputObjectType: boolean,
data: PreprocessingData<TSource, TContext, TArgs>,
oas: Oas3
oas: Oas3,
options: InternalOptions<TSource, TContext, TArgs>
) {
/**
* Resolve all required properties
Expand Down Expand Up @@ -1268,7 +1286,8 @@ function addObjectPropertiesToDataDef<TSource, TContext, TArgs>(
propSchema,
isInputObjectType,
data,
oas
oas,
options
)

// Add field type references
Expand Down Expand Up @@ -1351,7 +1370,8 @@ function createAnyOfObject<TSource, TContext, TArgs>(
isInputObjectType: boolean,
def: DataDefinition,
data: PreprocessingData<TSource, TContext, TArgs>,
oas: Oas3
oas: Oas3,
options: InternalOptions<TSource, TContext, TArgs>
) {
/**
* Used to find incompatible properties
Expand Down Expand Up @@ -1481,7 +1501,8 @@ function createAnyOfObject<TSource, TContext, TArgs>(
def.required,
isInputObjectType,
data,
oas
oas,
options
)
}

Expand All @@ -1503,7 +1524,8 @@ function createAnyOfObject<TSource, TContext, TArgs>(
propertySchema,
isInputObjectType,
data,
oas
oas,
options,
)

/**
Expand Down Expand Up @@ -1540,7 +1562,8 @@ function createOneOfUnion<TSource, TContext, TArgs>(
isInputObjectType: boolean,
def: DataDefinition,
data: PreprocessingData<TSource, TContext, TArgs>,
oas: Oas3
oas: Oas3,
options: InternalOptions<TSource, TContext, TArgs>
) {
if (isInputObjectType) {
handleWarning({
Expand Down Expand Up @@ -1584,6 +1607,7 @@ function createOneOfUnion<TSource, TContext, TArgs>(
isInputObjectType,
data,
oas,
options,
def.links
)
;(def.subDefinitions as DataDefinition[]).push(subDefinition)
Expand Down
Loading