@ms-cloudpack/cli 0.23.14 → 0.24.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/lib/commands/start/appServer/createRoutes.d.ts +15 -0
- package/lib/commands/start/appServer/createRoutes.js +70 -0
- package/lib/commands/start/appServer/createRoutes.js.map +1 -0
- package/lib/commands/start/appServer/error.d.ts +1 -0
- package/lib/commands/start/appServer/error.js +4 -0
- package/lib/commands/start/appServer/error.js.map +1 -0
- package/lib/commands/start/appServer/exitIfPortUnavailable.d.ts +4 -0
- package/lib/commands/start/appServer/exitIfPortUnavailable.js +15 -0
- package/lib/commands/start/appServer/exitIfPortUnavailable.js.map +1 -0
- package/lib/commands/start/appServer/getDefaultHtmlResponse.d.ts +5 -0
- package/lib/commands/start/appServer/getDefaultHtmlResponse.js +18 -0
- package/lib/commands/start/appServer/getDefaultHtmlResponse.js.map +1 -0
- package/lib/commands/start/appServer/getHtmlResponse.d.ts +5 -0
- package/lib/commands/start/appServer/getHtmlResponse.js +108 -0
- package/lib/commands/start/appServer/getHtmlResponse.js.map +1 -0
- package/lib/commands/start/appServer/handleSessionVersion.d.ts +7 -0
- package/lib/commands/start/appServer/handleSessionVersion.js +12 -0
- package/lib/commands/start/appServer/handleSessionVersion.js.map +1 -0
- package/lib/commands/start/{inlineScripts.d.ts → appServer/inlineScripts.d.ts} +0 -0
- package/lib/commands/start/{inlineScripts.js → appServer/inlineScripts.js} +0 -0
- package/lib/commands/start/appServer/inlineScripts.js.map +1 -0
- package/lib/commands/start/appServer/log.d.ts +1 -0
- package/lib/commands/start/appServer/log.js +5 -0
- package/lib/commands/start/appServer/log.js.map +1 -0
- package/lib/commands/start/appServer/setHeaders.d.ts +10 -0
- package/lib/commands/start/appServer/setHeaders.js +13 -0
- package/lib/commands/start/appServer/setHeaders.js.map +1 -0
- package/lib/commands/start/{startAppServer.d.ts → appServer/startAppServer.d.ts} +5 -5
- package/lib/commands/start/appServer/startAppServer.js +49 -0
- package/lib/commands/start/appServer/startAppServer.js.map +1 -0
- package/lib/commands/start/createBundleTask.js +0 -1
- package/lib/commands/start/createBundleTask.js.map +1 -1
- package/lib/commands/start/start.js +12 -3
- package/lib/commands/start/start.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/tsdoc-metadata.json +1 -1
- package/lib/types.d.ts +66 -2
- package/package.json +5 -3
- package/CHANGELOG.json +0 -2199
- package/CHANGELOG.md +0 -819
- package/lib/commands/start/inlineScripts.js.map +0 -1
- package/lib/commands/start/startAppServer.js +0 -155
- package/lib/commands/start/startAppServer.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inlineScripts.js","sourceRoot":"","sources":["../../../src/commands/start/inlineScripts.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B;;;6FAG2F;IAC3F;;;kHAGgH;CACjH,CAAC"}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import { slash } from '@ms-cloudpack/path-string-parsing';
|
|
3
|
-
import { createImportMap, PackageDefinitions } from '@ms-cloudpack/package-utilities';
|
|
4
|
-
import { createExpressApp, parseHttpsConfig } from '@ms-cloudpack/create-express-app';
|
|
5
|
-
import { inlineScripts } from './inlineScripts.js';
|
|
6
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
7
|
-
const log = (...messages) => {
|
|
8
|
-
// console.log(`AppServer:`, ...messages);
|
|
9
|
-
};
|
|
10
|
-
const error = (...messages) => {
|
|
11
|
-
console.error(`AppServer:`, ...messages);
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* The app server hosts the appropriate routes for the web app, primarily returning html content
|
|
15
|
-
* which loads resources from the bundle server.
|
|
16
|
-
*
|
|
17
|
-
* Separating the app server from the bundle service keeps the routes separate - the app server
|
|
18
|
-
* can support whichever routes the app needs, while the bundle server can provide package
|
|
19
|
-
* assets in various forms using its own routing.
|
|
20
|
-
*/
|
|
21
|
-
export async function startAppServer({ session, bundleServer, apiServer, options, }) {
|
|
22
|
-
const definition = await PackageDefinitions.getInstance().get(session.appPath);
|
|
23
|
-
const { devServer = {} } = options || {};
|
|
24
|
-
const { https = {} } = devServer;
|
|
25
|
-
// Read the port from the config file or default to array of ports.
|
|
26
|
-
const requireSpecifiedPort = devServer?.port !== undefined;
|
|
27
|
-
const ports = devServer?.port ?? [5000, 5001, 5002, 5003];
|
|
28
|
-
// Directory to serve as plain static assets. Defaults to "public".
|
|
29
|
-
// Can be overridden by setting the 'publicDir' option in the cloudpack config.
|
|
30
|
-
const publicDir = path.resolve(devServer.publicDir ?? 'public');
|
|
31
|
-
try {
|
|
32
|
-
const { server, protocol, domain, port } = await createExpressApp({
|
|
33
|
-
portRange: ports,
|
|
34
|
-
requireSpecifiedPort,
|
|
35
|
-
hostname: devServer?.domain,
|
|
36
|
-
sslOptions: parseHttpsConfig(https),
|
|
37
|
-
publicDir,
|
|
38
|
-
setupCallback: (app) => {
|
|
39
|
-
// Set up the express app routes.
|
|
40
|
-
app
|
|
41
|
-
.get('/__/dashboard', (req, res) => {
|
|
42
|
-
(async () => {
|
|
43
|
-
const sessionVersion = handleSessionVersion(session, req);
|
|
44
|
-
const importMap = session.getImportMap() ||
|
|
45
|
-
session.setImportMap(await createImportMap(session.resolveMap, bundleServer.url, {
|
|
46
|
-
sessionVersion,
|
|
47
|
-
targetVersions: session.targetVersions,
|
|
48
|
-
}));
|
|
49
|
-
const overlayScript = importMap.imports['@ms-cloudpack/overlay'];
|
|
50
|
-
const dashboardScript = importMap.imports['@ms-cloudpack/overlay'];
|
|
51
|
-
sendHtmlResponse({
|
|
52
|
-
session,
|
|
53
|
-
title: 'Cloudpack dashboard',
|
|
54
|
-
importMap,
|
|
55
|
-
apiServer,
|
|
56
|
-
bodyScripts: [overlayScript, dashboardScript],
|
|
57
|
-
res,
|
|
58
|
-
});
|
|
59
|
-
})().catch((err) => {
|
|
60
|
-
error(err?.stack || err);
|
|
61
|
-
res.status(500).send(`Error loading overlay: ${err}`);
|
|
62
|
-
});
|
|
63
|
-
})
|
|
64
|
-
.get('*', (req, res) => {
|
|
65
|
-
if (!definition) {
|
|
66
|
-
res.status(500).send(`There was no package.json located at "${session.appPath}".`);
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
(async () => {
|
|
70
|
-
const sessionVersion = handleSessionVersion(session, req);
|
|
71
|
-
const importMap = session.getImportMap() ||
|
|
72
|
-
session.setImportMap(await createImportMap(session.resolveMap, bundleServer.url, {
|
|
73
|
-
sessionVersion,
|
|
74
|
-
targetVersions: session.targetVersions,
|
|
75
|
-
}));
|
|
76
|
-
const requestPath = slash(req.path.substring(1));
|
|
77
|
-
const requestExt = path.extname(requestPath);
|
|
78
|
-
const overlayScript = importMap.imports['@ms-cloudpack/overlay'];
|
|
79
|
-
const entryScript = importMap.imports[definition.name || ''];
|
|
80
|
-
log(`App server: Request: ${requestPath}, ext: ${requestExt}, ${port}`);
|
|
81
|
-
sendHtmlResponse({
|
|
82
|
-
session,
|
|
83
|
-
title: definition.name || '',
|
|
84
|
-
importMap,
|
|
85
|
-
apiServer,
|
|
86
|
-
headScripts: [overlayScript, entryScript],
|
|
87
|
-
res,
|
|
88
|
-
});
|
|
89
|
-
})().catch((err) => {
|
|
90
|
-
error(err?.stack || err);
|
|
91
|
-
res.status(500).send(`Error loading app: ${err}`);
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
},
|
|
95
|
-
});
|
|
96
|
-
return {
|
|
97
|
-
close: () => new Promise((resolve, reject) => server.close((err) => (err ? reject(err) : resolve()))),
|
|
98
|
-
port,
|
|
99
|
-
url: `${protocol}://${domain}:${port}`,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
catch (err) {
|
|
103
|
-
exitIfPortUnavailable(err, session.projectName, ports);
|
|
104
|
-
throw err;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Get the latest refresh version either from the cookie in request or from the session.
|
|
109
|
-
* Update the session with the latest refresh version.
|
|
110
|
-
*/
|
|
111
|
-
function handleSessionVersion(session, req) {
|
|
112
|
-
const lastSessionVersion = Number(req.headers.cookie
|
|
113
|
-
?.match('(^|;)\\s*' + `cloudpack-sessionVersion-${session.projectName}` + '\\s*=\\s*([^;]+)')
|
|
114
|
-
?.pop() || '0');
|
|
115
|
-
session.incrementSessionVersion(lastSessionVersion);
|
|
116
|
-
return session.getSessionVersion();
|
|
117
|
-
}
|
|
118
|
-
function sendHtmlResponse({ session, title, importMap, apiServer, headScripts, bodyScripts, res, }) {
|
|
119
|
-
res.header('Content-Type', 'text/html');
|
|
120
|
-
res.header('Cache-Control', 'no-cache');
|
|
121
|
-
res.header('Access-Control-Allow-Origin', '*');
|
|
122
|
-
res.cookie('cloudpack-session-id', session.id);
|
|
123
|
-
res.cookie('cloudpack-session-sequence', session.sequence);
|
|
124
|
-
res.cookie(`cloudpack-sessionVersion-${session.projectName}`, session.getSessionVersion());
|
|
125
|
-
res.cookie('cloudpack-api-url', apiServer.url);
|
|
126
|
-
res.send([
|
|
127
|
-
`<!DOCTYPE html>`,
|
|
128
|
-
`<html lang="en">`,
|
|
129
|
-
`<head>`,
|
|
130
|
-
`<title>${title}</title>`,
|
|
131
|
-
inlineScripts?.map((script) => `<script>${script}</script>`).join('\n') || '',
|
|
132
|
-
`<script type="importmap">${JSON.stringify(importMap, null, 2)}</script>`,
|
|
133
|
-
headScripts?.map((scriptUrl) => `<script type="module" src="${scriptUrl}"></script>`).join('\n') || '',
|
|
134
|
-
`</head>`,
|
|
135
|
-
`<body>`,
|
|
136
|
-
`<div id="root"></div>`,
|
|
137
|
-
bodyScripts?.map((scriptUrl) => `<script type="module" src="${scriptUrl}" async></script>`).join('\n') || '',
|
|
138
|
-
`</body>`,
|
|
139
|
-
`</html>`,
|
|
140
|
-
].join('\n'));
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Report the error and exit if the port is already in use.
|
|
144
|
-
*/
|
|
145
|
-
function exitIfPortUnavailable(err, projectName, ports) {
|
|
146
|
-
const portRange = typeof ports === 'number' ? [ports] : ports;
|
|
147
|
-
if (err instanceof Error && err.message === 'Specified port not available') {
|
|
148
|
-
const portNeedsPrivileges = portRange.some((port) => port < 1024)
|
|
149
|
-
? '\nNote: for Mac/Linux/WSL users, you may need to run Cloudpack with elevated privileges to use port numbers less than 1024. Try running `sudo cloudpack start`.'
|
|
150
|
-
: '';
|
|
151
|
-
error(`Cloudpack could not start "${projectName}" because no port from the allowed list was available: ${portRange.join(', ')}. Close other programs and try again.`, portNeedsPrivileges);
|
|
152
|
-
process.exit(1);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
//# sourceMappingURL=startAppServer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"startAppServer.js","sourceRoot":"","sources":["../../../src/commands/start/startAppServer.ts"],"names":[],"mappings":"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"}
|