@things-factory/shell 8.0.0-beta.1 → 8.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -6
- package/server/graphql-local-client.ts +0 -59
- package/server/index.ts +0 -13
- package/server/initializers/database.ts +0 -96
- package/server/initializers/naming-strategy.ts +0 -14
- package/server/middlewares/domain-middleware.ts +0 -60
- package/server/middlewares/index.ts +0 -43
- package/server/migrations/1000000000000-SeedDomain.ts +0 -37
- package/server/migrations/index.ts +0 -9
- package/server/pubsub-log-transport.ts +0 -59
- package/server/pubsub.ts +0 -84
- package/server/routers/domain-router.ts +0 -13
- package/server/routers/global-router.ts +0 -76
- package/server/routers/graphql-router.ts +0 -3
- package/server/routers/index.ts +0 -3
- package/server/schema.ts +0 -163
- package/server/server-dev.ts +0 -305
- package/server/server.ts +0 -296
- package/server/service/attribute-set/attribute-set-item-type.ts +0 -65
- package/server/service/attribute-set/attribute-set-mutation.ts +0 -125
- package/server/service/attribute-set/attribute-set-query.ts +0 -36
- package/server/service/attribute-set/attribute-set-type.ts +0 -46
- package/server/service/attribute-set/attribute-set.ts +0 -35
- package/server/service/attribute-set/index.ts +0 -6
- package/server/service/common-types/index.ts +0 -6
- package/server/service/common-types/list-param.ts +0 -61
- package/server/service/common-types/log.ts +0 -17
- package/server/service/common-types/object-ref.ts +0 -13
- package/server/service/common-types/scalar-any.ts +0 -44
- package/server/service/common-types/scalar-date.ts +0 -22
- package/server/service/common-types/scalar-object.ts +0 -15
- package/server/service/directive-transaction/index.ts +0 -1
- package/server/service/directive-transaction/transaction.ts +0 -40
- package/server/service/domain/domain-mutation.ts +0 -120
- package/server/service/domain/domain-query.ts +0 -48
- package/server/service/domain/domain-types.ts +0 -63
- package/server/service/domain/domain.ts +0 -147
- package/server/service/domain/index.ts +0 -6
- package/server/service/index.ts +0 -32
- package/server/service/subscription-data/data-resolver.ts +0 -37
- package/server/service/subscription-data/data-types.ts +0 -16
- package/server/service/subscription-data/index.ts +0 -4
- package/server/typeorm/encrypt-transform.ts +0 -70
- package/server/typeorm/get-data-encryption-key.ts +0 -13
- package/server/typeorm/json5-transform.ts +0 -26
- package/server/typeorm/round-transform.ts +0 -20
- package/server/utils/condition-builder.ts +0 -145
- package/server/utils/get-domain.ts +0 -226
- package/server/utils/get-query-builder-from-list-params.ts +0 -469
- package/server/utils/get-times-for-period.ts +0 -60
- package/server/utils/index.ts +0 -8
- package/server/utils/list-param-adjuster.ts +0 -21
- package/server/utils/list-params-converter.ts +0 -200
- package/server/utils/list-query-builder.ts +0 -120
- package/server/utils/publish-progress.ts +0 -23
package/server/schema.ts
DELETED
@@ -1,163 +0,0 @@
|
|
1
|
-
import { GraphQLSchema } from 'graphql'
|
2
|
-
import { GraphQLUpload } from 'graphql-upload/GraphQLUpload.js'
|
3
|
-
import { buildSchema } from 'type-graphql'
|
4
|
-
import { typeDefs as scalarTypeDefs, resolvers as scalarResolvers } from 'graphql-scalars'
|
5
|
-
|
6
|
-
import { mergeSchemas } from '@graphql-tools/schema'
|
7
|
-
import { loader, orderedModuleNames } from '@things-factory/env'
|
8
|
-
import { deepMerge } from '@things-factory/utils'
|
9
|
-
import { pubsub } from './pubsub'
|
10
|
-
|
11
|
-
const path = require('path')
|
12
|
-
|
13
|
-
/**
|
14
|
-
* Generates and returns a GraphQL schema by merging schemas and resolvers from various modules.
|
15
|
-
* @returns {GraphQLSchema} The merged GraphQL schema.
|
16
|
-
*/
|
17
|
-
export async function schema() {
|
18
|
-
const schemas = orderedModuleNames
|
19
|
-
.map(dep => loader(dep).schema)
|
20
|
-
.filter(schema => schema)
|
21
|
-
.reduce(
|
22
|
-
(sum, schema) => {
|
23
|
-
const { typeDefs, resolvers, resolverClasses, directives } = sum
|
24
|
-
let { typeDefs: sTypeDefs = {}, resolvers: sResolvers = {}, resolverClasses: sResolverClasses = [], directives: sDirectives = {} } = schema
|
25
|
-
|
26
|
-
return {
|
27
|
-
typeDefs: deepMerge(typeDefs, sTypeDefs),
|
28
|
-
resolvers: deepMerge(resolvers, sResolvers),
|
29
|
-
resolverClasses: [...resolverClasses, ...(sResolverClasses || [])],
|
30
|
-
directives: deepMerge(directives, sDirectives)
|
31
|
-
}
|
32
|
-
},
|
33
|
-
{
|
34
|
-
typeDefs: {},
|
35
|
-
resolvers: {},
|
36
|
-
resolverClasses: [],
|
37
|
-
directives: {}
|
38
|
-
}
|
39
|
-
)
|
40
|
-
|
41
|
-
/* for typeDefs */
|
42
|
-
var typeDefs = schemas.typeDefs
|
43
|
-
var { queries = [], mutations = [], subscriptions = [], directives = [], types = [] } = typeDefs
|
44
|
-
|
45
|
-
queries = [...queries, ...(typeDefs.Query || [])]
|
46
|
-
mutations = [...mutations, ...(typeDefs.Mutation || [])]
|
47
|
-
subscriptions = [...subscriptions, ...(typeDefs.Subscription || [])]
|
48
|
-
directives = [...directives, ...(typeDefs.Directive || [])]
|
49
|
-
|
50
|
-
delete typeDefs.Query
|
51
|
-
delete typeDefs.Mutation
|
52
|
-
delete typeDefs.Subscription
|
53
|
-
delete typeDefs.Directive
|
54
|
-
|
55
|
-
delete typeDefs.queries
|
56
|
-
delete typeDefs.mutations
|
57
|
-
delete typeDefs.subscriptions
|
58
|
-
delete typeDefs.directives
|
59
|
-
delete typeDefs.types
|
60
|
-
|
61
|
-
const defs = {
|
62
|
-
query: queries.length > 0 ? ['type Query {', ...queries, '}'].join('\n') : 'type Query { _ : Boolean }',
|
63
|
-
mutation: mutations.length > 0 ? ['type Mutation {', ...mutations, '}'].join('\n') : 'type Mutation { _ : Boolean }',
|
64
|
-
subscription: subscriptions.length > 0 ? ['type Subscription {', ...subscriptions, '}'].join('\n') : 'type Subscription { _ : Boolean }'
|
65
|
-
}
|
66
|
-
|
67
|
-
typeDefs = [
|
68
|
-
...scalarTypeDefs,
|
69
|
-
`
|
70
|
-
scalar Upload
|
71
|
-
`,
|
72
|
-
defs.query,
|
73
|
-
defs.mutation,
|
74
|
-
defs.subscription,
|
75
|
-
...directives,
|
76
|
-
...types,
|
77
|
-
...Object.values(typeDefs)
|
78
|
-
].filter(type => !!type)
|
79
|
-
|
80
|
-
/* for resolvers */
|
81
|
-
var { resolvers } = schemas
|
82
|
-
var { queries = [], mutations = [], subscriptions = [], directives = [] } = resolvers
|
83
|
-
|
84
|
-
var queryResolvers =
|
85
|
-
queries.length > 0 &&
|
86
|
-
queries.reduce((sum, query) => {
|
87
|
-
return {
|
88
|
-
...sum,
|
89
|
-
...query
|
90
|
-
}
|
91
|
-
}, {})
|
92
|
-
|
93
|
-
var mutationResolvers =
|
94
|
-
mutations.length > 0 &&
|
95
|
-
mutations.reduce((sum, mutation) => {
|
96
|
-
return {
|
97
|
-
...sum,
|
98
|
-
...mutation
|
99
|
-
}
|
100
|
-
}, {})
|
101
|
-
|
102
|
-
var subscriptionResolvers =
|
103
|
-
subscriptions.length > 0 &&
|
104
|
-
subscriptions.reduce((sum, subscription) => {
|
105
|
-
return {
|
106
|
-
...sum,
|
107
|
-
...subscription
|
108
|
-
}
|
109
|
-
}, {})
|
110
|
-
|
111
|
-
var directiveResolvers = directives.reduce((sum, directive) => {
|
112
|
-
return {
|
113
|
-
...sum,
|
114
|
-
...directive
|
115
|
-
}
|
116
|
-
}, {})
|
117
|
-
|
118
|
-
delete resolvers.queries
|
119
|
-
delete resolvers.mutations
|
120
|
-
delete resolvers.subscriptions
|
121
|
-
delete resolvers.directives
|
122
|
-
|
123
|
-
var Query = resolvers.Query || {}
|
124
|
-
var Mutation = resolvers.Mutation || {}
|
125
|
-
var Subscription = resolvers.Subscription || {}
|
126
|
-
var Directive = resolvers.Directive || {}
|
127
|
-
|
128
|
-
delete resolvers.Query
|
129
|
-
delete resolvers.Mutation
|
130
|
-
delete resolvers.Subscription
|
131
|
-
delete resolvers.Directive
|
132
|
-
|
133
|
-
resolvers = {
|
134
|
-
Upload: GraphQLUpload as any,
|
135
|
-
Query: deepMerge(Query, queryResolvers),
|
136
|
-
Mutation: deepMerge(Mutation, mutationResolvers),
|
137
|
-
Subscription: deepMerge(Subscription, subscriptionResolvers),
|
138
|
-
...scalarResolvers,
|
139
|
-
...resolvers
|
140
|
-
}
|
141
|
-
|
142
|
-
var merged = mergeSchemas({
|
143
|
-
schemas: [
|
144
|
-
await buildSchema({
|
145
|
-
pubSub: pubsub,
|
146
|
-
resolvers: schemas.resolverClasses,
|
147
|
-
// automatically create `schema.gql` file with schema definition
|
148
|
-
// in project's working directory
|
149
|
-
// or create the file with schema in selected path
|
150
|
-
emitSchemaFile: process.env.NODE_ENV == 'development'
|
151
|
-
// emitSchemaFile: path.resolve(__dirname, 'snapshots/schema', 'schema.gql')
|
152
|
-
})
|
153
|
-
],
|
154
|
-
typeDefs,
|
155
|
-
resolvers
|
156
|
-
})
|
157
|
-
|
158
|
-
Object.values(schemas.directives).map((directive: (schema: GraphQLSchema) => {}) => {
|
159
|
-
merged = directive(merged) as any
|
160
|
-
})
|
161
|
-
|
162
|
-
return merged
|
163
|
-
}
|
package/server/server-dev.ts
DELETED
@@ -1,305 +0,0 @@
|
|
1
|
-
// ts-import-sorter: disable
|
2
|
-
|
3
|
-
/* following 7 lines should be located in top of the file */
|
4
|
-
const OS = require('os')
|
5
|
-
process.env.UV_THREADPOOL_SIZE = OS.cpus().length
|
6
|
-
|
7
|
-
console.log('UV_THREADPOOL_SIZE', process.env.UV_THREADPOOL_SIZE)
|
8
|
-
|
9
|
-
process.env.NODE_ENV = 'development'
|
10
|
-
process.setMaxListeners(0)
|
11
|
-
|
12
|
-
import { ApolloServer } from '@apollo/server'
|
13
|
-
import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer'
|
14
|
-
import { ApolloServerPluginLandingPageLocalDefault } from '@apollo/server/plugin/landingPage/default'
|
15
|
-
|
16
|
-
import { koaMiddleware } from '@as-integrations/koa'
|
17
|
-
import bytesFormat from 'bytes'
|
18
|
-
import graphqlUploadKoa from 'graphql-upload/graphqlUploadKoa.js'
|
19
|
-
import { useServer } from 'graphql-ws/lib/use/ws'
|
20
|
-
import { createServer } from 'http'
|
21
|
-
import Koa from 'koa'
|
22
|
-
import koaBodyParser from 'koa-bodyparser'
|
23
|
-
import compose from 'koa-compose'
|
24
|
-
import { historyApiFallback } from 'koa2-connect-history-api-fallback'
|
25
|
-
import { WebSocketServer } from 'ws'
|
26
|
-
import co from 'co'
|
27
|
-
import http from 'http'
|
28
|
-
|
29
|
-
import cors from '@koa/cors'
|
30
|
-
|
31
|
-
import crypto from 'crypto'
|
32
|
-
|
33
|
-
import { config, loader, logger, orderedModuleNames } from '@things-factory/env'
|
34
|
-
import { initLicense, checkValidity } from '@things-factory/operato-license-checker'
|
35
|
-
|
36
|
-
import { GraphqlLocalClient } from './graphql-local-client'
|
37
|
-
import { databaseInitializer } from './initializers/database'
|
38
|
-
import {
|
39
|
-
domainPrivateRouter,
|
40
|
-
domainPublicRouter,
|
41
|
-
globalPrivateRouter,
|
42
|
-
globalPublicRouter,
|
43
|
-
graphqlRouter
|
44
|
-
} from './routers'
|
45
|
-
import { schema } from './schema'
|
46
|
-
import { Domain } from './service'
|
47
|
-
import { EntityManager } from 'typeorm'
|
48
|
-
import { domainMiddleware } from './middlewares'
|
49
|
-
const wdm = require('webpack-dev-middleware')
|
50
|
-
|
51
|
-
process.on('uncaughtException', error => {
|
52
|
-
logger.error('uncaughtException: ', error)
|
53
|
-
|
54
|
-
//process.exit(1)
|
55
|
-
})
|
56
|
-
|
57
|
-
const args = require('args')
|
58
|
-
|
59
|
-
args.option('port', 'The port on which the app will be running', config.get('port', 3000))
|
60
|
-
args.option(
|
61
|
-
'inspect',
|
62
|
-
`The address on which the inspection will be running. Used in development mode only.
|
63
|
-
This option is just to prevent termination for reasons of not recognizing the 'inspect' option.`,
|
64
|
-
config.get('inspect', ':9229')
|
65
|
-
)
|
66
|
-
args.option('webpack', 'webpack configuration file', config.get('webpack'))
|
67
|
-
|
68
|
-
const flags = args.parse(process.argv)
|
69
|
-
|
70
|
-
const webpack = require('webpack')
|
71
|
-
const webpackConfig = require(flags.webpack || '@things-factory/builder/webpack.config.dev.js')
|
72
|
-
|
73
|
-
const compiler = webpack(webpackConfig)
|
74
|
-
|
75
|
-
const PORT = (process.env.PORT = flags.port)
|
76
|
-
|
77
|
-
const requestBody = config.get('requestBody') || {}
|
78
|
-
|
79
|
-
const bodyParserOption = {
|
80
|
-
formLimit: requestBody.formLimit || '10mb',
|
81
|
-
jsonLimit: requestBody.jsonLimit || '10mb',
|
82
|
-
textLimit: requestBody.textLimit || '10mb'
|
83
|
-
}
|
84
|
-
|
85
|
-
const fileUpload = config.get('fileUpload') || {}
|
86
|
-
const fileUploadOption = {
|
87
|
-
maxFileSize: bytesFormat.parse(fileUpload.maxFileSize) || bytesFormat.parse('10mb'),
|
88
|
-
maxFiles: fileUpload.maxFiles || 10
|
89
|
-
}
|
90
|
-
|
91
|
-
interface ICustomAppState {
|
92
|
-
domain: Domain
|
93
|
-
user: any
|
94
|
-
tx: EntityManager
|
95
|
-
}
|
96
|
-
|
97
|
-
interface ICustomAppContext {
|
98
|
-
t: any
|
99
|
-
ssoMiddlewares: any[]
|
100
|
-
}
|
101
|
-
|
102
|
-
initLicense(config.get('licenseKey'))
|
103
|
-
|
104
|
-
/* bootstrap */
|
105
|
-
const bootstrap = async () => {
|
106
|
-
await databaseInitializer()
|
107
|
-
|
108
|
-
const app = new Koa<ICustomAppState, ICustomAppContext>() as any
|
109
|
-
app.proxy = true
|
110
|
-
|
111
|
-
app.use(
|
112
|
-
cors({
|
113
|
-
origin: function (ctx) {
|
114
|
-
return ctx.request.headers.origin || '*'
|
115
|
-
},
|
116
|
-
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
|
117
|
-
maxAge: 5,
|
118
|
-
credentials: true,
|
119
|
-
/* allowMethods: ['GET', 'POST', 'DELETE'], -- use default */
|
120
|
-
allowHeaders: ['Content-Type', 'Authorization', 'Accept']
|
121
|
-
})
|
122
|
-
)
|
123
|
-
|
124
|
-
app.use(async (ctx, next) => {
|
125
|
-
ctx.set('X-Content-Type-Options', 'nosniff')
|
126
|
-
|
127
|
-
const { directives = {} } = config.get('CSP') || {}
|
128
|
-
|
129
|
-
const nonce = crypto.randomBytes(16).toString('base64')
|
130
|
-
ctx.state.nonce = nonce
|
131
|
-
|
132
|
-
const cspHeader = Object.entries(directives as { [key: string]: string[] })
|
133
|
-
.map(([key, value]) => `${key} ${value.join(' ')}`)
|
134
|
-
.join('; ')
|
135
|
-
|
136
|
-
ctx.set('Content-Security-Policy', cspHeader)
|
137
|
-
|
138
|
-
await next()
|
139
|
-
})
|
140
|
-
|
141
|
-
var subscriptionMiddleware = []
|
142
|
-
process.emit('bootstrap-module-subscription' as any, app, subscriptionMiddleware)
|
143
|
-
|
144
|
-
const builtSchema = await schema()
|
145
|
-
|
146
|
-
const httpServer = createServer(app.callback())
|
147
|
-
const websocketServer = new WebSocketServer({
|
148
|
-
server: httpServer,
|
149
|
-
path: '/graphql'
|
150
|
-
})
|
151
|
-
|
152
|
-
// Save the returned server's info so we can shut down this server later
|
153
|
-
const serverCleanup = useServer(
|
154
|
-
{
|
155
|
-
schema: builtSchema,
|
156
|
-
context: async (ctx, msg, args) => {
|
157
|
-
return ctx['context']
|
158
|
-
},
|
159
|
-
onConnect: async ctx => {
|
160
|
-
var { extra, connectionParams } = ctx
|
161
|
-
var { request } = extra
|
162
|
-
|
163
|
-
if (((connectionParams['headers'] as any) || connectionParams)?.referer) {
|
164
|
-
var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
|
165
|
-
var accessToken = url.searchParams.get('access_token')
|
166
|
-
if (accessToken) {
|
167
|
-
connectionParams['headers']['authorization'] = accessToken
|
168
|
-
}
|
169
|
-
}
|
170
|
-
|
171
|
-
request.headers = {
|
172
|
-
...request.headers,
|
173
|
-
...(connectionParams['headers'] || (connectionParams as any))
|
174
|
-
}
|
175
|
-
|
176
|
-
var koacontext = await app.createContext(request, new http.ServerResponse(request))
|
177
|
-
koacontext['state'] = {}
|
178
|
-
|
179
|
-
/* in case connect error(like a authentication error) just throw exception */
|
180
|
-
var middlewares = [domainMiddleware, ...subscriptionMiddleware]
|
181
|
-
const fn = co.wrap(compose(middlewares))
|
182
|
-
|
183
|
-
await fn(koacontext)
|
184
|
-
|
185
|
-
return (ctx['context'] = koacontext)
|
186
|
-
},
|
187
|
-
onDisconnect(ctx, code, reason) {
|
188
|
-
console.log('Disconnected!')
|
189
|
-
},
|
190
|
-
onError(ctx, msg, errors) {
|
191
|
-
console.error(msg, errors)
|
192
|
-
}
|
193
|
-
},
|
194
|
-
websocketServer
|
195
|
-
)
|
196
|
-
|
197
|
-
const server = new ApolloServer({
|
198
|
-
schema: builtSchema,
|
199
|
-
formatError: error => {
|
200
|
-
logger.error(error)
|
201
|
-
return error
|
202
|
-
},
|
203
|
-
introspection: true,
|
204
|
-
csrfPrevention: true,
|
205
|
-
plugins: [
|
206
|
-
// Proper shutdown for the HTTP server.
|
207
|
-
ApolloServerPluginDrainHttpServer({ httpServer }),
|
208
|
-
// Proper shutdown for the WebSocket server.
|
209
|
-
{
|
210
|
-
async serverWillStart() {
|
211
|
-
return {
|
212
|
-
async drainServer() {
|
213
|
-
await serverCleanup.dispose()
|
214
|
-
}
|
215
|
-
}
|
216
|
-
}
|
217
|
-
},
|
218
|
-
// TODO make this landing page work
|
219
|
-
ApolloServerPluginLandingPageLocalDefault({
|
220
|
-
footer: false,
|
221
|
-
embed: true,
|
222
|
-
includeCookies: true
|
223
|
-
})
|
224
|
-
],
|
225
|
-
cache: 'bounded'
|
226
|
-
})
|
227
|
-
|
228
|
-
await server.start()
|
229
|
-
|
230
|
-
GraphqlLocalClient.init(builtSchema, app)
|
231
|
-
|
232
|
-
orderedModuleNames.forEach(name => {
|
233
|
-
const { initMiddlewares } = loader(name)
|
234
|
-
initMiddlewares && initMiddlewares(app)
|
235
|
-
})
|
236
|
-
|
237
|
-
const render = require('@things-factory/ejs-remote')
|
238
|
-
render(app, {
|
239
|
-
root: '/views',
|
240
|
-
host: `http://127.0.0.1:${PORT}`,
|
241
|
-
layout: false,
|
242
|
-
viewExt: 'html',
|
243
|
-
cache: false,
|
244
|
-
debug: false
|
245
|
-
})
|
246
|
-
|
247
|
-
// only for development mode. triggered after webpack compilation is done.
|
248
|
-
compiler.hooks.done.tap({ name: 'server-dev' }, stats => {
|
249
|
-
process.emit('client-rebuilt' as any, app, compiler.outputFileSystem)
|
250
|
-
})
|
251
|
-
|
252
|
-
app.use(koaBodyParser(bodyParserOption))
|
253
|
-
|
254
|
-
/* routers */
|
255
|
-
const ssoMiddlewares = []
|
256
|
-
process.emit('bootstrap-collect-sso-middleware' as any, null, ssoMiddlewares)
|
257
|
-
app.ssoMiddlewares = ssoMiddlewares
|
258
|
-
|
259
|
-
process.emit('bootstrap-module-global-public-route' as any, app, globalPublicRouter)
|
260
|
-
process.emit('bootstrap-module-global-private-route' as any, app, globalPrivateRouter)
|
261
|
-
process.emit('bootstrap-module-domain-public-route' as any, app, domainPublicRouter)
|
262
|
-
process.emit('bootstrap-module-domain-private-route' as any, app, domainPrivateRouter)
|
263
|
-
|
264
|
-
app.use(checkValidity) /* Check the license after most of the context has been built */
|
265
|
-
|
266
|
-
app
|
267
|
-
.use(globalPublicRouter.routes())
|
268
|
-
.use(globalPublicRouter.allowedMethods())
|
269
|
-
.use(globalPrivateRouter.routes())
|
270
|
-
.use(globalPrivateRouter.allowedMethods())
|
271
|
-
.use(domainPublicRouter.routes())
|
272
|
-
.use(domainPublicRouter.allowedMethods())
|
273
|
-
.use(domainPrivateRouter.routes())
|
274
|
-
.use(domainPrivateRouter.allowedMethods())
|
275
|
-
|
276
|
-
/* Graphql Upload's multipart/form-data handling affects the restful file upload feature, so it should be placed after the routers configuration. */
|
277
|
-
app.use(graphqlUploadKoa(fileUploadOption))
|
278
|
-
|
279
|
-
graphqlRouter.post(
|
280
|
-
'/graphql',
|
281
|
-
koaMiddleware(server, {
|
282
|
-
context: async ({ ctx }) => ctx
|
283
|
-
})
|
284
|
-
)
|
285
|
-
app.use(graphqlRouter.routes())
|
286
|
-
app.use(graphqlRouter.allowedMethods())
|
287
|
-
|
288
|
-
/* should follow this order : history-fallback => webpack-middleware */
|
289
|
-
app.use(historyApiFallback({ whiteList: [] }))
|
290
|
-
|
291
|
-
app.use(
|
292
|
-
wdm.koaWrapper(compiler, {
|
293
|
-
publicPath: webpackConfig.output.publicPath
|
294
|
-
})
|
295
|
-
)
|
296
|
-
|
297
|
-
httpServer.listen({ port: PORT }, () => {
|
298
|
-
logger.info(`🚀 Server ready at http://0.0.0.0:${PORT}/graphql`)
|
299
|
-
logger.info(`🚀 Subscriptions ready at ws://0.0.0.0:${PORT}/graphql`)
|
300
|
-
|
301
|
-
process.emit('bootstrap-module-start' as any, { app, config, builtSchema, httpServer } as any)
|
302
|
-
})
|
303
|
-
}
|
304
|
-
|
305
|
-
bootstrap()
|