Skip to content

Commit

Permalink
enable strictNullCheck and improve typings
Browse files Browse the repository at this point in the history
  • Loading branch information
eric-burel committed Mar 16, 2021
1 parent 427ff79 commit a59f953
Show file tree
Hide file tree
Showing 30 changed files with 174 additions and 110 deletions.
9 changes: 7 additions & 2 deletions packages/graphql/extendModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@ const extendModel = (

// compute base properties
const graphqlModel = {
typeName,
multiTypeName,
singleResolverName,
multiResolverName,
...options,
Expand All @@ -67,6 +65,13 @@ const extendModel = (
const defaultFragment = getDefaultFragmentText(extendedModel);
const defaultFragmentName = getDefaultFragmentName(extendedModel);

if (!defaultFragment) {
// TODO: is this a normal scenario?
console.warn(
`Could not generate a default fragment for type ${graphqlModel.typeName}`
);
}

// server-only
const extendedGraphqlModel = {
...graphqlModel,
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/fragments/defaultFragment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ export const getDefaultFragmentText = (
model.graphql.typeName
}`,
options,
}) || null
}) || undefined
);
};

Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/fragments/tests/fragments.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ describe("default fragment generation", () => {
},
});
const fragment = getDefaultFragmentText(model);
expect(fragment).toBeNull(); // resolved field are not yet present in the fragment so it's null
expect(fragment).toBeUndefined(); // resolved field are not yet present in the fragment so it's null
//const normalizedFragment = normalizeGraphQLSchema(fragment);
//expect(normalizedFragment).toMatch('fragment FoosDefaultFragment on Foo { resolvedObject anotherResolvedObject }');
});
Expand Down
7 changes: 4 additions & 3 deletions packages/graphql/intl.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { camelToSpaces } from "@vulcanjs/utils";
import SimpleSchema from "simpl-schema";
import { ValidationError } from "./server/resolvers/validation";

export const defaultLocale = "en"; //getSetting('locale', 'en');

Expand Down Expand Up @@ -43,7 +44,7 @@ export const registerDomain = (locale, domain) => {
Domains[domain] = locale;
};

export const Locales = [];
export const Locales: Array<{ id?: string; required: boolean }> = [];

export const registerLocale = (locale) => {
Locales.push(locale);
Expand Down Expand Up @@ -111,7 +112,7 @@ See https://github.com/aldeed/simple-schema-js#custom-field-validation
*/
export const validateIntlField = function () {
let errors = [];
let errors: Array<ValidationError> = [];

// go through locales to check which one are required
const requiredLocales = Locales.filter((locale) => locale.required);
Expand Down Expand Up @@ -169,7 +170,7 @@ export const getIntlLabel = (
// if this is a description, just add .description at the end of the intl key
const suffix = isDescription ? ".description" : "";

const intlKeys = [];
const intlKeys: Array<string> = [];
if (intlId) {
intlKeys.push(intlId);
}
Expand Down
12 changes: 6 additions & 6 deletions packages/graphql/permissions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class Group {
* @param {Object} user
*/
export const getGroups = (
user: User,
user: User | null,
document?: VulcanDocument
): Array<Group> => {
let userGroups = [
Expand Down Expand Up @@ -135,7 +135,7 @@ const getActions = (user: Users) => {
* @param {String} group or array of groups
*/
export const isMemberOf = (
user: User,
user: User | null,
groupOrGroups: Array<Group> | Group,
document?: VulcanDocument
) => {
Expand Down Expand Up @@ -186,7 +186,7 @@ export const owns = function (user: User | null, document: VulcanDocument) {
* @summary Check if a user is an admin
* @param {Object|string} userOrUserId - The user or their userId
*/
const isAdmin = function (user?: User) {
const isAdmin = function (user: User | null): boolean {
try {
return !!user && !!user.isAdmin;
} catch (e) {
Expand All @@ -204,7 +204,7 @@ const isAdmin = function (user?: User) {
export const canReadField = function (
user: User | null,
field: Pick<VulcanFieldSchema, "canRead">,
document: Object
document?: Object
) {
const canRead = field.canRead;
if (!canRead) {
Expand All @@ -230,7 +230,7 @@ export const canReadField = function (
};

export const getReadableFields = function (
user: User,
user: User | null,
model: VulcanModel,
document?: VulcanDocument
) {
Expand Down Expand Up @@ -288,7 +288,7 @@ export const getDocumentBasedPermissionFieldNames = function (
* @param {Object} fields - The list of fields
*/
export const checkFields = (
user: User,
user: User | null,
model: VulcanModel,
fields: Array<any>
) => {
Expand Down
15 changes: 11 additions & 4 deletions packages/graphql/server/parseAllModels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { VulcanGraphqlModel } from "../typings";
import { mergeResolvers } from "./utils";
import _flatten from "lodash/flatten";
import { generateQueryTypeDefs, generateMutationTypeDefs } from "./typedefs";
import { ModelResolverMap, TopLevelResolverMap } from "./typings";

disableFragmentWarnings();

Expand All @@ -35,11 +36,17 @@ ${generateQueryTypeDefs(queryTypeDefs)}
${generateMutationTypeDefs(mutationTypeDefs)}`;

const resolvers = parsedModels.map((m) => m.resolvers);
const resolvers = parsedModels
.map((m) => m.resolvers)
.filter((r) => !!r) as ModelResolverMap[];
// schema resolvers are a list of map of resolvers, so we need an additional merge step
const schemaResolvers = parsedModels.map((m) =>
mergeResolvers(m.schemaResolvers)
);
const schemaResolvers = parsedModels
.map((model) => model.schemaResolvers)
.filter((sr) => !!sr) // remove undefined values
.map((schemaResolvers) =>
mergeResolvers(schemaResolvers as Partial<TopLevelResolverMap>[])
);

const mergedResolvers = mergeResolvers([...resolvers, ...schemaResolvers]);
return {
typeDefs: mergedTypeDefs,
Expand Down
53 changes: 32 additions & 21 deletions packages/graphql/server/parseModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ const generateTypeDefs = ({
fields,
isNested = false,
}: GenerateSchemaFragmentsInput): Array<string> => {
const schemaFragments = [];
const schemaFragments: Array<string> = [];
const {
mainType,
create,
Expand All @@ -75,7 +75,11 @@ const generateTypeDefs = ({
// enums,
} = fields;

const typeName = model ? model.graphql.typeName : typeNameArgs;
if (!(model?.graphql.typeName || typeNameArgs))
throw new Error(
`model.graphql.typeName is undefined, please provide typeName as arguments in generateTypeDefs`
);
const typeName = model ? model.graphql.typeName : (typeNameArgs as string);

if (!mainType || mainType.length === 0) {
throw new Error(
Expand Down Expand Up @@ -161,11 +165,11 @@ const generateTypeDefs = ({

if (filterable.length) {
// TODO: reneable customFilters?
const customFilters = undefined; //collection.options.customFilters;
const customFilters = []; //collection.options.customFilters;
schemaFragments.push(
fieldFilterInputTemplate({ typeName, fields: filterable, customFilters })
);
if (customFilters) {
if (customFilters?.length) {
customFilters.forEach((filter) => {
schemaFragments.push(customFilterTemplate({ typeName, filter }));
});
Expand Down Expand Up @@ -200,7 +204,7 @@ interface ParseModelOutput
resolvers?: ModelResolverMap;
}
export const parseModel = (model: VulcanGraphqlModel): ParseModelOutput => {
const typeDefs = [];
const typeDefs: Array<string> = [];

// const {
// collectionName,
Expand Down Expand Up @@ -243,32 +247,39 @@ export const parseModel = (model: VulcanGraphqlModel): ParseModelOutput => {
typeDefs.push(
...generateTypeDefs({
typeName: nestedFields.typeName,
fields: nestedFields.fields,
fields: nestedFields.fields as Fields,
isNested: true,
})
);
}
}

// resolvers
const resolvers: ModelResolverMap = {};
let queries;
let mutations;
const queryDefinitions = model.graphql.queryResolvers; // TODO: get from Model?
const mutationDefinitions = model.graphql.mutationResolvers; // TODO: get from Model?
const { queries, queryResolvers } = parseQueryResolvers({
queryResolverDefinitions: queryDefinitions,
typeName,
multiTypeName,
});
const { mutations, mutationResolvers } = parseMutationResolvers({
mutationDefinitions,
typeName,
modelName,
fields,
});
if (queryDefinitions) {
const parsedQueries = parseQueryResolvers({
queryResolverDefinitions: queryDefinitions,
typeName,
multiTypeName,
});
queries = parsedQueries.queries;
resolvers.Query = parsedQueries.queryResolvers;
}
if (mutationDefinitions) {
const parsedMutations = parseMutationResolvers({
mutationDefinitions,
typeName,
modelName,
fields,
});
mutations = parsedMutations.mutations;
resolvers.Mutation = parsedMutations.mutationResolvers;
}

const resolvers = {
Query: queryResolvers,
Mutation: mutationResolvers,
};
const mergedTypeDefs = typeDefs.join("\n\n") + "\n\n\n";

return {
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/server/parseModelResolvers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export const parseQueryResolvers = ({
multiTypeName,
}: CreateResolversInput): ParsedModelQueryResolvers => {
const queryResolvers: QueryResolverMap = {};
const queries: Array<{ description: string; query: string }> = [];
const queries: Array<{ description?: string; query: string }> = [];
if (!queryResolverDefinitions) {
return { queries, queryResolvers };
}
Expand Down
Loading

0 comments on commit a59f953

Please sign in to comment.