Skip to content
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
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ We use `@fake` directive to let you specify how to fake data. And if 60+ fakers
pets: [Pet] @listLength(min: 1, max: 10)
}

The `@override` directive can also be used to specify that an existing field should be overriden:

extend type Post {
acticle: String! @override @fake(type: lorem, options: { loremSize: paragraphs })
}

No need to remember or read any docs. Autocompletion is included!

## Features
Expand Down
60 changes: 60 additions & 0 deletions src/fake_definition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
isObjectType,
isInterfaceType,
ValuesOfCorrectTypeRule,
DefinitionNode,
} from 'graphql';

// FIXME
Expand Down Expand Up @@ -220,6 +221,8 @@ const fakeDefinitionAST = parse(/* GraphQL */ `

scalar examples__JSON
directive @examples(values: [examples__JSON]!) on FIELD_DEFINITION | SCALAR

directive @override on FIELD_DEFINITION
`);

function defToName(defNode) {
Expand Down Expand Up @@ -256,6 +259,14 @@ export function buildWithFakeDefinitions(
}),
};

if (extensionSDL != null) {
// Remove fields marked with the @override annotation
filteredAST.definitions = filterFields(
filteredAST.definitions,
findFieldsWithOverrideDirective(extensionSDL),
);
}

let schema = extendSchemaWithAST(schemaWithOnlyFakedDefinitions, filteredAST);

const config = schema.toConfig();
Expand Down Expand Up @@ -311,6 +322,55 @@ export function buildWithFakeDefinitions(
commentDescriptions: true,
});
}

function findFieldsWithOverrideDirective(
extensionSDL: Source,
): Map<string, string[]> {
const res = new Map();
parseSDL(extensionSDL).definitions.map((d) => {
if (d.kind !== 'ObjectTypeExtension' || d.fields === undefined) {
return;
}

const filteredFields = d.fields
.filter(
(f) =>
f.directives?.findIndex((d) => d.name.value === 'override') !== -1,
)
.map((f) => f.name.value);

if (filteredFields.length > 0) {
res.set(d.name.value, filteredFields);
}
});

return res;
}

function filterFields(
definitions: DefinitionNode[],
fieldsToRemove: Map<string, string[]>,
): DefinitionNode[] {
return definitions.map((d) => {
if (
d.kind === 'ObjectTypeDefinition' &&
d.fields !== undefined &&
fieldsToRemove.has(d.name.value)
) {
const toRemove = fieldsToRemove.get(d.name.value);
const filteredFields = d.fields.filter(
(f) => toRemove!.indexOf(f.name.value) === -1,
);

return {
...d,
fields: filteredFields,
};
}

return d;
});
}
}

// FIXME: move to 'graphql-js'
Expand Down