@things-factory/shell 8.0.0-beta.0 → 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.
Files changed (55) hide show
  1. package/package.json +6 -6
  2. package/server/graphql-local-client.ts +0 -59
  3. package/server/index.ts +0 -13
  4. package/server/initializers/database.ts +0 -96
  5. package/server/initializers/naming-strategy.ts +0 -14
  6. package/server/middlewares/domain-middleware.ts +0 -60
  7. package/server/middlewares/index.ts +0 -43
  8. package/server/migrations/1000000000000-SeedDomain.ts +0 -37
  9. package/server/migrations/index.ts +0 -9
  10. package/server/pubsub-log-transport.ts +0 -59
  11. package/server/pubsub.ts +0 -84
  12. package/server/routers/domain-router.ts +0 -13
  13. package/server/routers/global-router.ts +0 -76
  14. package/server/routers/graphql-router.ts +0 -3
  15. package/server/routers/index.ts +0 -3
  16. package/server/schema.ts +0 -163
  17. package/server/server-dev.ts +0 -305
  18. package/server/server.ts +0 -296
  19. package/server/service/attribute-set/attribute-set-item-type.ts +0 -65
  20. package/server/service/attribute-set/attribute-set-mutation.ts +0 -125
  21. package/server/service/attribute-set/attribute-set-query.ts +0 -36
  22. package/server/service/attribute-set/attribute-set-type.ts +0 -46
  23. package/server/service/attribute-set/attribute-set.ts +0 -35
  24. package/server/service/attribute-set/index.ts +0 -6
  25. package/server/service/common-types/index.ts +0 -6
  26. package/server/service/common-types/list-param.ts +0 -61
  27. package/server/service/common-types/log.ts +0 -17
  28. package/server/service/common-types/object-ref.ts +0 -13
  29. package/server/service/common-types/scalar-any.ts +0 -44
  30. package/server/service/common-types/scalar-date.ts +0 -22
  31. package/server/service/common-types/scalar-object.ts +0 -15
  32. package/server/service/directive-transaction/index.ts +0 -1
  33. package/server/service/directive-transaction/transaction.ts +0 -40
  34. package/server/service/domain/domain-mutation.ts +0 -120
  35. package/server/service/domain/domain-query.ts +0 -48
  36. package/server/service/domain/domain-types.ts +0 -63
  37. package/server/service/domain/domain.ts +0 -147
  38. package/server/service/domain/index.ts +0 -6
  39. package/server/service/index.ts +0 -32
  40. package/server/service/subscription-data/data-resolver.ts +0 -37
  41. package/server/service/subscription-data/data-types.ts +0 -16
  42. package/server/service/subscription-data/index.ts +0 -4
  43. package/server/typeorm/encrypt-transform.ts +0 -70
  44. package/server/typeorm/get-data-encryption-key.ts +0 -13
  45. package/server/typeorm/json5-transform.ts +0 -26
  46. package/server/typeorm/round-transform.ts +0 -20
  47. package/server/utils/condition-builder.ts +0 -145
  48. package/server/utils/get-domain.ts +0 -226
  49. package/server/utils/get-query-builder-from-list-params.ts +0 -469
  50. package/server/utils/get-times-for-period.ts +0 -60
  51. package/server/utils/index.ts +0 -8
  52. package/server/utils/list-param-adjuster.ts +0 -21
  53. package/server/utils/list-params-converter.ts +0 -200
  54. package/server/utils/list-query-builder.ts +0 -120
  55. 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
- }
@@ -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()