@common-stack/generate-plugin 5.0.4-alpha.0 → 5.0.4-alpha.11
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/CHANGELOG.md +16 -0
- package/README.md +42 -0
- package/generators.json +9 -4
- package/lib/generators/add-backend/files/CHANGELOG.md +196 -0
- package/lib/generators/add-backend/files/Dockerfile +30 -0
- package/lib/generators/add-backend/files/LICENSE +661 -0
- package/lib/generators/add-backend/files/README.md +133 -0
- package/lib/generators/add-backend/files/__tests__/test.ts.template +95 -0
- package/lib/generators/add-backend/files/babel.config.js +45 -0
- package/lib/generators/add-backend/files/build.config.js +14 -0
- package/lib/generators/add-backend/files/build.config.mjs +27 -0
- package/lib/generators/add-backend/files/generated-schema.graphql +235 -0
- package/lib/generators/add-backend/files/jest.config.js +27 -0
- package/lib/generators/add-backend/files/knexfile.js +63 -0
- package/lib/generators/add-backend/files/package.json +162 -0
- package/lib/generators/add-backend/files/src/api/remote-config.ts.template +11 -0
- package/lib/generators/add-backend/files/src/api/resolver.ts.template +15 -0
- package/lib/generators/add-backend/files/src/api/root-schema.graphqls +96 -0
- package/lib/generators/add-backend/files/src/api/scalar.ts.template +16 -0
- package/lib/generators/add-backend/files/src/api/schema-builder.ts.template +189 -0
- package/lib/generators/add-backend/files/src/api/utils.ts.template +44 -0
- package/lib/generators/add-backend/files/src/config/env-config.ts.template +34 -0
- package/lib/generators/add-backend/files/src/config/index.ts.template +1 -0
- package/lib/generators/add-backend/files/src/config/moleculer.config.ts.template +228 -0
- package/lib/generators/add-backend/files/src/connectors/connection-broker.ts.template +80 -0
- package/lib/generators/add-backend/files/src/connectors/graphql-pubsub-connector.ts.template +43 -0
- package/lib/generators/add-backend/files/src/connectors/mongo-connector.ts.template +78 -0
- package/lib/generators/add-backend/files/src/connectors/nats-connector.ts.template +82 -0
- package/lib/generators/add-backend/files/src/connectors/redis-connector.ts.template +73 -0
- package/lib/generators/add-backend/files/src/env.ts.template +5 -0
- package/lib/generators/add-backend/files/src/express-app.ts.template +67 -0
- package/lib/generators/add-backend/files/src/index.ts.template +56 -0
- package/lib/generators/add-backend/files/src/interfaces/index.ts.template +1 -0
- package/lib/generators/add-backend/files/src/interfaces/module-interface.ts.template +16 -0
- package/lib/generators/add-backend/files/src/main.spec.ts.template +129 -0
- package/lib/generators/add-backend/files/src/middleware/__tests__/cors.test.ts.template +12 -0
- package/lib/generators/add-backend/files/src/middleware/cors.ts.template +31 -0
- package/lib/generators/add-backend/files/src/middleware/error.ts.template +63 -0
- package/lib/generators/add-backend/files/src/middleware/moleculer-inter-namespace.ts.template +60 -0
- package/lib/generators/add-backend/files/src/middleware/persistedQuery.ts.template +40 -0
- package/lib/generators/add-backend/files/src/middleware/sentry.ts.template +9 -0
- package/lib/generators/add-backend/files/src/middleware/services.ts.template +16 -0
- package/lib/generators/add-backend/files/src/middleware/tracer.ts.template +24 -0
- package/lib/generators/add-backend/files/src/modules/auth/schema/auth-schema.graphql +25 -0
- package/lib/generators/add-backend/files/src/modules/index.ts.template +17 -0
- package/lib/generators/add-backend/files/src/modules/module.ts.template +78 -0
- package/lib/generators/add-backend/files/src/server-setup/graphql-server.ts.template +185 -0
- package/lib/generators/add-backend/files/src/server-setup/graphql-subscription-server.ts.template +113 -0
- package/lib/generators/add-backend/files/src/server-setup/graphql-ws.ts.template +158 -0
- package/lib/generators/add-backend/files/src/server-setup/mongodb-migration-update.ts.template +47 -0
- package/lib/generators/add-backend/files/src/server-setup/utils.ts.template +43 -0
- package/lib/generators/add-backend/files/src/server-setup/websocket-multipath-update.ts.template +88 -0
- package/lib/generators/add-backend/files/src/service.ts.template +36 -0
- package/lib/generators/add-backend/files/src/stack-server.ts.template +277 -0
- package/lib/generators/add-backend/files/src/utils/migrations.ts.template +32 -0
- package/lib/generators/add-backend/files/tsconfig.base.json +30 -0
- package/lib/generators/add-backend/files/tsconfig.json +19 -0
- package/lib/generators/add-backend/files/uploads/3986781.ppt +0 -0
- package/lib/generators/add-backend/files/webpack.config.js +186 -0
- package/lib/generators/add-backend/files/webpack.config.mjs +209 -0
- package/lib/generators/add-backend/generator.cjs +20 -0
- package/lib/generators/add-backend/generator.cjs.map +1 -0
- package/lib/generators/add-backend/generator.d.ts +4 -0
- package/lib/generators/add-backend/generator.mjs +20 -0
- package/lib/generators/add-backend/generator.mjs.map +1 -0
- package/lib/generators/add-backend/schema.json +17 -0
- package/lib/generators/add-frontend/generator.cjs +29 -0
- package/lib/generators/add-frontend/generator.cjs.map +1 -0
- package/lib/generators/add-frontend/generator.d.ts +4 -0
- package/lib/generators/add-frontend/generator.mjs +29 -0
- package/lib/generators/add-frontend/generator.mjs.map +1 -0
- package/lib/generators/add-frontend/generator.spec.d.ts +1 -0
- package/lib/generators/add-frontend/schema.json +21 -0
- package/lib/generators/add-frontend/templates/Dockerfile +30 -0
- package/lib/generators/add-frontend/templates/codecept.json +28 -0
- package/lib/generators/add-frontend/templates/config.json +58 -0
- package/lib/generators/add-frontend/templates/env.d.ts.template +9 -0
- package/lib/generators/add-frontend/templates/env.js +5 -0
- package/lib/generators/add-frontend/templates/favicon.ico +0 -0
- package/lib/generators/add-frontend/templates/jest.config.js +33 -0
- package/lib/generators/add-frontend/templates/package.json +182 -0
- package/lib/generators/add-frontend/templates/public/css/dashboard.css +491 -0
- package/lib/generators/add-frontend/templates/public/favicon.ico +0 -0
- package/lib/generators/add-frontend/templates/server.js +78 -0
- package/lib/generators/add-frontend/templates/src/config/public-config.ts.template +82 -0
- package/lib/generators/add-frontend/templates/tools/mergeConfig.js +34 -0
- package/lib/generators/add-frontend/templates/tsconfig.base.json +38 -0
- package/lib/generators/add-frontend/templates/tsconfig.json +32 -0
- package/lib/generators/add-frontend/templates/tsconfig.node.json +10 -0
- package/lib/generators/add-frontend/templates/vite.config.ts.template +70 -0
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.mjs +1 -1
- package/lib/utils/index.cjs +8 -0
- package/lib/utils/index.cjs.map +1 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.mjs +8 -0
- package/lib/utils/index.mjs.map +1 -0
- package/package.json +2 -2
- package/rollup.config.mjs +14 -5
- package/src/generators/{add-entries → add-backend}/generator.spec.ts +5 -5
- package/src/generators/add-backend/generator.ts +30 -0
- package/src/generators/add-backend/schema.d.ts +4 -0
- package/src/generators/add-backend/schema.json +17 -0
- package/src/generators/add-frontend/generator.spec.ts +20 -0
- package/src/generators/add-frontend/generator.ts +40 -0
- package/src/generators/add-frontend/schema.d.ts +5 -0
- package/src/generators/add-frontend/schema.json +21 -0
- package/src/index.ts +2 -2
- package/src/utils/index.ts +10 -0
- package/lib/generators/add-entries/generator.cjs +0 -55
- package/lib/generators/add-entries/generator.cjs.map +0 -1
- package/lib/generators/add-entries/generator.d.ts +0 -4
- package/lib/generators/add-entries/generator.mjs +0 -55
- package/lib/generators/add-entries/generator.mjs.map +0 -1
- package/lib/generators/add-entries/schema.json +0 -13
- package/src/generators/add-entries/files/common/AntStyles.tsx.template +0 -8
- package/src/generators/add-entries/files/common/createEmotionCache.ts.template +0 -7
- package/src/generators/add-entries/files/common/index.ts.template +0 -3
- package/src/generators/add-entries/files/common/utils.ts.template +0 -16
- package/src/generators/add-entries/generator.ts +0 -66
- package/src/generators/add-entries/schema.d.ts +0 -3
- package/src/generators/add-entries/schema.json +0 -13
- /package/lib/generators/{add-entries → add-backend}/generator.spec.d.ts +0 -0
- /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/antui/entry.client.tsx.template +0 -0
- /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/antui/entry.server.tsx.template +0 -0
- /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/antui/root.tsx.template +0 -0
- /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/context.tsx.template +0 -0
- /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/entry.client.tsx.template +0 -0
- /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/entry.server.tsx.template +0 -0
- /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/root.tsx.template +0 -0
- /package/lib/generators/{add-entries/files → add-frontend/templates/src}/common/AntStyles.tsx.template +0 -0
- /package/lib/generators/{add-entries/files → add-frontend/templates/src}/common/createEmotionCache.ts.template +0 -0
- /package/lib/generators/{add-entries/files → add-frontend/templates/src}/common/index.ts.template +0 -0
- /package/lib/generators/{add-entries/files → add-frontend/templates/src}/common/utils.ts.template +0 -0
- /package/src/generators/{add-entries/entries → add-frontend/frameworks}/antui/entry.client.tsx.template +0 -0
- /package/src/generators/{add-entries/entries → add-frontend/frameworks}/antui/entry.server.tsx.template +0 -0
- /package/src/generators/{add-entries/entries → add-frontend/frameworks}/antui/root.tsx.template +0 -0
- /package/src/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/context.tsx.template +0 -0
- /package/src/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/entry.client.tsx.template +0 -0
- /package/src/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/entry.server.tsx.template +0 -0
- /package/src/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/root.tsx.template +0 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/* eslint-disable import/namespace */
|
|
2
|
+
/* eslint-disable import/no-unresolved */
|
|
3
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
4
|
+
// version 08/25/2021
|
|
5
|
+
import * as http from 'http';
|
|
6
|
+
import * as express from 'express';
|
|
7
|
+
import { logger as serverLogger } from '@cdm-logger/server';
|
|
8
|
+
import { Feature } from '@common-stack/server-core';
|
|
9
|
+
import { ContainerModule, interfaces, Container } from 'inversify';
|
|
10
|
+
import { ServiceBroker, ServiceSettingSchema } from 'moleculer';
|
|
11
|
+
import { CommonType } from '@common-stack/core';
|
|
12
|
+
import { isEmpty } from 'lodash-es';
|
|
13
|
+
import { CdmLogger } from '@cdm-logger/core';
|
|
14
|
+
import { applyMiddleware } from 'graphql-middleware';
|
|
15
|
+
import { shield } from 'graphql-shield';
|
|
16
|
+
import { expressApp } from './express-app';
|
|
17
|
+
import { GraphqlServer } from './server-setup/graphql-server';
|
|
18
|
+
import { config } from './config';
|
|
19
|
+
import { ConnectionBroker } from './connectors/connection-broker';
|
|
20
|
+
import { brokerConfig } from './config/moleculer.config';
|
|
21
|
+
import modules, { settings } from './modules';
|
|
22
|
+
import { GatewaySchemaBuilder } from './api/schema-builder';
|
|
23
|
+
import { WebsocketMultiPathServer } from './server-setup/websocket-multipath-update';
|
|
24
|
+
import { IModuleService } from './interfaces';
|
|
25
|
+
import { migrate } from './utils/migrations';
|
|
26
|
+
import { InterNamespaceMiddleware } from './middleware/moleculer-inter-namespace';
|
|
27
|
+
// This is temp and will be replaced one we add support for rules in Feature
|
|
28
|
+
|
|
29
|
+
type ILogger = CdmLogger.ILogger;
|
|
30
|
+
|
|
31
|
+
function startListening(port) {
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
33
|
+
const server = this;
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
server.listen(port, resolve);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const infraModule = ({ broker, pubsub, mongoClient, logger }) =>
|
|
40
|
+
new ContainerModule((bind: interfaces.Bind) => {
|
|
41
|
+
bind('Logger').toConstantValue(logger);
|
|
42
|
+
bind(CommonType.LOGGER).toConstantValue(logger);
|
|
43
|
+
bind('Environment').toConstantValue(config.NODE_ENV || 'development');
|
|
44
|
+
bind(CommonType.ENVIRONMENT).toConstantValue(config.NODE_ENV || 'development');
|
|
45
|
+
bind('PubSub').toConstantValue(pubsub);
|
|
46
|
+
bind(CommonType.PUBSUB).toConstantValue(pubsub);
|
|
47
|
+
bind(CommonType.MOLECULER_BROKER).toConstantValue(broker);
|
|
48
|
+
bind('MoleculerBroker').toConstantValue(broker);
|
|
49
|
+
bind('MongoDBConnection').toConstantValue(mongoClient);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Controls the lifecycle of the Application Server
|
|
54
|
+
*
|
|
55
|
+
* @export
|
|
56
|
+
* @class StackServer
|
|
57
|
+
*/
|
|
58
|
+
export class StackServer {
|
|
59
|
+
public httpServer: http.Server & { startListening?: (port) => void };
|
|
60
|
+
|
|
61
|
+
private app: express.Express;
|
|
62
|
+
|
|
63
|
+
private logger: ILogger;
|
|
64
|
+
|
|
65
|
+
private connectionBroker: ConnectionBroker;
|
|
66
|
+
|
|
67
|
+
private mainserviceBroker: ServiceBroker;
|
|
68
|
+
|
|
69
|
+
private microserviceBroker: ServiceBroker;
|
|
70
|
+
|
|
71
|
+
private multiPathWebsocket: WebsocketMultiPathServer;
|
|
72
|
+
|
|
73
|
+
private serviceContainer: Container;
|
|
74
|
+
|
|
75
|
+
private microserviceContainer: Container;
|
|
76
|
+
|
|
77
|
+
constructor() {
|
|
78
|
+
this.logger = serverLogger.child({ className: 'StackServer' });
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public async initialize() {
|
|
82
|
+
this.logger.info('StackServer initializing');
|
|
83
|
+
|
|
84
|
+
// eslint-disable-next-line import/namespace
|
|
85
|
+
this.connectionBroker = new ConnectionBroker(brokerConfig.transporter, this.logger);
|
|
86
|
+
const redisClient = this.connectionBroker.redisDataloaderClient;
|
|
87
|
+
|
|
88
|
+
const mongoClient = await this.connectionBroker.mongoConnection;
|
|
89
|
+
|
|
90
|
+
// Moleculer Broker Setup
|
|
91
|
+
this.mainserviceBroker = new ServiceBroker({
|
|
92
|
+
...brokerConfig,
|
|
93
|
+
middlewares: [
|
|
94
|
+
InterNamespaceMiddleware([
|
|
95
|
+
{
|
|
96
|
+
namespace: 'api-admin',
|
|
97
|
+
transporter: brokerConfig.transporter,
|
|
98
|
+
},
|
|
99
|
+
]),
|
|
100
|
+
],
|
|
101
|
+
started: async () => {
|
|
102
|
+
await modules.preStart(this.serviceContainer);
|
|
103
|
+
if (config.NODE_ENV === 'development') {
|
|
104
|
+
// await modules.microservicePreStart(this.micorserviceContainer);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
this.logger.info('Starting Migration');
|
|
109
|
+
await migrate(mongoClient, this.serviceContainer, this.logger);
|
|
110
|
+
this.logger.info('End Migration');
|
|
111
|
+
} catch (e) {
|
|
112
|
+
this.logger.error('Error while running migrations', e);
|
|
113
|
+
this.logger.error(e.stack);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
await modules.postStart(this.serviceContainer);
|
|
118
|
+
} catch (e) {
|
|
119
|
+
this.logger.error('Error while running Post Start', e);
|
|
120
|
+
this.logger.error(e.stack);
|
|
121
|
+
}
|
|
122
|
+
// start DB migration
|
|
123
|
+
|
|
124
|
+
if (config.NODE_ENV === 'development') {
|
|
125
|
+
// await modules.microservicePostStart(this.micorserviceContainer);
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
// created,
|
|
130
|
+
async created() {
|
|
131
|
+
return Promise.resolve();
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
if (config.NODE_ENV === 'development') {
|
|
136
|
+
this.microserviceBroker = new ServiceBroker({
|
|
137
|
+
...brokerConfig,
|
|
138
|
+
nodeID: 'node-broker-2',
|
|
139
|
+
started: async () => {
|
|
140
|
+
await modules.microservicePreStart(this.microserviceContainer);
|
|
141
|
+
await modules.microservicePostStart(this.microserviceContainer);
|
|
142
|
+
},
|
|
143
|
+
// created,
|
|
144
|
+
created: async () => Promise.resolve(),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const pubsub = await this.connectionBroker.graphqlPubsub;
|
|
148
|
+
const InfraStructureFeature = new Feature({
|
|
149
|
+
createContainerFunc: [
|
|
150
|
+
() =>
|
|
151
|
+
infraModule({
|
|
152
|
+
broker: this.mainserviceBroker,
|
|
153
|
+
pubsub,
|
|
154
|
+
mongoClient,
|
|
155
|
+
logger: serverLogger,
|
|
156
|
+
}),
|
|
157
|
+
],
|
|
158
|
+
createServiceFunc: (container) => ({ moleculerBroker: container.get(CommonType.MOLECULER_BROKER) }),
|
|
159
|
+
createHemeraContainerFunc: [
|
|
160
|
+
() =>
|
|
161
|
+
infraModule({
|
|
162
|
+
broker: this.mainserviceBroker,
|
|
163
|
+
pubsub,
|
|
164
|
+
mongoClient,
|
|
165
|
+
logger: serverLogger,
|
|
166
|
+
}),
|
|
167
|
+
],
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const allModules = new Feature(InfraStructureFeature, modules as Feature);
|
|
171
|
+
let executableSchema = await new GatewaySchemaBuilder({
|
|
172
|
+
schema: allModules.schemas,
|
|
173
|
+
resolvers: allModules.createResolvers({
|
|
174
|
+
pubsub,
|
|
175
|
+
logger: serverLogger,
|
|
176
|
+
subscriptionID: `${settings.subTopic}`,
|
|
177
|
+
}),
|
|
178
|
+
directives: [],
|
|
179
|
+
directiveResolvers: allModules.createDirectives({ logger: this.logger }),
|
|
180
|
+
middlewares: allModules.graphqlMiddlewares,
|
|
181
|
+
rules: allModules.rules,
|
|
182
|
+
logger: serverLogger,
|
|
183
|
+
}).build();
|
|
184
|
+
|
|
185
|
+
// set the service container
|
|
186
|
+
this.serviceContainer = await allModules.createContainers({ ...settings, mongoConnection: mongoClient });
|
|
187
|
+
const createServiceContext = allModules.createServiceContext({ ...settings, mongoConnection: mongoClient });
|
|
188
|
+
const serviceBroker: IModuleService = {
|
|
189
|
+
serviceContainer: this.serviceContainer,
|
|
190
|
+
serviceContext: createServiceContext,
|
|
191
|
+
dataSource: allModules.createDataSource(),
|
|
192
|
+
defaultPreferences: allModules.createDefaultPreferences(),
|
|
193
|
+
createContext: async (req, res) => allModules.createContext(req, res),
|
|
194
|
+
logger: serverLogger,
|
|
195
|
+
schema: executableSchema,
|
|
196
|
+
};
|
|
197
|
+
allModules.loadMainMoleculerService({
|
|
198
|
+
broker: this.mainserviceBroker,
|
|
199
|
+
container: this.serviceContainer,
|
|
200
|
+
settings,
|
|
201
|
+
});
|
|
202
|
+
if (config.NODE_ENV === 'development') {
|
|
203
|
+
this.microserviceContainer = await allModules.createHemeraContainers({
|
|
204
|
+
...settings,
|
|
205
|
+
mongoConnection: mongoClient,
|
|
206
|
+
});
|
|
207
|
+
allModules.loadClientMoleculerService({
|
|
208
|
+
broker: this.microserviceBroker,
|
|
209
|
+
container: this.microserviceContainer,
|
|
210
|
+
settings,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// initialize Servers
|
|
215
|
+
this.httpServer = http.createServer();
|
|
216
|
+
this.app = await expressApp(serviceBroker, null, this.httpServer);
|
|
217
|
+
|
|
218
|
+
this.httpServer.startListening = startListening.bind(this.httpServer);
|
|
219
|
+
this.httpServer.on('request', this.app);
|
|
220
|
+
this.httpServer.on('close', () => {
|
|
221
|
+
this.httpServer = undefined;
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const customWebsocket = allModules.getWebsocketConfig();
|
|
225
|
+
const customWebsocketEnable = !isEmpty(customWebsocket);
|
|
226
|
+
|
|
227
|
+
if (customWebsocketEnable) {
|
|
228
|
+
this.multiPathWebsocket = new WebsocketMultiPathServer(serviceBroker, redisClient, customWebsocket);
|
|
229
|
+
this.httpServer = this.multiPathWebsocket.httpServerUpgrade(this.httpServer);
|
|
230
|
+
}
|
|
231
|
+
const graphqlServer = new GraphqlServer(
|
|
232
|
+
this.app,
|
|
233
|
+
this.httpServer,
|
|
234
|
+
redisClient,
|
|
235
|
+
serviceBroker,
|
|
236
|
+
!customWebsocketEnable,
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
await graphqlServer.initialize();
|
|
240
|
+
this.app.use('/graphql', (req, res, next) => {
|
|
241
|
+
res.append('Access-Control-Allow-Credentials', JSON.stringify(true));
|
|
242
|
+
res.append('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
|
|
243
|
+
res.append('Access-Control-Allow-Origin', '*');
|
|
244
|
+
res.append(
|
|
245
|
+
'Access-Control-Allow-Headers',
|
|
246
|
+
'X-Requested-With, X-HTTP-Method-Override, X-CSP-Nonce, Content-Type, Accept',
|
|
247
|
+
);
|
|
248
|
+
next();
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
public async start() {
|
|
253
|
+
if (config.NODE_ENV === 'development') {
|
|
254
|
+
await Promise.all([this.mainserviceBroker.start(), this.microserviceBroker.start()]);
|
|
255
|
+
} else {
|
|
256
|
+
await this.mainserviceBroker.start();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
public async cleanup() {
|
|
261
|
+
if (this.multiPathWebsocket) {
|
|
262
|
+
this.multiPathWebsocket.close();
|
|
263
|
+
}
|
|
264
|
+
if (this.httpServer) {
|
|
265
|
+
await this.httpServer.close();
|
|
266
|
+
}
|
|
267
|
+
if (this.connectionBroker) {
|
|
268
|
+
await this.connectionBroker.stop();
|
|
269
|
+
}
|
|
270
|
+
if (this.mainserviceBroker) {
|
|
271
|
+
await this.mainserviceBroker.stop();
|
|
272
|
+
}
|
|
273
|
+
if (this.microserviceBroker) {
|
|
274
|
+
await this.microserviceBroker.stop();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Schema, Connection } from 'mongoose';
|
|
2
|
+
import { Container } from 'inversify';
|
|
3
|
+
import { IDatabaseMigration } from '@adminide-stack/core';
|
|
4
|
+
import { CdmLogger } from '@cdm-logger/core';
|
|
5
|
+
|
|
6
|
+
export const MigrationSchema = new Schema({
|
|
7
|
+
migrated_at: Date,
|
|
8
|
+
name: { required: true, type: String },
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export async function migrate(db: Connection, container: Container, logger: CdmLogger.ILogger) {
|
|
12
|
+
try {
|
|
13
|
+
const migrations = container.getAll<IDatabaseMigration>('MongodbMigration');
|
|
14
|
+
const model = db.model<any, any>('Migration', MigrationSchema);
|
|
15
|
+
migrations.map(async (migration) => {
|
|
16
|
+
const exists = await model.findOne({ name: migration.id });
|
|
17
|
+
if (!exists) {
|
|
18
|
+
try {
|
|
19
|
+
await migration.up();
|
|
20
|
+
await model.create({ name: migration.id, migrated_at: new Date() });
|
|
21
|
+
} catch (e) {
|
|
22
|
+
console.log(`Can not process migration ${migration.id}: `, e);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return migration.id;
|
|
27
|
+
});
|
|
28
|
+
} catch (err) {
|
|
29
|
+
console.warn('ignoring migrate database due to ', err.message);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es2017",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"esModuleInterop": true, // Important for ESM interoperability
|
|
6
|
+
"moduleResolution": "node",
|
|
7
|
+
"jsx": "react",
|
|
8
|
+
"declaration": true,
|
|
9
|
+
"experimentalDecorators": true,
|
|
10
|
+
"preserveConstEnums": true,
|
|
11
|
+
"sourceMap": true,
|
|
12
|
+
"noImplicitAny": false,
|
|
13
|
+
"skipLibCheck": true,
|
|
14
|
+
"allowSyntheticDefaultImports": false,
|
|
15
|
+
"pretty": true,
|
|
16
|
+
"removeComments": false,
|
|
17
|
+
"lib": [
|
|
18
|
+
"es2017",
|
|
19
|
+
"dom",
|
|
20
|
+
"esnext.asynciterable"
|
|
21
|
+
],
|
|
22
|
+
"types": [
|
|
23
|
+
"@types/node",
|
|
24
|
+
"@types/jest"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
"include": [
|
|
28
|
+
"../../typings/*.d.ts"
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"sourceMap": true,
|
|
5
|
+
"declaration": false,
|
|
6
|
+
"allowSyntheticDefaultImports": true,
|
|
7
|
+
"rootDirs": ["./src","../knexfile.ts"],
|
|
8
|
+
"outDir": "./dist"
|
|
9
|
+
},
|
|
10
|
+
"include": [
|
|
11
|
+
"../../typings/*.d.ts",
|
|
12
|
+
],
|
|
13
|
+
"exclude": [
|
|
14
|
+
"node_modules",
|
|
15
|
+
"lib",
|
|
16
|
+
"dist",
|
|
17
|
+
"webpack.config.js"
|
|
18
|
+
]
|
|
19
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
process.env.ENV_FILE !== null && require('dotenv').config({ path: process.env.ENV_FILE });
|
|
2
|
+
const webpack = require('webpack');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
|
|
5
|
+
const nodeExternals = require('webpack-node-externals');
|
|
6
|
+
const NodemonPlugin = require('nodemon-webpack-plugin'); // Ding
|
|
7
|
+
const EnvListPlugin = require('@common-stack/env-list-loader');
|
|
8
|
+
const buildConfig = require('./build.config');
|
|
9
|
+
|
|
10
|
+
const modulenameExtra = process.env.BUILD_MODULE_TO_INCLUDE ? `${process.env.BUILD_MODULE_TO_INCLUDE}|` : '';
|
|
11
|
+
let modulenameRegex;
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
modulenameRegex = new RegExp(
|
|
15
|
+
`(${modulenameExtra}ts-invariant|webpack/hot/poll)|(\\.(css|less|scss|png|ico|jpg|gif|xml|woff|woff2|otf|ttf|eot|svg)(\\?[0-9a-z]+)?$)`,
|
|
16
|
+
);
|
|
17
|
+
console.log('Module Name Regex: ', modulenameRegex);
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.error('Error creating regex for module name: ', error);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (process.env.BUILD_MODULE_TO_INCLUDE) {
|
|
23
|
+
console.log('Build Module to include (BUILD_MODULE_TO_INCLUDE): ', process.env.BUILD_MODULE_TO_INCLUDE);
|
|
24
|
+
} else {
|
|
25
|
+
console.log('BUILD_MODULE_TO_INCLUDE is not set.');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const config = {
|
|
29
|
+
entry: {
|
|
30
|
+
index: (process.env.NODE_ENV !== 'production' ? ['webpack/hot/poll?200'] : []).concat([
|
|
31
|
+
// 'raf/polyfill',
|
|
32
|
+
'./src/index.ts',
|
|
33
|
+
]),
|
|
34
|
+
},
|
|
35
|
+
name: 'server',
|
|
36
|
+
module: {
|
|
37
|
+
rules: [
|
|
38
|
+
{
|
|
39
|
+
test: /\.(png|ico|jpg|gif|xml)$/,
|
|
40
|
+
use: { loader: 'url-loader', options: { name: '[hash].[ext]', limit: 100000 } },
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
test: /\.woff(2)?(\?[0-9a-z]+)?$/,
|
|
44
|
+
use: { loader: 'url-loader', options: { name: '[hash].[ext]', limit: 100000 } },
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
test: /\.(otf|ttf|eot|svg)(\?[0-9a-z]+)?$/,
|
|
48
|
+
use: { loader: 'file-loader', options: { name: '[hash].[ext]' } },
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
test: /\.css$/,
|
|
52
|
+
use: [
|
|
53
|
+
{ loader: 'isomorphic-style-loader' },
|
|
54
|
+
{ loader: 'css-loader', options: { sourceMap: true } },
|
|
55
|
+
{ loader: 'postcss-loader', options: { sourceMap: true } },
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
test: /\.scss$/,
|
|
60
|
+
use: [
|
|
61
|
+
{ loader: 'isomorphic-style-loader' },
|
|
62
|
+
{ loader: 'css-loader', options: { sourceMap: true } },
|
|
63
|
+
{ loader: 'postcss-loader', options: { sourceMap: true } },
|
|
64
|
+
{ loader: 'sass-loader', options: { sourceMap: true } },
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
test: /\.less$/,
|
|
69
|
+
use: [
|
|
70
|
+
{ loader: 'isomorphic-style-loader' },
|
|
71
|
+
{ loader: 'css-loader', options: { sourceMap: true } },
|
|
72
|
+
{ loader: 'postcss-loader', options: { sourceMap: true } },
|
|
73
|
+
{ loader: 'less-loader', options: { javascriptEnabled: true, sourceMap: true } },
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
{ test: /\.graphqls/, use: { loader: 'raw-loader' } },
|
|
77
|
+
{ test: /\.(graphql|gql)$/, use: [{ loader: 'graphql-tag/loader' }] },
|
|
78
|
+
// {
|
|
79
|
+
// test: /\.[tj]sx?$/,
|
|
80
|
+
// use: {
|
|
81
|
+
// loader: 'babel-loader',
|
|
82
|
+
// options: { babelrc: true, rootMode: 'upward-optional' },
|
|
83
|
+
// },
|
|
84
|
+
// },
|
|
85
|
+
{
|
|
86
|
+
test: /\.tsx?$/, // for TypeScript
|
|
87
|
+
loader: 'esbuild-loader',
|
|
88
|
+
options: {
|
|
89
|
+
loader: 'tsx', // Or 'ts' for TypeScript without JSX
|
|
90
|
+
target: 'es2015', // Specify ECMAScript target version
|
|
91
|
+
},
|
|
92
|
+
exclude: /node_modules/,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
test: /\.jsx?$/, // for JavaScript
|
|
96
|
+
loader: 'esbuild-loader',
|
|
97
|
+
options: {
|
|
98
|
+
loader: 'jsx', // Or 'js' for plain JavaScript
|
|
99
|
+
target: 'es2015',
|
|
100
|
+
},
|
|
101
|
+
exclude: /node_modules/,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
// searches for files ends with <dir>/config/env-config.js or <dir>/config/public-config.js
|
|
105
|
+
test: /config\/(env-config|public-config)\.(j|t)s/,
|
|
106
|
+
use: {
|
|
107
|
+
loader: '@common-stack/env-list-loader',
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{ test: /locales/, use: { loader: '@alienfast/i18next-loader' } },
|
|
111
|
+
],
|
|
112
|
+
unsafeCache: false,
|
|
113
|
+
},
|
|
114
|
+
resolve: {
|
|
115
|
+
symlinks: true,
|
|
116
|
+
cacheWithContext: false,
|
|
117
|
+
unsafeCache: false,
|
|
118
|
+
extensions: [
|
|
119
|
+
'.web.mjs',
|
|
120
|
+
'.web.js',
|
|
121
|
+
'.web.jsx',
|
|
122
|
+
'.web.ts',
|
|
123
|
+
'.web.tsx',
|
|
124
|
+
'.mjs',
|
|
125
|
+
'.js',
|
|
126
|
+
'.jsx',
|
|
127
|
+
'.ts',
|
|
128
|
+
'.tsx',
|
|
129
|
+
'.json',
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
watchOptions: { ignored: /dist/ },
|
|
133
|
+
output: {
|
|
134
|
+
pathinfo: false,
|
|
135
|
+
filename: 'index.js',
|
|
136
|
+
path: path.join(__dirname, 'dist'),
|
|
137
|
+
publicPath: '/',
|
|
138
|
+
sourceMapFilename: '[name].[chunkhash].js.map',
|
|
139
|
+
},
|
|
140
|
+
devtool: process.env.NODE_ENV === 'production' ? 'nosources-source-map' : 'cheap-module-source-map',
|
|
141
|
+
mode: process.env.NODE_ENV || 'development',
|
|
142
|
+
performance: { hints: false },
|
|
143
|
+
plugins: (process.env.NODE_ENV !== 'production'
|
|
144
|
+
? [
|
|
145
|
+
// new Dotenv(),
|
|
146
|
+
new webpack.HotModuleReplacementPlugin(),
|
|
147
|
+
new NodemonPlugin({ script: './dist/index.js' }),
|
|
148
|
+
]
|
|
149
|
+
: []
|
|
150
|
+
).concat([
|
|
151
|
+
// The plugin lists the environment that required as well recommendation about the keys used.
|
|
152
|
+
new EnvListPlugin.Plugin(),
|
|
153
|
+
new CleanWebpackPlugin({ cleanOnceBeforeBuildPatterns: ['dist'] }),
|
|
154
|
+
new webpack.BannerPlugin({ banner: 'require("source-map-support").install();', raw: true, entryOnly: true }),
|
|
155
|
+
new webpack.DefinePlugin(
|
|
156
|
+
Object.assign(
|
|
157
|
+
...Object.entries(buildConfig).map(([k, v]) => ({
|
|
158
|
+
[k]: typeof v !== 'string' ? v : `"${v.replace(/\\/g, '\\\\')}"`,
|
|
159
|
+
})),
|
|
160
|
+
),
|
|
161
|
+
),
|
|
162
|
+
// new CopyWebpackPlugin({
|
|
163
|
+
// patterns: [
|
|
164
|
+
// {
|
|
165
|
+
// from: '../../tools/esm-wrapper.js',
|
|
166
|
+
// to: 'index.js',
|
|
167
|
+
// },
|
|
168
|
+
// ],
|
|
169
|
+
// }),
|
|
170
|
+
]),
|
|
171
|
+
target: 'node',
|
|
172
|
+
externals: [
|
|
173
|
+
nodeExternals(),
|
|
174
|
+
nodeExternals({
|
|
175
|
+
modulesDir: path.resolve(__dirname, '../../node_modules'),
|
|
176
|
+
allowlist: [modulenameRegex],
|
|
177
|
+
}),
|
|
178
|
+
],
|
|
179
|
+
optimization: {
|
|
180
|
+
concatenateModules: false,
|
|
181
|
+
minimize: false,
|
|
182
|
+
},
|
|
183
|
+
node: { __dirname: true, __filename: true },
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
module.exports = config;
|