@common-stack/generate-plugin 5.0.4-alpha.5 → 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.
Files changed (142) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +42 -0
  3. package/generators.json +9 -4
  4. package/lib/generators/add-backend/files/CHANGELOG.md +196 -0
  5. package/lib/generators/add-backend/files/Dockerfile +30 -0
  6. package/lib/generators/add-backend/files/LICENSE +661 -0
  7. package/lib/generators/add-backend/files/README.md +133 -0
  8. package/lib/generators/add-backend/files/__tests__/test.ts.template +95 -0
  9. package/lib/generators/add-backend/files/babel.config.js +45 -0
  10. package/lib/generators/add-backend/files/build.config.js +14 -0
  11. package/lib/generators/add-backend/files/build.config.mjs +27 -0
  12. package/lib/generators/add-backend/files/generated-schema.graphql +235 -0
  13. package/lib/generators/add-backend/files/jest.config.js +27 -0
  14. package/lib/generators/add-backend/files/knexfile.js +63 -0
  15. package/lib/generators/add-backend/files/package.json +162 -0
  16. package/lib/generators/add-backend/files/src/api/remote-config.ts.template +11 -0
  17. package/lib/generators/add-backend/files/src/api/resolver.ts.template +15 -0
  18. package/lib/generators/add-backend/files/src/api/root-schema.graphqls +96 -0
  19. package/lib/generators/add-backend/files/src/api/scalar.ts.template +16 -0
  20. package/lib/generators/add-backend/files/src/api/schema-builder.ts.template +189 -0
  21. package/lib/generators/add-backend/files/src/api/utils.ts.template +44 -0
  22. package/lib/generators/add-backend/files/src/config/env-config.ts.template +34 -0
  23. package/lib/generators/add-backend/files/src/config/index.ts.template +1 -0
  24. package/lib/generators/add-backend/files/src/config/moleculer.config.ts.template +228 -0
  25. package/lib/generators/add-backend/files/src/connectors/connection-broker.ts.template +80 -0
  26. package/lib/generators/add-backend/files/src/connectors/graphql-pubsub-connector.ts.template +43 -0
  27. package/lib/generators/add-backend/files/src/connectors/mongo-connector.ts.template +78 -0
  28. package/lib/generators/add-backend/files/src/connectors/nats-connector.ts.template +82 -0
  29. package/lib/generators/add-backend/files/src/connectors/redis-connector.ts.template +73 -0
  30. package/lib/generators/add-backend/files/src/env.ts.template +5 -0
  31. package/lib/generators/add-backend/files/src/express-app.ts.template +67 -0
  32. package/lib/generators/add-backend/files/src/index.ts.template +56 -0
  33. package/lib/generators/add-backend/files/src/interfaces/index.ts.template +1 -0
  34. package/lib/generators/add-backend/files/src/interfaces/module-interface.ts.template +16 -0
  35. package/lib/generators/add-backend/files/src/main.spec.ts.template +129 -0
  36. package/lib/generators/add-backend/files/src/middleware/__tests__/cors.test.ts.template +12 -0
  37. package/lib/generators/add-backend/files/src/middleware/cors.ts.template +31 -0
  38. package/lib/generators/add-backend/files/src/middleware/error.ts.template +63 -0
  39. package/lib/generators/add-backend/files/src/middleware/moleculer-inter-namespace.ts.template +60 -0
  40. package/lib/generators/add-backend/files/src/middleware/persistedQuery.ts.template +40 -0
  41. package/lib/generators/add-backend/files/src/middleware/sentry.ts.template +9 -0
  42. package/lib/generators/add-backend/files/src/middleware/services.ts.template +16 -0
  43. package/lib/generators/add-backend/files/src/middleware/tracer.ts.template +24 -0
  44. package/lib/generators/add-backend/files/src/modules/auth/schema/auth-schema.graphql +25 -0
  45. package/lib/generators/add-backend/files/src/modules/index.ts.template +17 -0
  46. package/lib/generators/add-backend/files/src/modules/module.ts.template +78 -0
  47. package/lib/generators/add-backend/files/src/server-setup/graphql-server.ts.template +185 -0
  48. package/lib/generators/add-backend/files/src/server-setup/graphql-subscription-server.ts.template +113 -0
  49. package/lib/generators/add-backend/files/src/server-setup/graphql-ws.ts.template +158 -0
  50. package/lib/generators/add-backend/files/src/server-setup/mongodb-migration-update.ts.template +47 -0
  51. package/lib/generators/add-backend/files/src/server-setup/utils.ts.template +43 -0
  52. package/lib/generators/add-backend/files/src/server-setup/websocket-multipath-update.ts.template +88 -0
  53. package/lib/generators/add-backend/files/src/service.ts.template +36 -0
  54. package/lib/generators/add-backend/files/src/stack-server.ts.template +277 -0
  55. package/lib/generators/add-backend/files/src/utils/migrations.ts.template +32 -0
  56. package/lib/generators/add-backend/files/tsconfig.base.json +30 -0
  57. package/lib/generators/add-backend/files/tsconfig.json +19 -0
  58. package/lib/generators/add-backend/files/uploads/3986781.ppt +0 -0
  59. package/lib/generators/add-backend/files/webpack.config.js +186 -0
  60. package/lib/generators/add-backend/files/webpack.config.mjs +209 -0
  61. package/lib/generators/add-backend/generator.cjs +20 -0
  62. package/lib/generators/add-backend/generator.cjs.map +1 -0
  63. package/lib/generators/add-backend/generator.d.ts +4 -0
  64. package/lib/generators/add-backend/generator.mjs +20 -0
  65. package/lib/generators/add-backend/generator.mjs.map +1 -0
  66. package/lib/generators/add-backend/schema.json +17 -0
  67. package/lib/generators/add-frontend/generator.cjs +29 -0
  68. package/lib/generators/add-frontend/generator.cjs.map +1 -0
  69. package/lib/generators/add-frontend/generator.d.ts +4 -0
  70. package/lib/generators/add-frontend/generator.mjs +29 -0
  71. package/lib/generators/add-frontend/generator.mjs.map +1 -0
  72. package/lib/generators/add-frontend/generator.spec.d.ts +1 -0
  73. package/lib/generators/add-frontend/schema.json +21 -0
  74. package/lib/generators/add-frontend/templates/Dockerfile +30 -0
  75. package/lib/generators/add-frontend/templates/codecept.json +28 -0
  76. package/lib/generators/add-frontend/templates/config.json +58 -0
  77. package/lib/generators/add-frontend/templates/env.d.ts.template +9 -0
  78. package/lib/generators/add-frontend/templates/env.js +5 -0
  79. package/lib/generators/add-frontend/templates/favicon.ico +0 -0
  80. package/lib/generators/add-frontend/templates/jest.config.js +33 -0
  81. package/lib/generators/add-frontend/templates/package.json +182 -0
  82. package/lib/generators/add-frontend/templates/public/css/dashboard.css +491 -0
  83. package/lib/generators/add-frontend/templates/public/favicon.ico +0 -0
  84. package/lib/generators/add-frontend/templates/server.js +78 -0
  85. package/lib/generators/add-frontend/templates/src/config/public-config.ts.template +82 -0
  86. package/lib/generators/add-frontend/templates/tools/mergeConfig.js +34 -0
  87. package/lib/generators/add-frontend/templates/tsconfig.base.json +38 -0
  88. package/lib/generators/add-frontend/templates/tsconfig.json +32 -0
  89. package/lib/generators/add-frontend/templates/tsconfig.node.json +10 -0
  90. package/lib/generators/add-frontend/templates/vite.config.ts.template +70 -0
  91. package/lib/index.cjs +1 -1
  92. package/lib/index.d.ts +2 -1
  93. package/lib/index.mjs +1 -1
  94. package/lib/utils/index.cjs +8 -0
  95. package/lib/utils/index.cjs.map +1 -0
  96. package/lib/utils/index.d.ts +1 -0
  97. package/lib/utils/index.mjs +8 -0
  98. package/lib/utils/index.mjs.map +1 -0
  99. package/package.json +2 -2
  100. package/rollup.config.mjs +14 -5
  101. package/src/generators/{add-entries → add-backend}/generator.spec.ts +5 -5
  102. package/src/generators/add-backend/generator.ts +30 -0
  103. package/src/generators/add-backend/schema.d.ts +4 -0
  104. package/src/generators/add-backend/schema.json +17 -0
  105. package/src/generators/add-frontend/generator.spec.ts +20 -0
  106. package/src/generators/add-frontend/generator.ts +40 -0
  107. package/src/generators/add-frontend/schema.d.ts +5 -0
  108. package/src/generators/add-frontend/schema.json +21 -0
  109. package/src/index.ts +2 -2
  110. package/src/utils/index.ts +10 -0
  111. package/lib/generators/add-entries/generator.cjs +0 -55
  112. package/lib/generators/add-entries/generator.cjs.map +0 -1
  113. package/lib/generators/add-entries/generator.d.ts +0 -4
  114. package/lib/generators/add-entries/generator.mjs +0 -55
  115. package/lib/generators/add-entries/generator.mjs.map +0 -1
  116. package/lib/generators/add-entries/schema.json +0 -13
  117. package/src/generators/add-entries/files/common/AntStyles.tsx.template +0 -8
  118. package/src/generators/add-entries/files/common/createEmotionCache.ts.template +0 -7
  119. package/src/generators/add-entries/files/common/index.ts.template +0 -3
  120. package/src/generators/add-entries/files/common/utils.ts.template +0 -16
  121. package/src/generators/add-entries/generator.ts +0 -66
  122. package/src/generators/add-entries/schema.d.ts +0 -3
  123. package/src/generators/add-entries/schema.json +0 -13
  124. /package/lib/generators/{add-entries → add-backend}/generator.spec.d.ts +0 -0
  125. /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/antui/entry.client.tsx.template +0 -0
  126. /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/antui/entry.server.tsx.template +0 -0
  127. /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/antui/root.tsx.template +0 -0
  128. /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/context.tsx.template +0 -0
  129. /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/entry.client.tsx.template +0 -0
  130. /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/entry.server.tsx.template +0 -0
  131. /package/lib/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/root.tsx.template +0 -0
  132. /package/lib/generators/{add-entries/files → add-frontend/templates/src}/common/AntStyles.tsx.template +0 -0
  133. /package/lib/generators/{add-entries/files → add-frontend/templates/src}/common/createEmotionCache.ts.template +0 -0
  134. /package/lib/generators/{add-entries/files → add-frontend/templates/src}/common/index.ts.template +0 -0
  135. /package/lib/generators/{add-entries/files → add-frontend/templates/src}/common/utils.ts.template +0 -0
  136. /package/src/generators/{add-entries/entries → add-frontend/frameworks}/antui/entry.client.tsx.template +0 -0
  137. /package/src/generators/{add-entries/entries → add-frontend/frameworks}/antui/entry.server.tsx.template +0 -0
  138. /package/src/generators/{add-entries/entries → add-frontend/frameworks}/antui/root.tsx.template +0 -0
  139. /package/src/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/context.tsx.template +0 -0
  140. /package/src/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/entry.client.tsx.template +0 -0
  141. /package/src/generators/{add-entries/entries → add-frontend/frameworks}/chakraui/entry.server.tsx.template +0 -0
  142. /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
+ }
@@ -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;