@live-change/cli 0.7.39 → 0.8.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/bin/lcli.js +2 -319
- package/index.js +2 -0
- package/lib/starter.js +338 -0
- package/package.json +13 -12
package/bin/lcli.js
CHANGED
|
@@ -1,321 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
require('dotenv').config()
|
|
3
|
-
const express = require("express")
|
|
4
|
-
const path = require('path')
|
|
5
|
-
const http = require("http")
|
|
6
|
-
const { createProxyMiddleware } = require('http-proxy-middleware')
|
|
7
|
-
const { readFile } = require('fs').promises
|
|
1
|
+
import starter from '../lib/starter.js'
|
|
8
2
|
|
|
9
|
-
|
|
3
|
+
starter()
|
|
10
4
|
|
|
11
|
-
const {
|
|
12
|
-
|
|
13
|
-
SsrServer,
|
|
14
|
-
|
|
15
|
-
createLoopbackDao,
|
|
16
|
-
setupApiServer,
|
|
17
|
-
setupApiSockJs,
|
|
18
|
-
setupApiWs,
|
|
19
|
-
setupApp,
|
|
20
|
-
setupApiEndpoints
|
|
21
|
-
|
|
22
|
-
} = require("@live-change/server")
|
|
23
|
-
|
|
24
|
-
process.on('unhandledRejection', (reason, p) => {
|
|
25
|
-
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason)
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
process.on('uncaughtException', function (err) {
|
|
29
|
-
console.error(err.stack)
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
function startOptions(yargs) {
|
|
33
|
-
yargs.option('withServices', {
|
|
34
|
-
type: 'boolean',
|
|
35
|
-
description: 'start all services'
|
|
36
|
-
})
|
|
37
|
-
yargs.options('updateServices', {
|
|
38
|
-
type: 'boolean',
|
|
39
|
-
description: 'update all services'
|
|
40
|
-
})
|
|
41
|
-
yargs.option('withDb', {
|
|
42
|
-
type: 'boolean',
|
|
43
|
-
description: 'start local database'
|
|
44
|
-
})
|
|
45
|
-
yargs.option('dbBackend', {
|
|
46
|
-
type: 'string',
|
|
47
|
-
description: 'select db backend engine ( lmdb | leveldb | rocksdb | memdown | mem )',
|
|
48
|
-
default: 'lmdb'
|
|
49
|
-
})
|
|
50
|
-
yargs.option('dbBackendUrl', {
|
|
51
|
-
type: 'string',
|
|
52
|
-
description: 'database backend url parameter'
|
|
53
|
-
})
|
|
54
|
-
yargs.option('dbRoot', {
|
|
55
|
-
type: 'string',
|
|
56
|
-
description: 'database root directory',
|
|
57
|
-
default: 'tmp.db'
|
|
58
|
-
})
|
|
59
|
-
yargs.option('createDb', {
|
|
60
|
-
type: 'boolean',
|
|
61
|
-
description: 'create database if not exists'
|
|
62
|
-
})
|
|
63
|
-
yargs.option('dbAccess', {
|
|
64
|
-
type: 'boolean',
|
|
65
|
-
description: 'give database access to frontend(only for development and db-admin)'
|
|
66
|
-
})
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function apiServerOptions(yargs) {
|
|
70
|
-
yargs.option('apiPort', {
|
|
71
|
-
describe: 'api server port',
|
|
72
|
-
type: 'number',
|
|
73
|
-
default: process.env.API_SERVER_PORT || 8002
|
|
74
|
-
})
|
|
75
|
-
yargs.option('apiHost', {
|
|
76
|
-
describe: 'api server bind host',
|
|
77
|
-
type: 'string',
|
|
78
|
-
default: process.env.API_SERVER_HOST || '0.0.0.0'
|
|
79
|
-
})
|
|
80
|
-
yargs.option('services', {
|
|
81
|
-
describe: 'services config',
|
|
82
|
-
type: 'string',
|
|
83
|
-
default: 'server/services.config.js'
|
|
84
|
-
})
|
|
85
|
-
yargs.option('initScript', {
|
|
86
|
-
description: 'run init script',
|
|
87
|
-
type: 'string'
|
|
88
|
-
})
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function ssrServerOptions(yargs) {
|
|
92
|
-
yargs.option('ssrRoot', {
|
|
93
|
-
describe: 'frontend root directory',
|
|
94
|
-
type: 'string',
|
|
95
|
-
default: './front'
|
|
96
|
-
})
|
|
97
|
-
yargs.option('ssrPort', {
|
|
98
|
-
describe: 'port to bind on',
|
|
99
|
-
type: 'number',
|
|
100
|
-
default: process.env.SSR_SERVER_PORT || 8001
|
|
101
|
-
})
|
|
102
|
-
yargs.option('ssrHost', {
|
|
103
|
-
describe: 'bind host',
|
|
104
|
-
type: 'string',
|
|
105
|
-
default: process.env.SSR_SERVER_HOST || '0.0.0.0'
|
|
106
|
-
})
|
|
107
|
-
yargs.option('withApi', {
|
|
108
|
-
describe: 'start internal api server',
|
|
109
|
-
type: 'boolean'
|
|
110
|
-
})
|
|
111
|
-
yargs.option('serverEntry', {
|
|
112
|
-
describe: 'front ssr entry file',
|
|
113
|
-
type: 'string'
|
|
114
|
-
})
|
|
115
|
-
yargs.option('templatePath', {
|
|
116
|
-
describe: 'front ssr entry file',
|
|
117
|
-
type: 'string'
|
|
118
|
-
})
|
|
119
|
-
yargs.option('version', {
|
|
120
|
-
describe: 'server version',
|
|
121
|
-
type: 'string'
|
|
122
|
-
})
|
|
123
|
-
yargs.option('versionFile', {
|
|
124
|
-
describe: 'server version file',
|
|
125
|
-
type: 'string'
|
|
126
|
-
})
|
|
127
|
-
yargs.option('plugin', {
|
|
128
|
-
describe: 'start in plugin mode - without ssr, and with vite mode plugin',
|
|
129
|
-
type: 'boolean'
|
|
130
|
-
})
|
|
131
|
-
yargs.option('mode', {
|
|
132
|
-
describe: 'vite mode',
|
|
133
|
-
type: 'string'
|
|
134
|
-
})
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const argv = require('yargs') // eslint-disable-line
|
|
138
|
-
.command('apiServer', 'start server', (yargs) => {
|
|
139
|
-
apiServerOptions(yargs)
|
|
140
|
-
startOptions(yargs)
|
|
141
|
-
}, async (argv) => {
|
|
142
|
-
await setupApp({ ...argv, uidBorders: '[]' })
|
|
143
|
-
await apiServer(argv)
|
|
144
|
-
})
|
|
145
|
-
.command('devApiServer', 'shortcut for apiServer --withServices --updateServices', (yargs) => {
|
|
146
|
-
apiServerOptions(yargs)
|
|
147
|
-
startOptions(yargs)
|
|
148
|
-
}, async (argv) => {
|
|
149
|
-
argv = {
|
|
150
|
-
...argv,
|
|
151
|
-
withServices: true, updateServices: true
|
|
152
|
-
}
|
|
153
|
-
await setupApp({ ...argv, uidBorders: '[]' })
|
|
154
|
-
await apiServer(argv)
|
|
155
|
-
})
|
|
156
|
-
.command('memApiServer', 'shortcut for devApiServer --withDb --dbBackend mem --createDb', (yargs) => {
|
|
157
|
-
apiServerOptions(yargs)
|
|
158
|
-
startOptions(yargs)
|
|
159
|
-
}, async (argv) => {
|
|
160
|
-
argv = {
|
|
161
|
-
...argv,
|
|
162
|
-
withApi: true, withServices: true, updateServices: true,
|
|
163
|
-
withDb: true, dbBackend: 'mem', createDb: true
|
|
164
|
-
}
|
|
165
|
-
await setupApp({ ...argv, uidBorders: '[]' })
|
|
166
|
-
await apiServer(argv)
|
|
167
|
-
})
|
|
168
|
-
.command('ssrServer', 'start ssr server', (yargs) => {
|
|
169
|
-
ssrServerOptions(yargs)
|
|
170
|
-
apiServerOptions(yargs)
|
|
171
|
-
startOptions(yargs)
|
|
172
|
-
}, async (argv) => {
|
|
173
|
-
await setupApp({ ...argv, uidBorders: '[]' })
|
|
174
|
-
await server({ ...argv, uidBorders: '[]' }, false)
|
|
175
|
-
})
|
|
176
|
-
.command('server', 'start server', (yargs) => {
|
|
177
|
-
ssrServerOptions(yargs)
|
|
178
|
-
apiServerOptions(yargs)
|
|
179
|
-
startOptions(yargs)
|
|
180
|
-
}, async (argv) => {
|
|
181
|
-
await setupApp({ ...argv, uidBorders: '[]' })
|
|
182
|
-
await server({ ...argv, uidBorders: '[]' }, false)
|
|
183
|
-
})
|
|
184
|
-
.command('ssrDev', 'start ssr server in development mode', (yargs) => {
|
|
185
|
-
ssrServerOptions(yargs)
|
|
186
|
-
apiServerOptions(yargs)
|
|
187
|
-
startOptions(yargs)
|
|
188
|
-
}, async (argv) => {
|
|
189
|
-
await setupApp({ ...argv, uidBorders: '[]' })
|
|
190
|
-
await server({ ...argv, uidBorders: '[]' }, true)
|
|
191
|
-
})
|
|
192
|
-
.command('dev', 'shortcut for ssrDev --withApi --withServices --updateServices --createDb', (yargs) => {
|
|
193
|
-
ssrServerOptions(yargs)
|
|
194
|
-
apiServerOptions(yargs)
|
|
195
|
-
startOptions(yargs)
|
|
196
|
-
}, async (argv) => {
|
|
197
|
-
argv = {
|
|
198
|
-
...argv,
|
|
199
|
-
withApi: true, withServices: true, updateServices: true, createDb: true,
|
|
200
|
-
}
|
|
201
|
-
await setupApp({ ...argv, uidBorders: '[]' })
|
|
202
|
-
await server({ ...argv, uidBorders: '[]' }, true)
|
|
203
|
-
})
|
|
204
|
-
.command('memDev', 'shortcut for dev --withDb --dbBackend mem --createDb', (yargs) => {
|
|
205
|
-
ssrServerOptions(yargs)
|
|
206
|
-
apiServerOptions(yargs)
|
|
207
|
-
startOptions(yargs)
|
|
208
|
-
}, async (argv) => {
|
|
209
|
-
argv = {
|
|
210
|
-
...argv,
|
|
211
|
-
withApi: true, withServices: true, updateServices: true,
|
|
212
|
-
withDb: true, dbBackend: 'mem', createDb: true
|
|
213
|
-
}
|
|
214
|
-
await setupApp({ ...argv, uidBorders: '[]' })
|
|
215
|
-
await server({ ...argv, uidBorders: '[]' }, true)
|
|
216
|
-
})
|
|
217
|
-
.command('localDev', 'shortcut for dev --withDb --createDb', (yargs) => {
|
|
218
|
-
ssrServerOptions(yargs)
|
|
219
|
-
apiServerOptions(yargs)
|
|
220
|
-
startOptions(yargs)
|
|
221
|
-
}, async (argv) => {
|
|
222
|
-
argv = {
|
|
223
|
-
...argv,
|
|
224
|
-
withApi: true, withServices: true, updateServices: true,
|
|
225
|
-
withDb: true, createDb: true
|
|
226
|
-
}
|
|
227
|
-
await setupApp({ ...argv, uidBorders: '[]' })
|
|
228
|
-
await server({ ...argv, uidBorders: '[]' }, true)
|
|
229
|
-
})
|
|
230
|
-
.option('verbose', {
|
|
231
|
-
alias: 'v',
|
|
232
|
-
type: 'boolean',
|
|
233
|
-
description: 'Run with verbose logging'
|
|
234
|
-
}).argv
|
|
235
|
-
/// TODO api.gen.js generation command
|
|
236
|
-
|
|
237
|
-
async function apiServer(argv) {
|
|
238
|
-
const { apiPort, apiHost } = argv
|
|
239
|
-
|
|
240
|
-
const apiServer = await setupApiServer(argv)
|
|
241
|
-
|
|
242
|
-
const expressApp = express()
|
|
243
|
-
|
|
244
|
-
await setupApiEndpoints(expressApp, apiServer)
|
|
245
|
-
|
|
246
|
-
const httpServer = http.createServer(expressApp)
|
|
247
|
-
|
|
248
|
-
setupApiWs(httpServer, apiServer)
|
|
249
|
-
setupApiSockJs(httpServer, apiServer)
|
|
250
|
-
|
|
251
|
-
httpServer.listen(apiPort, apiHost)
|
|
252
|
-
console.log('Listening on port ' + apiPort)
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
async function server(argv, dev) {
|
|
256
|
-
const { ssrRoot, ssrPort, ssrHost, apiHost, apiPort } = argv
|
|
257
|
-
|
|
258
|
-
const fastAuth = true
|
|
259
|
-
|
|
260
|
-
const expressApp = express()
|
|
261
|
-
|
|
262
|
-
//expressApp.use('/static', express.static(path.resolve(ssrRoot, 'public')))
|
|
263
|
-
|
|
264
|
-
const manifest = (dev || argv.spa) ? null : require(path.resolve(ssrRoot, 'dist/client/ssr-manifest.json'))
|
|
265
|
-
|
|
266
|
-
if(!argv.version) argv.version = process.env.VERSION
|
|
267
|
-
if(argv.versionFile) argv.version = await readFile(argv.versionFile, 'utf8')
|
|
268
|
-
|
|
269
|
-
if(!argv.withApi) {
|
|
270
|
-
const apiServerHost = (argv.apiHost == '0.0.0.0' ? 'localhost' : argv.apiHost) + ':' + argv.apiPort
|
|
271
|
-
const target = `http://${apiServerHost}/`
|
|
272
|
-
const apiProxy = createProxyMiddleware({
|
|
273
|
-
target,
|
|
274
|
-
changeOrigin: true,
|
|
275
|
-
ws: true
|
|
276
|
-
})
|
|
277
|
-
expressApp.use('/api', apiProxy)
|
|
278
|
-
console.log("PROXY /api to", target)
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
let apiServer
|
|
282
|
-
if(argv.withApi) {
|
|
283
|
-
apiServer = await setupApiServer({ ...argv, fastAuth })
|
|
284
|
-
await setupApiEndpoints(expressApp, apiServer)
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
console.log("ENDPOINTS INSTALLED! CREATING WEB SERVER!")
|
|
288
|
-
|
|
289
|
-
const ssrServer = new SsrServer(expressApp, manifest, {
|
|
290
|
-
...argv,
|
|
291
|
-
dev,
|
|
292
|
-
fastAuth,
|
|
293
|
-
root: ssrRoot || '.',
|
|
294
|
-
...(apiServer
|
|
295
|
-
? {
|
|
296
|
-
daoFactory: async (credentials, ip) => {
|
|
297
|
-
return await createLoopbackDao(credentials, () => apiServer.daoFactory(credentials, ip))
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
: {
|
|
301
|
-
apiHost, apiPort
|
|
302
|
-
}
|
|
303
|
-
)
|
|
304
|
-
})
|
|
305
|
-
await ssrServer.start()
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
console.log("SSR INSTALLED! CREATING HTTP SERVER!")
|
|
309
|
-
|
|
310
|
-
const httpServer = http.createServer(expressApp)
|
|
311
|
-
if(argv.withApi) {
|
|
312
|
-
setupApiWs(httpServer, apiServer)
|
|
313
|
-
setupApiSockJs(httpServer, apiServer)
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
console.log("HTTP SERVER CREATED! INSTALLING!")
|
|
317
|
-
|
|
318
|
-
httpServer.listen(ssrPort, ssrHost)
|
|
319
|
-
|
|
320
|
-
console.log("LISTENING ON ",`${ssrHost}:${ssrPort} link: http://${ssrHost}:${ssrPort}/`)
|
|
321
|
-
}
|
package/index.js
CHANGED
package/lib/starter.js
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import dotenv from 'dotenv'
|
|
3
|
+
dotenv.config()
|
|
4
|
+
import express from 'express'
|
|
5
|
+
import path from 'path'
|
|
6
|
+
import http from 'http'
|
|
7
|
+
import fs from 'fs'
|
|
8
|
+
import yargs from 'yargs'
|
|
9
|
+
|
|
10
|
+
import { createProxyMiddleware } from 'http-proxy-middleware'
|
|
11
|
+
import { readFile } from 'fs/promises'
|
|
12
|
+
import App from '@live-change/framework'
|
|
13
|
+
const app = App.app()
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
|
|
17
|
+
SsrServer,
|
|
18
|
+
|
|
19
|
+
createLoopbackDao,
|
|
20
|
+
setupApiServer,
|
|
21
|
+
setupApiSockJs,
|
|
22
|
+
setupApiWs,
|
|
23
|
+
setupApp,
|
|
24
|
+
setupApiEndpoints
|
|
25
|
+
|
|
26
|
+
} from "@live-change/server"
|
|
27
|
+
|
|
28
|
+
process.on('unhandledRejection', (reason, p) => {
|
|
29
|
+
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason)
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
process.on('uncaughtException', function (err) {
|
|
33
|
+
console.error(err.stack)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
function startOptions(yargs) {
|
|
37
|
+
yargs.option('withServices', {
|
|
38
|
+
type: 'boolean',
|
|
39
|
+
description: 'start all services'
|
|
40
|
+
})
|
|
41
|
+
yargs.options('updateServices', {
|
|
42
|
+
type: 'boolean',
|
|
43
|
+
description: 'update all services'
|
|
44
|
+
})
|
|
45
|
+
yargs.option('withDb', {
|
|
46
|
+
type: 'boolean',
|
|
47
|
+
description: 'start local database'
|
|
48
|
+
})
|
|
49
|
+
yargs.option('dbBackend', {
|
|
50
|
+
type: 'string',
|
|
51
|
+
description: 'select db backend engine ( lmdb | leveldb | rocksdb | memdown | mem )',
|
|
52
|
+
default: 'lmdb'
|
|
53
|
+
})
|
|
54
|
+
yargs.option('dbBackendUrl', {
|
|
55
|
+
type: 'string',
|
|
56
|
+
description: 'database backend url parameter'
|
|
57
|
+
})
|
|
58
|
+
yargs.option('dbRoot', {
|
|
59
|
+
type: 'string',
|
|
60
|
+
description: 'database root directory',
|
|
61
|
+
default: 'tmp.db'
|
|
62
|
+
})
|
|
63
|
+
yargs.option('createDb', {
|
|
64
|
+
type: 'boolean',
|
|
65
|
+
description: 'create database if not exists'
|
|
66
|
+
})
|
|
67
|
+
yargs.option('dbAccess', {
|
|
68
|
+
type: 'boolean',
|
|
69
|
+
description: 'give database access to frontend(only for development and db-admin)'
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function apiServerOptions(yargs) {
|
|
74
|
+
yargs.option('apiPort', {
|
|
75
|
+
describe: 'api server port',
|
|
76
|
+
type: 'number',
|
|
77
|
+
default: process.env.API_SERVER_PORT || 8002
|
|
78
|
+
})
|
|
79
|
+
yargs.option('apiHost', {
|
|
80
|
+
describe: 'api server bind host',
|
|
81
|
+
type: 'string',
|
|
82
|
+
default: process.env.API_SERVER_HOST || '0.0.0.0'
|
|
83
|
+
})
|
|
84
|
+
yargs.option('services', {
|
|
85
|
+
describe: 'services config',
|
|
86
|
+
type: 'string',
|
|
87
|
+
default: 'server/services.config.js'
|
|
88
|
+
})
|
|
89
|
+
yargs.option('initScript', {
|
|
90
|
+
description: 'run init script',
|
|
91
|
+
type: 'string'
|
|
92
|
+
})
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function ssrServerOptions(yargs) {
|
|
96
|
+
yargs.option('ssrRoot', {
|
|
97
|
+
describe: 'frontend root directory',
|
|
98
|
+
type: 'string',
|
|
99
|
+
default: './front'
|
|
100
|
+
})
|
|
101
|
+
yargs.option('ssrPort', {
|
|
102
|
+
describe: 'port to bind on',
|
|
103
|
+
type: 'number',
|
|
104
|
+
default: process.env.SSR_SERVER_PORT || 8001
|
|
105
|
+
})
|
|
106
|
+
yargs.option('ssrHost', {
|
|
107
|
+
describe: 'bind host',
|
|
108
|
+
type: 'string',
|
|
109
|
+
default: process.env.SSR_SERVER_HOST || '0.0.0.0'
|
|
110
|
+
})
|
|
111
|
+
yargs.option('withApi', {
|
|
112
|
+
describe: 'start internal api server',
|
|
113
|
+
type: 'boolean'
|
|
114
|
+
})
|
|
115
|
+
yargs.option('serverEntry', {
|
|
116
|
+
describe: 'front ssr entry file',
|
|
117
|
+
type: 'string'
|
|
118
|
+
})
|
|
119
|
+
yargs.option('templatePath', {
|
|
120
|
+
describe: 'front ssr entry file',
|
|
121
|
+
type: 'string'
|
|
122
|
+
})
|
|
123
|
+
yargs.option('version', {
|
|
124
|
+
describe: 'server version',
|
|
125
|
+
type: 'string'
|
|
126
|
+
})
|
|
127
|
+
yargs.option('versionFile', {
|
|
128
|
+
describe: 'server version file',
|
|
129
|
+
type: 'string'
|
|
130
|
+
})
|
|
131
|
+
yargs.option('plugin', {
|
|
132
|
+
describe: 'start in plugin mode - without ssr, and with vite mode plugin',
|
|
133
|
+
type: 'boolean'
|
|
134
|
+
})
|
|
135
|
+
yargs.option('mode', {
|
|
136
|
+
describe: 'vite mode',
|
|
137
|
+
type: 'string'
|
|
138
|
+
})
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
let globalServicesConfig
|
|
142
|
+
|
|
143
|
+
export default function starter(servicesConfig = null) {
|
|
144
|
+
globalServicesConfig = servicesConfig
|
|
145
|
+
yargs(process.argv.slice(2))
|
|
146
|
+
.command('apiServer', 'start server', (yargs) => {
|
|
147
|
+
apiServerOptions(yargs)
|
|
148
|
+
startOptions(yargs)
|
|
149
|
+
}, async (argv) => {
|
|
150
|
+
await setupApp({...argv, uidBorders: '[]'})
|
|
151
|
+
await apiServer(argv)
|
|
152
|
+
})
|
|
153
|
+
.command('devApiServer', 'shortcut for apiServer --withServices --updateServices', (yargs) => {
|
|
154
|
+
apiServerOptions(yargs)
|
|
155
|
+
startOptions(yargs)
|
|
156
|
+
}, async (argv) => {
|
|
157
|
+
argv = {
|
|
158
|
+
...argv,
|
|
159
|
+
withServices: true, updateServices: true
|
|
160
|
+
}
|
|
161
|
+
await setupApp({...argv, uidBorders: '[]'})
|
|
162
|
+
await apiServer(argv)
|
|
163
|
+
})
|
|
164
|
+
.command('memApiServer', 'shortcut for devApiServer --withDb --dbBackend mem --createDb', (yargs) => {
|
|
165
|
+
apiServerOptions(yargs)
|
|
166
|
+
startOptions(yargs)
|
|
167
|
+
}, async (argv) => {
|
|
168
|
+
argv = {
|
|
169
|
+
...argv,
|
|
170
|
+
withApi: true, withServices: true, updateServices: true,
|
|
171
|
+
withDb: true, dbBackend: 'mem', createDb: true
|
|
172
|
+
}
|
|
173
|
+
await setupApp({...argv, uidBorders: '[]'})
|
|
174
|
+
await apiServer(argv)
|
|
175
|
+
})
|
|
176
|
+
.command('ssrServer', 'start ssr server', (yargs) => {
|
|
177
|
+
ssrServerOptions(yargs)
|
|
178
|
+
apiServerOptions(yargs)
|
|
179
|
+
startOptions(yargs)
|
|
180
|
+
}, async (argv) => {
|
|
181
|
+
await setupApp({...argv, uidBorders: '[]'})
|
|
182
|
+
await server({...argv, uidBorders: '[]'}, false)
|
|
183
|
+
})
|
|
184
|
+
.command('server', 'start server', (yargs) => {
|
|
185
|
+
ssrServerOptions(yargs)
|
|
186
|
+
apiServerOptions(yargs)
|
|
187
|
+
startOptions(yargs)
|
|
188
|
+
}, async (argv) => {
|
|
189
|
+
await setupApp({...argv, uidBorders: '[]'})
|
|
190
|
+
await server({...argv, uidBorders: '[]'}, false)
|
|
191
|
+
})
|
|
192
|
+
.command('ssrDev', 'start ssr server in development mode', (yargs) => {
|
|
193
|
+
ssrServerOptions(yargs)
|
|
194
|
+
apiServerOptions(yargs)
|
|
195
|
+
startOptions(yargs)
|
|
196
|
+
}, async (argv) => {
|
|
197
|
+
await setupApp({...argv, uidBorders: '[]'})
|
|
198
|
+
await server({...argv, uidBorders: '[]'}, true)
|
|
199
|
+
})
|
|
200
|
+
.command('dev', 'shortcut for ssrDev --withApi --withServices --updateServices --createDb', (yargs) => {
|
|
201
|
+
ssrServerOptions(yargs)
|
|
202
|
+
apiServerOptions(yargs)
|
|
203
|
+
startOptions(yargs)
|
|
204
|
+
}, async (argv) => {
|
|
205
|
+
argv = {
|
|
206
|
+
...argv,
|
|
207
|
+
withApi: true, withServices: true, updateServices: true, createDb: true,
|
|
208
|
+
}
|
|
209
|
+
await setupApp({...argv, uidBorders: '[]'})
|
|
210
|
+
await server({...argv, uidBorders: '[]'}, true)
|
|
211
|
+
})
|
|
212
|
+
.command('memDev', 'shortcut for dev --withDb --dbBackend mem --createDb', (yargs) => {
|
|
213
|
+
ssrServerOptions(yargs)
|
|
214
|
+
apiServerOptions(yargs)
|
|
215
|
+
startOptions(yargs)
|
|
216
|
+
}, async (argv) => {
|
|
217
|
+
argv = {
|
|
218
|
+
...argv,
|
|
219
|
+
withApi: true, withServices: true, updateServices: true,
|
|
220
|
+
withDb: true, dbBackend: 'mem', createDb: true
|
|
221
|
+
}
|
|
222
|
+
await setupApp({...argv, uidBorders: '[]'})
|
|
223
|
+
await server({...argv, uidBorders: '[]'}, true)
|
|
224
|
+
})
|
|
225
|
+
.command('localDev', 'shortcut for dev --withDb --createDb', (yargs) => {
|
|
226
|
+
ssrServerOptions(yargs)
|
|
227
|
+
apiServerOptions(yargs)
|
|
228
|
+
startOptions(yargs)
|
|
229
|
+
}, async (argv) => {
|
|
230
|
+
argv = {
|
|
231
|
+
...argv,
|
|
232
|
+
withApi: true, withServices: true, updateServices: true,
|
|
233
|
+
withDb: true, createDb: true
|
|
234
|
+
}
|
|
235
|
+
await setupApp({...argv, uidBorders: '[]'})
|
|
236
|
+
await server({...argv, uidBorders: '[]'}, true)
|
|
237
|
+
})
|
|
238
|
+
.option('verbose', {
|
|
239
|
+
alias: 'v',
|
|
240
|
+
type: 'boolean',
|
|
241
|
+
description: 'Run with verbose logging'
|
|
242
|
+
}).argv
|
|
243
|
+
/// TODO api.gen.js generation command
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
async function apiServer(argv) {
|
|
248
|
+
if(globalServicesConfig) argv.services = globalServicesConfig
|
|
249
|
+
|
|
250
|
+
const { apiPort, apiHost } = argv
|
|
251
|
+
|
|
252
|
+
const apiServer = await setupApiServer(argv)
|
|
253
|
+
|
|
254
|
+
const expressApp = express()
|
|
255
|
+
|
|
256
|
+
await setupApiEndpoints(expressApp, apiServer)
|
|
257
|
+
|
|
258
|
+
const httpServer = http.createServer(expressApp)
|
|
259
|
+
|
|
260
|
+
setupApiWs(httpServer, apiServer)
|
|
261
|
+
setupApiSockJs(httpServer, apiServer)
|
|
262
|
+
|
|
263
|
+
httpServer.listen(apiPort, apiHost)
|
|
264
|
+
console.log('Listening on port ' + apiPort)
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async function server(argv, dev) {
|
|
268
|
+
|
|
269
|
+
if(globalServicesConfig) argv.services = globalServicesConfig
|
|
270
|
+
|
|
271
|
+
const { ssrRoot, ssrPort, ssrHost, apiHost, apiPort } = argv
|
|
272
|
+
|
|
273
|
+
const fastAuth = true
|
|
274
|
+
|
|
275
|
+
const expressApp = express()
|
|
276
|
+
|
|
277
|
+
//expressApp.use('/static', express.static(path.resolve(ssrRoot, 'public')))
|
|
278
|
+
|
|
279
|
+
const manifest = (dev || argv.spa)
|
|
280
|
+
? null
|
|
281
|
+
: JSON.parse(fs.readFileSync((path.resolve(ssrRoot, 'dist/client/.vite/ssr-manifest.json'))))
|
|
282
|
+
|
|
283
|
+
if(!argv.version) argv.version = process.env.VERSION
|
|
284
|
+
if(argv.versionFile) argv.version = await readFile(argv.versionFile, 'utf8')
|
|
285
|
+
|
|
286
|
+
if(!argv.withApi) {
|
|
287
|
+
const apiServerHost = (argv.apiHost == '0.0.0.0' ? 'localhost' : argv.apiHost) + ':' + argv.apiPort
|
|
288
|
+
const target = `http://${apiServerHost}/`
|
|
289
|
+
const apiProxy = createProxyMiddleware({
|
|
290
|
+
target,
|
|
291
|
+
changeOrigin: true,
|
|
292
|
+
ws: true
|
|
293
|
+
})
|
|
294
|
+
expressApp.use('/api', apiProxy)
|
|
295
|
+
console.log("PROXY /api to", target)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
let apiServer
|
|
299
|
+
if(argv.withApi) {
|
|
300
|
+
apiServer = await setupApiServer({ ...argv, fastAuth })
|
|
301
|
+
await setupApiEndpoints(expressApp, apiServer)
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
console.log("ENDPOINTS INSTALLED! CREATING WEB SERVER!")
|
|
305
|
+
|
|
306
|
+
const ssrServer = new SsrServer(expressApp, manifest, {
|
|
307
|
+
...argv,
|
|
308
|
+
dev,
|
|
309
|
+
fastAuth,
|
|
310
|
+
root: ssrRoot || '.',
|
|
311
|
+
...(apiServer
|
|
312
|
+
? {
|
|
313
|
+
daoFactory: async (credentials, ip) => {
|
|
314
|
+
return await createLoopbackDao(credentials, () => apiServer.daoFactory(credentials, ip))
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
: {
|
|
318
|
+
apiHost, apiPort
|
|
319
|
+
}
|
|
320
|
+
)
|
|
321
|
+
})
|
|
322
|
+
await ssrServer.start()
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
console.log("SSR INSTALLED! CREATING HTTP SERVER!")
|
|
326
|
+
|
|
327
|
+
const httpServer = http.createServer(expressApp)
|
|
328
|
+
if(argv.withApi) {
|
|
329
|
+
setupApiWs(httpServer, apiServer)
|
|
330
|
+
setupApiSockJs(httpServer, apiServer)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
console.log("HTTP SERVER CREATED! INSTALLING!")
|
|
334
|
+
|
|
335
|
+
httpServer.listen(ssrPort, ssrHost)
|
|
336
|
+
|
|
337
|
+
console.log("LISTENING ON ",`${ssrHost}:${ssrPort} link: http://${ssrHost}:${ssrPort}/`)
|
|
338
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@live-change/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Live Change Framework - command line interface",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -22,22 +22,23 @@
|
|
|
22
22
|
"bugs": {
|
|
23
23
|
"url": "https://github.com/live-change/live-change-framework/issues"
|
|
24
24
|
},
|
|
25
|
+
"type": "module",
|
|
25
26
|
"homepage": "https://github.com/live-change/live-change-framework",
|
|
26
27
|
"dependencies": {
|
|
27
|
-
"@live-change/dao": "0.
|
|
28
|
-
"@live-change/dao-sockjs": "0.
|
|
29
|
-
"@live-change/dao-websocket": "0.
|
|
30
|
-
"@live-change/db-server": "0.
|
|
31
|
-
"@live-change/framework": "^0.
|
|
32
|
-
"@live-change/server": "^0.
|
|
33
|
-
"dotenv": "^16.
|
|
28
|
+
"@live-change/dao": "0.6.0",
|
|
29
|
+
"@live-change/dao-sockjs": "0.6.0",
|
|
30
|
+
"@live-change/dao-websocket": "0.6.0",
|
|
31
|
+
"@live-change/db-server": "0.7.2",
|
|
32
|
+
"@live-change/framework": "^0.8.0",
|
|
33
|
+
"@live-change/server": "^0.8.0",
|
|
34
|
+
"dotenv": "^16.4.4",
|
|
34
35
|
"express": "^4.18.2",
|
|
35
36
|
"http-proxy-middleware": "2.0.6",
|
|
36
|
-
"resolve": "^1.22.
|
|
37
|
-
"serialize-javascript": "^6.0.
|
|
37
|
+
"resolve": "^1.22.8",
|
|
38
|
+
"serialize-javascript": "^6.0.2",
|
|
38
39
|
"sockjs": "^0.3.24",
|
|
39
40
|
"websocket": "^1.0.34",
|
|
40
|
-
"yargs": "^17.
|
|
41
|
+
"yargs": "^17.7.2"
|
|
41
42
|
},
|
|
42
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "59b8c38965b6b737b6123fdcdf12fd0b5bed164f"
|
|
43
44
|
}
|