diff --git a/.vscode/settings.json b/.vscode/settings.json index 6e086df..c9eb258 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,7 +7,7 @@ "javascript.validate.enable": false, "workbench.editor.enablePreview": false, "workbench.editor.enablePreviewFromQuickOpen": false, - "workbench.editor.showTabs": true, + "workbench.editor.showTabs": "multiple", "typescript.surveys.enabled": false, "editor.quickSuggestions": { "other": true, @@ -33,8 +33,8 @@ "editor.formatOnSave": true }, "editor.codeActionsOnSave": { - "source.fixAll.tslint": true, - "source.fixAll.eslint": true + "source.fixAll.tslint": "explicit", + "source.fixAll.eslint": "explicit" }, "eslint.validate": [ "javascript", diff --git a/lib/root/subscriptions.js b/lib/root/subscriptions.js index b567588..5abd449 100644 --- a/lib/root/subscriptions.js +++ b/lib/root/subscriptions.js @@ -23,15 +23,17 @@ function generateSubscriptions(graphqlSchemaDeclaration, types, pubSubInstance) // ex: name = "userUpdated" var name_1 = "".concat(modelName).concat(capitalizeFirstLetter(action), "d"); var configuration = declaration[action]; + var subscriptionFunction = function () { return true; }; + if (typeof configuration !== 'undefined' && + Object.prototype.hasOwnProperty.call(configuration, 'subscriptionFilter')) { + subscriptionFunction = configuration.subscriptionFilter; + } subscriptions[name_1] = { type: outputType, args: { id: { type: graphql_1.GraphQLInt } }, - subscribe: (0, graphql_subscriptions_1.withFilter)(function () { return pubSubInstance.asyncIterator(name_1); }, typeof configuration !== 'undefined' && - configuration.subscriptionFilter - ? configuration.subscriptionFilter - : function () { return true; }) + subscribe: (0, graphql_subscriptions_1.withFilter)(function () { return pubSubInstance.asyncIterator(name_1); }, subscriptionFunction) }; } }); diff --git a/src/associations/field.ts b/src/associations/field.ts index 92b2744..d776893 100644 --- a/src/associations/field.ts +++ b/src/associations/field.ts @@ -1,11 +1,10 @@ import { + GraphQLInt, GraphQLList, - GraphQLType, GraphQLScalarType, GraphQLString, - GraphQLInt, + GraphQLType, } from 'graphql' -import { GraphQLField } from 'graphql/type' import { Association } from 'sequelize/types' import { injectAssociations } from '..' import { OutputTypes } from '../../types' diff --git a/src/root/query.ts b/src/root/query.ts index ac12fe3..4613df3 100644 --- a/src/root/query.ts +++ b/src/root/query.ts @@ -1,4 +1,4 @@ -import { GraphQLObjectType, GraphQLInt, GraphQLFieldConfig } from 'graphql' +import { GraphQLFieldConfig, GraphQLInt, GraphQLObjectType } from 'graphql' import { defaultArgs, defaultListArgs } from 'graphql-sequelize' import { GlobalPreCallback, diff --git a/src/root/subscriptions.ts b/src/root/subscriptions.ts index 4c62288..17c7235 100644 --- a/src/root/subscriptions.ts +++ b/src/root/subscriptions.ts @@ -1,6 +1,12 @@ import { GraphQLInt, GraphQLObjectType } from 'graphql' import { PubSub, withFilter } from 'graphql-subscriptions' -import { GraphqlSchemaDeclarationType, EventList } from '../../types' +import { + CreateFieldDeclarationType, + DeleteFieldDeclarationType, + EventList, + GraphqlSchemaDeclarationType, + UpdateFieldDeclarationType, +} from '../../types' import { isGraphqlFieldDeclaration } from '../isGraphqlFieldDeclaration' const availableActions: EventList = ['create', 'update', 'delete'] @@ -34,6 +40,24 @@ export default function generateSubscriptions( // ex: name = "userUpdated" const name = `${modelName}${capitalizeFirstLetter(action)}d` const configuration = declaration[action] + + let subscriptionFunction: any = () => true + + if ( + typeof configuration !== 'undefined' && + Object.prototype.hasOwnProperty.call( + configuration, + 'subscriptionFilter' + ) + ) { + subscriptionFunction = ( + configuration as + | CreateFieldDeclarationType + | DeleteFieldDeclarationType + | UpdateFieldDeclarationType + ).subscriptionFilter + } + subscriptions[name] = { type: outputType, args: { @@ -41,10 +65,7 @@ export default function generateSubscriptions( }, subscribe: withFilter( () => pubSubInstance.asyncIterator(name), - typeof configuration !== 'undefined' && - configuration.subscriptionFilter - ? configuration.subscriptionFilter - : () => true + subscriptionFunction ), } } diff --git a/src/tests/schema.js b/src/tests/schema.js index 1ddfc8a..4c89e7c 100644 --- a/src/tests/schema.js +++ b/src/tests/schema.js @@ -12,9 +12,8 @@ const { } = require('graphql') const { PubSub } = require('graphql-subscriptions') const { resolver, defaultListArgs } = require('graphql-sequelize') -const { createContext, EXPECTED_OPTIONS_KEY } = require('dataloader-sequelize') +const { EXPECTED_OPTIONS_KEY } = require('dataloader-sequelize') const { WebSocketServer } = require('ws') -const { useServer } = require('graphql-ws/lib/use/ws') const { Op } = require('sequelize') const { diff --git a/types.d.ts b/types.d.ts index 53ce0ca..3bc020a 100644 --- a/types.d.ts +++ b/types.d.ts @@ -1,20 +1,20 @@ import { - Model, - Sequelize, - BuildOptions, - FindOptions, - Association, -} from 'sequelize/types' -import { - GraphQLScalarType, - GraphQLNonNull, - GraphQLObjectType, - GraphQLInputObjectType, - GraphQLType, GraphQLFieldConfig, GraphQLFieldResolver, + GraphQLInputObjectType, GraphQLList, + GraphQLNonNull, + GraphQLObjectType, + GraphQLScalarType, + GraphQLType, } from 'graphql' +import { + Association, + BuildOptions, + FindOptions, + Model, + Sequelize, +} from 'sequelize/types' export type Action = 'list' | 'create' | 'delete' | 'update' | 'count' export type ActionList = Array @@ -152,6 +152,27 @@ export type GraphqlSchemaDeclarationType = { [key: string]: ModelDeclarationType | GraphQLFieldConfig } +export type CreateFieldDeclarationType = { + extraArg?: ExtraArg + before?: MutationBeforeHook + after?: CreateAfterHook + subscriptionFilter?: SubscriptionFilterHook + preventDuplicateOnAttributes?: string[] +} + +export type UpdateFieldDeclarationType = { + extraArg?: ExtraArg + before?: MutationBeforeHook + after?: UpdateAfterHook + subscriptionFilter?: SubscriptionFilterHook +} + +export type DeleteFieldDeclarationType = { + before?: DeleteBeforeHook + after?: DeleteAfterHook + subscriptionFilter?: SubscriptionFilterHook +} + export type ModelDeclarationType = { model: SequelizeModel actions?: ActionList @@ -168,29 +189,20 @@ export type ModelDeclarationType = { after?: ListAfterHook resolver?: GraphQLFieldResolver } - create?: { - extraArg?: ExtraArg - before?: MutationBeforeHook - after?: CreateAfterHook - subscriptionFilter?: SubscriptionFilterHook - preventDuplicateOnAttributes?: string[] - } - update?: { - extraArg?: ExtraArg - before?: MutationBeforeHook - after?: UpdateAfterHook - subscriptionFilter?: SubscriptionFilterHook - } - delete?: { - before?: DeleteBeforeHook - after?: DeleteAfterHook - subscriptionFilter?: SubscriptionFilterHook - } count?: { extraArg?: ExtraArg before?: QueryBeforeHook resolver?: GraphQLFieldResolver } + create?: + | CreateFieldDeclarationType + | GraphQLFieldConfig + update?: + | UpdateFieldDeclarationType + | GraphQLFieldConfig + delete?: + | DeleteFieldDeclarationType + | GraphQLFieldConfig } export type SequelizeModels = { [key: string]: SequelizeModel } & {