diff --git a/packages/test-e2e-composable-vue3/package.json b/packages/test-e2e-composable-vue3/package.json index 0fe95cd..e326156 100644 --- a/packages/test-e2e-composable-vue3/package.json +++ b/packages/test-e2e-composable-vue3/package.json @@ -10,33 +10,25 @@ "test:e2e:client": "vue-cli-service test:e2e --mode production --headless", "test:e2e:dev": "start-server-and-test api:dev 'http-get://localhost:4042/graphql?query=%7B__typename%7D' test:e2e:dev:client", "test:e2e:dev:client": "vue-cli-service test:e2e --mode development", - "api": "node server.mjs --simulate-latency 100", - "api:dev": "node server.mjs --simulate-latency 500" + "api": "test-server --simulate-latency 100", + "api:dev": "test-server --simulate-latency 500" }, "dependencies": { "@apollo/client": "^3.7.7", - "@apollo/server": "^4.7.3", - "@graphql-tools/schema": "^10.0.0", "@vue/apollo-composable": "workspace:*", "@vue/apollo-util": "workspace:*", - "body-parser": "^1.20.2", "core-js": "^3.23.2", - "cors": "^2.8.5", - "express": "^4.18.1", "graphql": "^16.6.0", - "graphql-subscriptions": "^2.0.0", "graphql-tag": "^2.12.6", "graphql-ws": "^5.13.1", "regenerator-runtime": "^0.13.9", - "shortid": "^2.2.16", + "test-server": "workspace:*", "vue": "^3.2.37", "vue-demi": "^0.13.1", - "vue-router": "^4.0.16", - "ws": "^8.13.0" + "vue-router": "^4.0.16" }, "devDependencies": { "@babel/core": "^7.18.5", - "@types/shortid": "^0.0.29", "@vue/cli-plugin-babel": "^5.0.6", "@vue/cli-plugin-e2e-cypress": "^5.0.6", "@vue/cli-plugin-typescript": "^5.0.6", diff --git a/packages/test-server/bin.mjs b/packages/test-server/bin.mjs new file mode 100755 index 0000000..92b9118 --- /dev/null +++ b/packages/test-server/bin.mjs @@ -0,0 +1,4 @@ +#!/usr/bin/env node +'use strict' + +import './src/index.mjs' diff --git a/packages/test-server/package.json b/packages/test-server/package.json new file mode 100644 index 0000000..3260f87 --- /dev/null +++ b/packages/test-server/package.json @@ -0,0 +1,24 @@ +{ + "name": "test-server", + "version": "4.0.0-alpha.16", + "private": true, + "bin": { + "test-server": "./bin.mjs" + }, + "dependencies": { + "@apollo/server": "^4.7.3", + "@graphql-tools/schema": "^10.0.0", + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "express": "^4.18.1", + "graphql": "^16.6.0", + "graphql-subscriptions": "^2.0.0", + "graphql-tag": "^2.12.6", + "graphql-ws": "^5.13.1", + "shortid": "^2.2.16", + "ws": "^8.13.0" + }, + "devDependencies": { + "@types/shortid": "^0.0.29" + } +} diff --git a/packages/test-server/src/data.mjs b/packages/test-server/src/data.mjs new file mode 100644 index 0000000..d286f69 --- /dev/null +++ b/packages/test-server/src/data.mjs @@ -0,0 +1,18 @@ +export let channels = [] + +export function resetDatabase () { + channels = [ + { + id: 'general', + label: 'General', + messages: [], + }, + { + id: 'random', + label: 'Random', + messages: [], + }, + ] +} + +resetDatabase() diff --git a/packages/test-server/src/index.mjs b/packages/test-server/src/index.mjs new file mode 100644 index 0000000..de31e56 --- /dev/null +++ b/packages/test-server/src/index.mjs @@ -0,0 +1,64 @@ +import { createServer } from 'node:http' +import express from 'express' +import cors from 'cors' +import bodyParser from 'body-parser' +import { ApolloServer } from '@apollo/server' +import { expressMiddleware } from '@apollo/server/express4' +import { WebSocketServer } from 'ws' +import { useServer } from 'graphql-ws/lib/use/ws' +import { schema } from './schema.mjs' +import { resetDatabase } from './data.mjs' + +const app = express() + +app.use(cors('*')) + +app.use(bodyParser.json()) + +app.get('/_reset', (req, res) => { + resetDatabase() + res.status(200).end() +}) + +const server = new ApolloServer({ + schema, + context: () => new Promise(resolve => { + setTimeout(() => resolve({}), 50) + }), + plugins: [ + // Proper shutdown for the WebSocket server. + { + async serverWillStart () { + return { + async drainServer () { + await serverCleanup.dispose() + }, + } + }, + }, + ], + csrfPrevention: false, +}) + +await server.start() + +app.use('/graphql', expressMiddleware(server)) + +const httpServer = createServer(app) + +// Websocket + +const wsServer = new WebSocketServer({ + server: httpServer, + path: '/graphql', +}) + +const serverCleanup = useServer({ + schema, +}, wsServer) + +httpServer.listen({ + port: 4042, +}, () => { + console.log('🚀 Server ready at http://localhost:4042') +}) diff --git a/packages/test-e2e-composable-vue3/server.mjs b/packages/test-server/src/schema.mjs similarity index 55% rename from packages/test-e2e-composable-vue3/server.mjs rename to packages/test-server/src/schema.mjs index 15795b6..bd84801 100644 --- a/packages/test-e2e-composable-vue3/server.mjs +++ b/packages/test-server/src/schema.mjs @@ -1,37 +1,11 @@ -import { createServer } from 'node:http' -import express from 'express' -import cors from 'cors' -import bodyParser from 'body-parser' -import { ApolloServer } from '@apollo/server' -import { expressMiddleware } from '@apollo/server/express4' import { makeExecutableSchema } from '@graphql-tools/schema' -import { WebSocketServer } from 'ws' -import { useServer } from 'graphql-ws/lib/use/ws' import { PubSub, withFilter } from 'graphql-subscriptions' import shortid from 'shortid' import gql from 'graphql-tag' -import { GraphQLError } from 'graphql' +import { channels } from './data.mjs' +import { simulateLatency, GraphQLErrorWithCode } from './util.mjs' -const shouldSimulateLatency = process.argv.includes('--simulate-latency') - -let latency = 500 -if (shouldSimulateLatency) { - const index = process.argv.indexOf('--simulate-latency') - if (index !== -1 && process.argv.length > index + 1) { - latency = parseInt(process.argv[index + 1]) - } -} - -export class GraphQLErrorWithCode extends GraphQLError { - constructor (message, code, extensions) { - super(message, { - extensions: { - code, - ...extensions, - }, - }) - } -} +const pubsub = new PubSub() const typeDefs = gql` type Channel { @@ -77,37 +51,6 @@ type Subscription { } ` -const pubsub = new PubSub() - -let channels = [] - -function resetDatabase () { - channels = [ - { - id: 'general', - label: 'General', - messages: [], - }, - { - id: 'random', - label: 'Random', - messages: [], - }, - ] -} - -resetDatabase() - -function simulateLatency () { - return new Promise(resolve => { - if (shouldSimulateLatency) { - setTimeout(resolve, latency) - } else { - resolve() - } - }) -} - const resolvers = { Query: { hello: () => simulateLatency().then(() => 'Hello world!'), @@ -168,61 +111,7 @@ const resolvers = { }, } -const schema = makeExecutableSchema({ +export const schema = makeExecutableSchema({ typeDefs, resolvers, }) - -const app = express() - -app.use(cors('*')) - -app.use(bodyParser.json()) - -app.get('/_reset', (req, res) => { - resetDatabase() - res.status(200).end() -}) - -const server = new ApolloServer({ - schema, - context: () => new Promise(resolve => { - setTimeout(() => resolve({}), 50) - }), - plugins: [ - // Proper shutdown for the WebSocket server. - { - async serverWillStart () { - return { - async drainServer () { - await serverCleanup.dispose() - }, - } - }, - }, - ], - csrfPrevention: false, -}) - -await server.start() - -app.use('/graphql', expressMiddleware(server)) - -const httpServer = createServer(app) - -// Websocket - -const wsServer = new WebSocketServer({ - server: httpServer, - path: '/graphql', -}) - -const serverCleanup = useServer({ - schema, -}, wsServer) - -httpServer.listen({ - port: 4042, -}, () => { - console.log('🚀 Server ready at http://localhost:4042') -}) diff --git a/packages/test-server/src/util.mjs b/packages/test-server/src/util.mjs new file mode 100644 index 0000000..86ae9cb --- /dev/null +++ b/packages/test-server/src/util.mjs @@ -0,0 +1,32 @@ +import { GraphQLError } from 'graphql' + +const shouldSimulateLatency = process.argv.includes('--simulate-latency') + +let latency = 500 +if (shouldSimulateLatency) { + const index = process.argv.indexOf('--simulate-latency') + if (index !== -1 && process.argv.length > index + 1) { + latency = parseInt(process.argv[index + 1]) + } +} + +export function simulateLatency () { + return new Promise(resolve => { + if (shouldSimulateLatency) { + setTimeout(resolve, latency) + } else { + resolve() + } + }) +} + +export class GraphQLErrorWithCode extends GraphQLError { + constructor (message, code, extensions) { + super(message, { + extensions: { + code, + ...extensions, + }, + }) + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5048560..7e162eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -178,36 +178,18 @@ importers: '@apollo/client': specifier: ^3.7.7 version: 3.7.9(graphql-ws@5.13.1)(graphql@16.0.0) - '@apollo/server': - specifier: ^4.7.3 - version: 4.7.3(graphql@16.0.0) - '@graphql-tools/schema': - specifier: ^10.0.0 - version: 10.0.0(graphql@16.0.0) '@vue/apollo-composable': specifier: workspace:* version: link:../vue-apollo-composable '@vue/apollo-util': specifier: workspace:* version: link:../vue-apollo-util - body-parser: - specifier: ^1.20.2 - version: 1.20.2 core-js: specifier: ^3.23.2 version: 3.28.0 - cors: - specifier: ^2.8.5 - version: 2.8.5 - express: - specifier: ^4.18.1 - version: 4.18.2 graphql: specifier: ^16 version: 16.0.0 - graphql-subscriptions: - specifier: ^2.0.0 - version: 2.0.0(graphql@16.0.0) graphql-tag: specifier: ^2.12.6 version: 2.12.6(graphql@16.0.0) @@ -217,9 +199,9 @@ importers: regenerator-runtime: specifier: ^0.13.9 version: 0.13.11 - shortid: - specifier: ^2.2.16 - version: 2.2.16 + test-server: + specifier: workspace:* + version: link:../test-server vue: specifier: ^3.2.37 version: 3.2.47 @@ -229,16 +211,10 @@ importers: vue-router: specifier: ^4.0.16 version: 4.1.6(vue@3.2.47) - ws: - specifier: ^8.13.0 - version: 8.13.0 devDependencies: '@babel/core': specifier: ^7.18.5 version: 7.21.0 - '@types/shortid': - specifier: ^0.0.29 - version: 0.0.29 '@vue/cli-plugin-babel': specifier: ^5.0.6 version: 5.0.8(@vue/cli-service@5.0.8)(core-js@3.28.0)(esbuild@0.8.57)(vue@3.2.47) @@ -267,6 +243,46 @@ importers: specifier: ^1.9.6 version: 1.9.6 + packages/test-server: + dependencies: + '@apollo/server': + specifier: ^4.7.3 + version: 4.7.3(graphql@16.0.0) + '@graphql-tools/schema': + specifier: ^10.0.0 + version: 10.0.0(graphql@16.0.0) + body-parser: + specifier: ^1.20.2 + version: 1.20.2 + cors: + specifier: ^2.8.5 + version: 2.8.5 + express: + specifier: ^4.18.1 + version: 4.18.2 + graphql: + specifier: ^16 + version: 16.0.0 + graphql-subscriptions: + specifier: ^2.0.0 + version: 2.0.0(graphql@16.0.0) + graphql-tag: + specifier: ^2.12.6 + version: 2.12.6(graphql@16.0.0) + graphql-ws: + specifier: ^5.13.1 + version: 5.13.1(graphql@16.0.0) + shortid: + specifier: ^2.2.16 + version: 2.2.16 + ws: + specifier: ^8.13.0 + version: 8.13.0 + devDependencies: + '@types/shortid': + specifier: ^0.0.29 + version: 0.0.29 + packages/vue-apollo-components: dependencies: '@vue/apollo-option':