I am trying to write a regex in an effort to refactor some end-to-end tests on a GraphQL API.
Here are some example of what I'd like to capture:
query SignIn($payload: AuthCredentialsInput!) {
signIn(payload: $payload) {
token
}
}
Should retrieve signIn
mutation SendConfirmationEmail($athleteId: ID!) {
sendConfirmationEmail(athleteId: $athleteId) {
id
}
}
Should retrieve sendConfirmationEmail
mutation CreateProgram($title: String!) {
createProgram(title: $title) {
id
title
}
}
Should retrieve createProgram
query GetAllExerciseTemplates {
getAllExerciseTemplates {
id
title
}
}
Should retrieve getAllExerciseTemplates
At the moment I need to pass those key by hand for every end-to-end test.
My best attempt is this regex: .+?\{+[ \r\n\t\f\v ](.+)\(
const regexTest = query.query.match(/.+?\{+[ \r\n\t\f\v ](.+)\(/)
console.warn(regexTest)
But the result is this:
console.warn
[
'mutation CreateProgram($title: String!) {\n createProgram(',
' createProgram',
index: 0,
input: 'mutation CreateProgram($title: String!) {\n' +
' createProgram(title: $title) {\n' +
' id\n' +
' title\n' +
' }\n' +
' }',
groups: undefined
]
Any regex expert that can solve it here?
EDIT : Here is the best shot I did, yet it could be great if I could have only one regex instead of two
function getDataKey(query: Query) {
const keyBeforeFirstParenthesis = /.+?{[\r\n\t\f\v ]+(.+)\(/
const keyBeforeFirstBracket = /.+?{[\r\n\t\f\v ]+(.+) {/
let regExpMatchArray
regExpMatchArray = query.query.match(keyBeforeFirstParenthesis)
if (!regExpMatchArray)
regExpMatchArray = query.query.match(keyBeforeFirstBracket)
return regExpMatchArray[1]
}