@common-stack/generate-plugin 5.0.4-alpha.9 → 5.0.5-alpha.0
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 +48 -0
- package/README.md +42 -0
- package/generators.json +5 -0
- 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/generator.spec.d.ts +1 -0
- package/lib/generators/add-backend/schema.json +17 -0
- package/lib/generators/add-frontend/generator.cjs +3 -12
- package/lib/generators/add-frontend/generator.cjs.map +1 -1
- package/lib/generators/add-frontend/generator.mjs +2 -11
- package/lib/generators/add-frontend/generator.mjs.map +1 -1
- package/lib/generators/add-frontend/templates/package.json +23 -24
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -0
- 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 +6 -4
- package/src/generators/add-backend/generator.spec.ts +20 -0
- 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.ts +2 -12
- package/src/index.ts +1 -1
- package/src/utils/index.ts +10 -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;
|