@ms-cloudpack/cli 0.77.8 → 0.77.10
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/link/linkToRemoteSession.d.ts.map +1 -1
- package/lib/commands/link/linkToRemoteSession.js +4 -16
- package/lib/commands/link/linkToRemoteSession.js.map +1 -1
- package/lib/commands/start/execute.d.ts.map +1 -1
- package/lib/commands/start/execute.js +41 -52
- package/lib/commands/start/execute.js.map +1 -1
- package/lib/commands/start/index.d.ts.map +1 -1
- package/lib/commands/start/index.js +4 -5
- package/lib/commands/start/index.js.map +1 -1
- package/lib/commands/start/types/StartOptions.d.ts +4 -1
- package/lib/commands/start/types/StartOptions.d.ts.map +1 -1
- package/lib/commands/start/types/StartOptions.js.map +1 -1
- package/lib/utilities/CommandExecutor.d.ts.map +1 -1
- package/lib/utilities/CommandExecutor.js +6 -4
- package/lib/utilities/CommandExecutor.js.map +1 -1
- package/lib/utilities/commandEvents.d.ts +16 -0
- package/lib/utilities/commandEvents.d.ts.map +1 -0
- package/lib/utilities/commandEvents.js +14 -0
- package/lib/utilities/commandEvents.js.map +1 -0
- package/lib/utilities/disposeServer.d.ts +6 -0
- package/lib/utilities/disposeServer.d.ts.map +1 -0
- package/lib/utilities/disposeServer.js +17 -0
- package/lib/utilities/disposeServer.js.map +1 -0
- package/package.json +17 -17
- package/schema/AppConfig.json +8 -0
- package/schema/UserConfig.json +8 -0
- package/lib/commands/start/startEvents.d.ts +0 -16
- package/lib/commands/start/startEvents.d.ts.map +0 -1
- package/lib/commands/start/startEvents.js +0 -14
- package/lib/commands/start/startEvents.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkToRemoteSession.d.ts","sourceRoot":"","sources":["../../../src/commands/link/linkToRemoteSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAoB3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"linkToRemoteSession.d.ts","sourceRoot":"","sources":["../../../src/commands/link/linkToRemoteSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAoB3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAKlE;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,mBAAmB,CAAC,WAAW,GAAG,aAAa,CAAC,GACvD,OAAO,CAAC,iBAAiB,CAAC,CA6J5B"}
|
|
@@ -7,6 +7,7 @@ import { createApiServer } from '../../utilities/createApiServer.js';
|
|
|
7
7
|
import { openBrowser } from '../start/openBrowser.js';
|
|
8
8
|
import { resolveCloudpackInternalPath } from '../../utilities/resolveCloudpackInternalPath.js';
|
|
9
9
|
import { createRemoteApiUrls } from './createRemoteApiUrls.js';
|
|
10
|
+
import { disposeServer } from '../../utilities/disposeServer.js';
|
|
10
11
|
/**
|
|
11
12
|
* Handles the remote linking process
|
|
12
13
|
*/
|
|
@@ -39,6 +40,7 @@ export async function linkToRemoteSession(params) {
|
|
|
39
40
|
return apiServerResult;
|
|
40
41
|
}
|
|
41
42
|
const { apiServer } = apiServerResult;
|
|
43
|
+
autoDispose({ dispose: () => disposeServer('API server', apiServer) });
|
|
42
44
|
// Get possible host api server urls.
|
|
43
45
|
session.urls.hostApiServer = createRemoteApiUrls({ remote, apiServerUrl: apiServer.url });
|
|
44
46
|
// Then start bundle and app servers for hosting the app.
|
|
@@ -48,22 +50,8 @@ export async function linkToRemoteSession(params) {
|
|
|
48
50
|
definition: await packages.get(linkProxyPath),
|
|
49
51
|
bundleServerOptions: { disableCache: !options.cache },
|
|
50
52
|
}, context);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (!server)
|
|
54
|
-
return;
|
|
55
|
-
const desc = `${name} (${server.url})`;
|
|
56
|
-
console.info(`Closing ${desc}`);
|
|
57
|
-
try {
|
|
58
|
-
await server.close();
|
|
59
|
-
console.info(`Closed ${desc}`);
|
|
60
|
-
}
|
|
61
|
-
catch (err) {
|
|
62
|
-
console.warn(`Error closing ${desc}:`, err);
|
|
63
|
-
}
|
|
64
|
-
}));
|
|
65
|
-
};
|
|
66
|
-
autoDispose({ dispose: cleanup });
|
|
53
|
+
autoDispose({ dispose: () => disposeServer('app server', servers.appServer) });
|
|
54
|
+
autoDispose({ dispose: () => disposeServer('bundle server', servers.bundleServer) });
|
|
67
55
|
if (!session.urls.appServer || !session.urls.bundleServer) {
|
|
68
56
|
return { hasErrors: true, message: 'Failed to start app server' };
|
|
69
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkToRemoteSession.js","sourceRoot":"","sources":["../../../src/commands/link/linkToRemoteSession.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandActionParams, CommandExitParams } from '../../types/CommandAction.js';\nimport {\n createApiContext,\n apiServerPort,\n waitForBusData,\n linkConfigSource,\n linkPathsSource,\n linkDoneSource,\n linkDisconnectedSource,\n type LinkPathOutput,\n type Context,\n type CloudpackServer,\n} from '@ms-cloudpack/api-server';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport path from 'path';\nimport type { CloudpackConfig, CloudpackLinkConfig } from '@ms-cloudpack/common-types';\nimport { filterInternalCapabilities } from '@ms-cloudpack/bundler-capabilities';\nimport { createLinkResolveMap, mergeObjects } from '@ms-cloudpack/package-utilities';\nimport { createApiServer } from '../../utilities/createApiServer.js';\nimport { openBrowser } from '../start/openBrowser.js';\nimport type { LinkOptions } from './types/LinkOptions.js';\nimport type { SharedOptions } from '../../types/SharedOptions.js';\nimport { resolveCloudpackInternalPath } from '../../utilities/resolveCloudpackInternalPath.js';\nimport { createRemoteApiUrls } from './createRemoteApiUrls.js';\n\n/**\n * Handles the remote linking process\n */\nexport async function linkToRemoteSession(\n params: CommandActionParams<LinkOptions & SharedOptions>,\n): Promise<CommandExitParams> {\n const { options, appPath, autoDispose } = params;\n const {\n remote,\n ignore: ignoredPackages,\n all: includeAll,\n ignoreResolutions,\n resolveStrategy,\n logResolveMap,\n } = options;\n\n const linkProxyPath = await resolveCloudpackInternalPath({\n importMetaUrl: import.meta.url,\n packageName: '@ms-cloudpack/link-proxy',\n });\n if (!linkProxyPath) {\n return { hasErrors: true, message: 'Failed to resolve link proxy path' };\n }\n\n // Override routes to default to serve link proxy instead.\n // TODO: Should this be done earlier to avoid the side effect that happens while reading the config?\n delete params.config.routes;\n\n const context = autoDispose(\n await createApiContext({\n ...params,\n // Load the link proxy to the resolve map to load it later.\n additionalPaths: [linkProxyPath],\n // Skip resolving dependencies, as we will load the resolve map later.\n skipResolveDependencies: true,\n }),\n );\n\n const { session, packages, packageHashes, bus } = context;\n\n // Start api server for tracking status and handling remote requests.\n const apiServerResult = await createApiServer(\n // Create the api server at different ports to avoid conflicts.\n { port: apiServerPort.map((p) => p + apiServerPort.length) },\n context,\n );\n if (apiServerResult.hasErrors) {\n return apiServerResult;\n }\n\n const { apiServer } = apiServerResult;\n\n // Get possible host api server urls.\n session.urls.hostApiServer = createRemoteApiUrls({ remote, apiServerUrl: apiServer.url });\n\n // Then start bundle and app servers for hosting the app.\n const { startServers } = await import('@ms-cloudpack/app-server');\n const servers = await startServers(\n {\n // Start the app server with the link proxy.\n definition: await packages.get(linkProxyPath),\n bundleServerOptions: { disableCache: !options.cache },\n },\n context,\n );\n\n const cleanup = async () => {\n await Promise.all(\n Object.entries({ apiServer, ...servers }).map(async ([name, server]) => {\n if (!server) return;\n\n const desc = `${name} (${server.url})`;\n console.info(`Closing ${desc}`);\n try {\n await server.close();\n console.info(`Closed ${desc}`);\n } catch (err) {\n console.warn(`Error closing ${desc}:`, err);\n }\n }),\n );\n };\n\n autoDispose({ dispose: cleanup });\n\n if (!session.urls.appServer || !session.urls.bundleServer) {\n return { hasErrors: true, message: 'Failed to start app server' };\n }\n\n void openBrowser({ url: session.urls.appServer }, context).catch((err: unknown) => {\n console.warn('Error opening browser:', (err as Error | undefined)?.stack || err);\n console.warn('Please open the browser manually to:', session.urls.appServer);\n });\n\n // Setup disconnection handling\n const { disconnectionPromise, withDisconnectionHandling } = createDisconnectionHandler(bus);\n\n // Get config from host api server.\n console.debug('Attempting to fetch host config from the bus.');\n const hostConfigResult = await withDisconnectionHandling(\n waitForBusData<CloudpackLinkConfig>({ bus, source: linkConfigSource }),\n );\n\n // Check if disconnection happened\n if (hostConfigResult.disconnected) {\n return hostConfigResult.result;\n }\n\n const hostConfig = hostConfigResult.result as CloudpackConfig;\n\n hostConfig.packageSettings?.forEach((settings) => {\n // We need to delete bundler capabilities that are not internal as they won't work.\n // TODO: Figure out a way to support them.\n if (settings.bundlerCapabilities) {\n settings.bundlerCapabilities = filterInternalCapabilities(settings.bundlerCapabilities);\n }\n });\n\n console.debug('Host config received:', hostConfig);\n // Merge host config with local config.\n const mergedConfig = mergeObjects([hostConfig, params.config]);\n session.config = mergedConfig;\n\n packages.reset({ newConfig: mergedConfig });\n\n console.debug('Searching for packages from paths:', appPath);\n\n // Use settings to find partial link app map.\n // Update the resolve map with the linked packages.\n context.session.resolveMap = await createLinkResolveMap({ appPath, additionalPaths: [linkProxyPath] }, context);\n\n bus.publish(linkPathsSource, {\n linkedPath: {\n path: appPath,\n ignoredPackages,\n includeAll,\n ignoreResolutions,\n resolveStrategy,\n remote: {\n // Host app must route linked paths to the bundle server.\n hostUrl: session.urls.bundleServer,\n // Linked session resolve map to resolve dependencies on the host.\n resolveMap: context.session.resolveMap,\n // Send the package definitions to create the import map.\n packages: packages.toSerializable(),\n // We must send all external hashes for the linked packages and then update internal hashes on change.\n packageHashes: packageHashes.toSerializable(),\n },\n },\n });\n\n // Get result from host.\n console.debug('Waiting for host to link paths...');\n const linkPathResult = await withDisconnectionHandling(\n waitForBusData<LinkPathOutput>({ bus, source: linkDoneSource }),\n );\n\n // Check if disconnection happened\n if (linkPathResult.disconnected) {\n return linkPathResult.result;\n }\n\n const result = linkPathResult.result;\n console.debug('Host linked paths:', result.linkedPaths);\n\n // Monitor client connections\n const connectionMonitor = setupConnectionMonitor(apiServer, session.urls.appServer);\n autoDispose({ dispose: () => clearInterval(connectionMonitor) });\n\n // Wait for the host to send back the resolve map and linked paths.\n if (logResolveMap) {\n // Write the linked resolve map to disk.\n await writeJson(path.join(appPath, 'resolve-map-linked.json'), result.resolveMap);\n }\n\n console.debug('Linked paths:', result.linkedPaths);\n\n return disconnectionPromise;\n}\n\n/**\n * Creates a disconnection handler that wraps promises\n */\nfunction createDisconnectionHandler(bus: Context['bus']) {\n // Create a promise that will resolve when host disconnection is detected\n const disconnectionPromise = new Promise<CommandExitParams>((res) => {\n // Listen for host disconnection events\n bus.subscribe(linkDisconnectedSource, ({ reason }: { reason: string }) => {\n res({ hasErrors: true, message: `Host connection ${reason}. Shutting down link session.` });\n });\n });\n\n async function withDisconnectionHandling<T>(\n operation: Promise<T>,\n ): Promise<{ disconnected: false; result: T } | { disconnected: true; result: CommandExitParams }> {\n return await Promise.race([\n operation.then((result): { disconnected: false; result: T } => ({ disconnected: false, result })),\n disconnectionPromise.then((result): { disconnected: true; result: CommandExitParams } => ({\n disconnected: true,\n result,\n })),\n ]);\n }\n\n return { disconnectionPromise, withDisconnectionHandling };\n}\n\n/**\n * Setup client connection monitoring\n */\nfunction setupConnectionMonitor(apiServer: CloudpackServer, appServerUrl: string) {\n let hadConnections = false;\n const connectionMonitor = setInterval(() => {\n const connectedClients = apiServer.clients.size;\n\n // If we previously had connections and now have none\n if (hadConnections && connectedClients === 0) {\n console.warn('Browser connection lost. Please reopen your browser to:', appServerUrl);\n hadConnections = false;\n } else if (connectedClients > 0) {\n hadConnections = true;\n }\n }, 5000); // Check every 5 seconds\n\n return connectionMonitor;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"linkToRemoteSession.js","sourceRoot":"","sources":["../../../src/commands/link/linkToRemoteSession.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandActionParams, CommandExitParams } from '../../types/CommandAction.js';\nimport {\n createApiContext,\n apiServerPort,\n waitForBusData,\n linkConfigSource,\n linkPathsSource,\n linkDoneSource,\n linkDisconnectedSource,\n type LinkPathOutput,\n type Context,\n type CloudpackServer,\n} from '@ms-cloudpack/api-server';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport path from 'path';\nimport type { CloudpackConfig, CloudpackLinkConfig } from '@ms-cloudpack/common-types';\nimport { filterInternalCapabilities } from '@ms-cloudpack/bundler-capabilities';\nimport { createLinkResolveMap, mergeObjects } from '@ms-cloudpack/package-utilities';\nimport { createApiServer } from '../../utilities/createApiServer.js';\nimport { openBrowser } from '../start/openBrowser.js';\nimport type { LinkOptions } from './types/LinkOptions.js';\nimport type { SharedOptions } from '../../types/SharedOptions.js';\nimport { resolveCloudpackInternalPath } from '../../utilities/resolveCloudpackInternalPath.js';\nimport { createRemoteApiUrls } from './createRemoteApiUrls.js';\nimport { disposeServer } from '../../utilities/disposeServer.js';\n\n/**\n * Handles the remote linking process\n */\nexport async function linkToRemoteSession(\n params: CommandActionParams<LinkOptions & SharedOptions>,\n): Promise<CommandExitParams> {\n const { options, appPath, autoDispose } = params;\n const {\n remote,\n ignore: ignoredPackages,\n all: includeAll,\n ignoreResolutions,\n resolveStrategy,\n logResolveMap,\n } = options;\n\n const linkProxyPath = await resolveCloudpackInternalPath({\n importMetaUrl: import.meta.url,\n packageName: '@ms-cloudpack/link-proxy',\n });\n if (!linkProxyPath) {\n return { hasErrors: true, message: 'Failed to resolve link proxy path' };\n }\n\n // Override routes to default to serve link proxy instead.\n // TODO: Should this be done earlier to avoid the side effect that happens while reading the config?\n delete params.config.routes;\n\n const context = autoDispose(\n await createApiContext({\n ...params,\n // Load the link proxy to the resolve map to load it later.\n additionalPaths: [linkProxyPath],\n // Skip resolving dependencies, as we will load the resolve map later.\n skipResolveDependencies: true,\n }),\n );\n\n const { session, packages, packageHashes, bus } = context;\n\n // Start api server for tracking status and handling remote requests.\n const apiServerResult = await createApiServer(\n // Create the api server at different ports to avoid conflicts.\n { port: apiServerPort.map((p) => p + apiServerPort.length) },\n context,\n );\n if (apiServerResult.hasErrors) {\n return apiServerResult;\n }\n\n const { apiServer } = apiServerResult;\n autoDispose({ dispose: () => disposeServer('API server', apiServer) });\n\n // Get possible host api server urls.\n session.urls.hostApiServer = createRemoteApiUrls({ remote, apiServerUrl: apiServer.url });\n\n // Then start bundle and app servers for hosting the app.\n const { startServers } = await import('@ms-cloudpack/app-server');\n const servers = await startServers(\n {\n // Start the app server with the link proxy.\n definition: await packages.get(linkProxyPath),\n bundleServerOptions: { disableCache: !options.cache },\n },\n context,\n );\n autoDispose({ dispose: () => disposeServer('app server', servers.appServer) });\n autoDispose({ dispose: () => disposeServer('bundle server', servers.bundleServer) });\n\n if (!session.urls.appServer || !session.urls.bundleServer) {\n return { hasErrors: true, message: 'Failed to start app server' };\n }\n\n void openBrowser({ url: session.urls.appServer }, context).catch((err: unknown) => {\n console.warn('Error opening browser:', (err as Error | undefined)?.stack || err);\n console.warn('Please open the browser manually to:', session.urls.appServer);\n });\n\n // Setup disconnection handling\n const { disconnectionPromise, withDisconnectionHandling } = createDisconnectionHandler(bus);\n\n // Get config from host api server.\n console.debug('Attempting to fetch host config from the bus.');\n const hostConfigResult = await withDisconnectionHandling(\n waitForBusData<CloudpackLinkConfig>({ bus, source: linkConfigSource }),\n );\n\n // Check if disconnection happened\n if (hostConfigResult.disconnected) {\n return hostConfigResult.result;\n }\n\n const hostConfig = hostConfigResult.result as CloudpackConfig;\n\n hostConfig.packageSettings?.forEach((settings) => {\n // We need to delete bundler capabilities that are not internal as they won't work.\n // TODO: Figure out a way to support them.\n if (settings.bundlerCapabilities) {\n settings.bundlerCapabilities = filterInternalCapabilities(settings.bundlerCapabilities);\n }\n });\n\n console.debug('Host config received:', hostConfig);\n // Merge host config with local config.\n const mergedConfig = mergeObjects([hostConfig, params.config]);\n session.config = mergedConfig;\n\n packages.reset({ newConfig: mergedConfig });\n\n console.debug('Searching for packages from paths:', appPath);\n\n // Use settings to find partial link app map.\n // Update the resolve map with the linked packages.\n context.session.resolveMap = await createLinkResolveMap({ appPath, additionalPaths: [linkProxyPath] }, context);\n\n bus.publish(linkPathsSource, {\n linkedPath: {\n path: appPath,\n ignoredPackages,\n includeAll,\n ignoreResolutions,\n resolveStrategy,\n remote: {\n // Host app must route linked paths to the bundle server.\n hostUrl: session.urls.bundleServer,\n // Linked session resolve map to resolve dependencies on the host.\n resolveMap: context.session.resolveMap,\n // Send the package definitions to create the import map.\n packages: packages.toSerializable(),\n // We must send all external hashes for the linked packages and then update internal hashes on change.\n packageHashes: packageHashes.toSerializable(),\n },\n },\n });\n\n // Get result from host.\n console.debug('Waiting for host to link paths...');\n const linkPathResult = await withDisconnectionHandling(\n waitForBusData<LinkPathOutput>({ bus, source: linkDoneSource }),\n );\n\n // Check if disconnection happened\n if (linkPathResult.disconnected) {\n return linkPathResult.result;\n }\n\n const result = linkPathResult.result;\n console.debug('Host linked paths:', result.linkedPaths);\n\n // Monitor client connections\n const connectionMonitor = setupConnectionMonitor(apiServer, session.urls.appServer);\n autoDispose({ dispose: () => clearInterval(connectionMonitor) });\n\n // Wait for the host to send back the resolve map and linked paths.\n if (logResolveMap) {\n // Write the linked resolve map to disk.\n await writeJson(path.join(appPath, 'resolve-map-linked.json'), result.resolveMap);\n }\n\n console.debug('Linked paths:', result.linkedPaths);\n\n return disconnectionPromise;\n}\n\n/**\n * Creates a disconnection handler that wraps promises\n */\nfunction createDisconnectionHandler(bus: Context['bus']) {\n // Create a promise that will resolve when host disconnection is detected\n const disconnectionPromise = new Promise<CommandExitParams>((res) => {\n // Listen for host disconnection events\n bus.subscribe(linkDisconnectedSource, ({ reason }: { reason: string }) => {\n res({ hasErrors: true, message: `Host connection ${reason}. Shutting down link session.` });\n });\n });\n\n async function withDisconnectionHandling<T>(\n operation: Promise<T>,\n ): Promise<{ disconnected: false; result: T } | { disconnected: true; result: CommandExitParams }> {\n return await Promise.race([\n operation.then((result): { disconnected: false; result: T } => ({ disconnected: false, result })),\n disconnectionPromise.then((result): { disconnected: true; result: CommandExitParams } => ({\n disconnected: true,\n result,\n })),\n ]);\n }\n\n return { disconnectionPromise, withDisconnectionHandling };\n}\n\n/**\n * Setup client connection monitoring\n */\nfunction setupConnectionMonitor(apiServer: CloudpackServer, appServerUrl: string) {\n let hadConnections = false;\n const connectionMonitor = setInterval(() => {\n const connectedClients = apiServer.clients.size;\n\n // If we previously had connections and now have none\n if (hadConnections && connectedClients === 0) {\n console.warn('Browser connection lost. Please reopen your browser to:', appServerUrl);\n hadConnections = false;\n } else if (connectedClients > 0) {\n hadConnections = true;\n }\n }, 5000); // Check every 5 seconds\n\n return connectionMonitor;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/commands/start/execute.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAqB,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAIrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/commands/start/execute.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAqB,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAIrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAW5D;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,aAAa,CAAC,YAAY,CAsH/C,CAAC"}
|
|
@@ -12,8 +12,9 @@ import { resolveCloudpackInternalPath } from '../../utilities/resolveCloudpackIn
|
|
|
12
12
|
import { getDomain, parseHttpsConfig } from '@ms-cloudpack/create-express-app';
|
|
13
13
|
import { handleKnownParseHttpsErrors } from '../../utilities/handleKnownParseHttpsErrors.js';
|
|
14
14
|
import { createWatcher } from '@ms-cloudpack/file-watcher';
|
|
15
|
-
import {
|
|
15
|
+
import { commandEvents } from '../../utilities/commandEvents.js';
|
|
16
16
|
import { readConfig } from '@ms-cloudpack/config';
|
|
17
|
+
import { disposeServer } from '../../utilities/disposeServer.js';
|
|
17
18
|
/**
|
|
18
19
|
* Defines the "start" verb entry point.
|
|
19
20
|
*/
|
|
@@ -46,11 +47,11 @@ export const execute = async (params) => {
|
|
|
46
47
|
additionalPaths: overlayPath ? [overlayPath] : undefined,
|
|
47
48
|
}));
|
|
48
49
|
const { packages, session, telemetryClient } = apiContext;
|
|
49
|
-
const configWatcher = createWatcher();
|
|
50
50
|
return new Promise((resolve) => {
|
|
51
51
|
(async () => {
|
|
52
52
|
let hasConfigChanged = false;
|
|
53
|
-
const
|
|
53
|
+
const configWatcher = createWatcher();
|
|
54
|
+
await Promise.all(config.configPaths?.appConfigPaths.map((configPath) => configWatcher.watch({ path: path.basename(configPath), watchPaths: [configPath] }, () => {
|
|
54
55
|
if (hasConfigChanged) {
|
|
55
56
|
return;
|
|
56
57
|
}
|
|
@@ -61,6 +62,8 @@ export const execute = async (params) => {
|
|
|
61
62
|
})
|
|
62
63
|
.catch((error) => console.warn('Config change detected, but the config file is invalid.', error));
|
|
63
64
|
}) ?? []) ?? []);
|
|
65
|
+
// Set up config watcher disposal (up here in case the config changes before setup completes).
|
|
66
|
+
autoDispose(configWatcher);
|
|
64
67
|
// Increment the session version if caching is disabled.
|
|
65
68
|
if (options.cache === false) {
|
|
66
69
|
session.incrementSessionVersion();
|
|
@@ -77,6 +80,7 @@ export const execute = async (params) => {
|
|
|
77
80
|
return apiServerResult;
|
|
78
81
|
}
|
|
79
82
|
const { apiServer } = apiServerResult;
|
|
83
|
+
autoDispose({ dispose: () => disposeServer('API server', apiServer) });
|
|
80
84
|
// Kick off bundling app package as soon as api server is ready.
|
|
81
85
|
void ensurePackageBundled({ name: definition.name, version: definition.version }, apiContext);
|
|
82
86
|
// Then start bundle and app servers for hosting the app.
|
|
@@ -86,66 +90,51 @@ export const execute = async (params) => {
|
|
|
86
90
|
bundleServerOptions: { disableCache: !options.cache, port: options.bundleServerPort },
|
|
87
91
|
port: options.appServerPort,
|
|
88
92
|
}, apiContext);
|
|
93
|
+
autoDispose({ dispose: () => disposeServer('app server', servers.appServer) });
|
|
94
|
+
autoDispose({ dispose: () => disposeServer('bundle server', servers.bundleServer) });
|
|
89
95
|
// Save the session to active sessions.
|
|
90
96
|
const sessionTracker = await trackSession(session);
|
|
91
|
-
|
|
92
|
-
// Unwatch all the watchers
|
|
93
|
-
await Promise.all(configWatchers.map((unwatch) => unwatch()));
|
|
94
|
-
// Dispose the config watcher
|
|
95
|
-
await configWatcher.dispose();
|
|
96
|
-
// Stop tracking the session.
|
|
97
|
-
await sessionTracker.close();
|
|
98
|
-
await Promise.all(Object.entries({ apiServer, ...servers }).map(async ([name, server]) => {
|
|
99
|
-
if (!server)
|
|
100
|
-
return;
|
|
101
|
-
const desc = `${name} (${server.url})`;
|
|
102
|
-
console.info(`Closing ${desc}`);
|
|
103
|
-
try {
|
|
104
|
-
await server.close();
|
|
105
|
-
console.info(`Closed ${desc}`);
|
|
106
|
-
}
|
|
107
|
-
catch (err) {
|
|
108
|
-
console.warn(`Error closing ${desc}:`, err);
|
|
109
|
-
}
|
|
110
|
-
}));
|
|
111
|
-
};
|
|
112
|
-
autoDispose({ dispose: cleanup });
|
|
113
|
-
const defaultUrl = makeUrl(config.server?.defaultPath || '', session.urls.appServer).href;
|
|
97
|
+
autoDispose({ dispose: () => sessionTracker.close() });
|
|
114
98
|
// Log the time elapsed from when the CLI started until the browser is ready to be opened.
|
|
115
99
|
await telemetryClient.tracer.startActiveSpan('TIME_TO_OPEN_BROWSER', { startTime: getCliStartTime(), attributes: { open: options.open } }, () => {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
console.log('Please open the browser manually to:', defaultUrl);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
let urlToOpen;
|
|
122
|
-
if (typeof options.open === 'string') {
|
|
123
|
-
// If the string doesn't start with http or https, pick a protocol based on config.server.https
|
|
124
|
-
if (!options.open.startsWith('http://') && !options.open.startsWith('https://')) {
|
|
125
|
-
urlToOpen = `${config.server?.https ? 'https' : 'http'}://${options.open}`;
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
urlToOpen = options.open;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
// Use the default path from the config with the first domain.
|
|
133
|
-
urlToOpen = defaultUrl;
|
|
134
|
-
}
|
|
135
|
-
if (!isRestart) {
|
|
136
|
-
void openBrowser({ url: urlToOpen }, apiContext).catch((err) => {
|
|
137
|
-
console.warn('Error opening browser:', err?.stack || err);
|
|
138
|
-
console.warn('Please open the browser manually to:', defaultUrl);
|
|
139
|
-
});
|
|
140
|
-
}
|
|
100
|
+
if (!isRestart) {
|
|
101
|
+
handleOpenBrowser(options, apiContext);
|
|
141
102
|
}
|
|
142
103
|
});
|
|
143
|
-
|
|
104
|
+
commandEvents.emit('ready');
|
|
144
105
|
})().catch((err) => {
|
|
145
106
|
console.error('Error in start command:', err);
|
|
146
107
|
resolve({ hasErrors: true, message: `Error in start command: ${err}` });
|
|
147
108
|
});
|
|
148
109
|
});
|
|
149
110
|
};
|
|
111
|
+
function handleOpenBrowser(options, apiContext) {
|
|
112
|
+
const { config, urls } = apiContext.session;
|
|
113
|
+
const defaultUrl = makeUrl(config.server?.defaultPath || '', urls.appServer).href;
|
|
114
|
+
// Open the browser.
|
|
115
|
+
if (options.open === false) {
|
|
116
|
+
console.log('Please open the browser manually to:', defaultUrl);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
let urlToOpen;
|
|
120
|
+
if (typeof options.open === 'string') {
|
|
121
|
+
// If the string doesn't start with http or https, pick a protocol based on config.server.https
|
|
122
|
+
if (!options.open.startsWith('http://') && !options.open.startsWith('https://')) {
|
|
123
|
+
urlToOpen = `${config.server?.https ? 'https' : 'http'}://${options.open}`;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
urlToOpen = options.open;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Use the default path from the config with the first domain.
|
|
131
|
+
urlToOpen = defaultUrl;
|
|
132
|
+
}
|
|
133
|
+
void openBrowser({ url: urlToOpen }, apiContext).catch((err) => {
|
|
134
|
+
console.warn('Error opening browser:', err?.stack || err);
|
|
135
|
+
console.warn('Please open the browser manually to:', defaultUrl);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
150
139
|
// cspell:ignore Prereqs
|
|
151
140
|
//# sourceMappingURL=execute.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/commands/start/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import { createApiContext, ensurePackageBundled } from '@ms-cloudpack/api-server';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport { makeUrl } from '@ms-cloudpack/path-string-parsing';\nimport { yellow } from '@ms-cloudpack/task-reporter';\nimport path from 'path';\nimport type { CommandExitParams, CommandAction } from '../../types/CommandAction.js';\nimport { runPrerequisites } from '../../utilities/runPrerequisites.js';\nimport { openBrowser } from './openBrowser.js';\nimport { trackSession } from './trackSession.js';\nimport type { StartOptions } from './types/StartOptions.js';\nimport { getCliStartTime } from '../../utilities/getCliStartTime.js';\nimport { createApiServer } from '../../utilities/createApiServer.js';\nimport { resolveCloudpackInternalPath } from '../../utilities/resolveCloudpackInternalPath.js';\nimport { getDomain, parseHttpsConfig } from '@ms-cloudpack/create-express-app';\nimport { handleKnownParseHttpsErrors } from '../../utilities/handleKnownParseHttpsErrors.js';\nimport { createWatcher } from '@ms-cloudpack/file-watcher';\nimport { startEvents } from './startEvents.js';\nimport { readConfig } from '@ms-cloudpack/config';\n\n/**\n * Defines the \"start\" verb entry point.\n */\nexport const execute: CommandAction<StartOptions> = async (params) => {\n const { appPath, config, options, autoDispose, isRestart } = params;\n\n console.log('App path:', yellow(appPath));\n console.log('Bundle mode:', yellow(options.mode));\n\n await runPrerequisites(params);\n\n // If the user has specified https options in the config, parse them at start.\n // This makes sure that the HTTPS configuration is ready before starting the servers and shows errors early.\n // We need to do this after prerequisites are run, in case users setup their certs there.\n if (config?.server?.https) {\n try {\n const domain = getDomain(config.server.domain);\n config.server.parsedHttps = await parseHttpsConfig({ domain, https: config.server.https, cwd: appPath });\n } catch (err) {\n handleKnownParseHttpsErrors({ err, projectName: path.basename(appPath) });\n throw err;\n }\n }\n\n const overlayPath = await resolveCloudpackInternalPath({\n packageName: '@ms-cloudpack/overlay',\n importMetaUrl: import.meta.url,\n });\n\n const shouldUseRemoteCache = config.features?.enableCloudHosted || config.features?.enableRemoteCacheDownloads;\n const apiContext = autoDispose(\n await createApiContext({\n ...params,\n remoteCacheClientLoginMethod: shouldUseRemoteCache ? options.login : undefined,\n additionalPaths: overlayPath ? [overlayPath] : undefined,\n }),\n );\n const { packages, session, telemetryClient } = apiContext;\n\n const configWatcher = createWatcher();\n\n return new Promise<CommandExitParams>((resolve) => {\n (async () => {\n let hasConfigChanged = false;\n const configWatchers = await Promise.all(\n config.configPaths?.appConfigPaths.map(\n (configPath) =>\n configWatcher.watch({ path: path.basename(configPath), watchPaths: [configPath] }, () => {\n if (hasConfigChanged) {\n return;\n }\n void readConfig(appPath)\n .then(() => {\n hasConfigChanged = true;\n resolve({ restart: true, message: 'Config changed. Restarting Cloudpack...' });\n })\n .catch((error) => console.warn('Config change detected, but the config file is invalid.', error));\n }) ?? [],\n ) ?? [],\n );\n\n // Increment the session version if caching is disabled.\n if (options.cache === false) {\n session.incrementSessionVersion();\n }\n\n // Make sure the package has a valid definition.\n const definition = await packages.get(appPath);\n\n if (options.logResolveMap) {\n // Write the resolve map to disk.\n await writeJson(path.join(appPath, 'resolve-map.json'), session.resolveMap);\n }\n\n // Start api server for tracking status and handling remote requests.\n const apiServerResult = await createApiServer({ port: options.apiServerPort }, apiContext);\n if (apiServerResult.hasErrors) {\n return apiServerResult;\n }\n const { apiServer } = apiServerResult;\n\n // Kick off bundling app package as soon as api server is ready.\n void ensurePackageBundled({ name: definition.name, version: definition.version }, apiContext);\n\n // Then start bundle and app servers for hosting the app.\n const { startServers } = await import('@ms-cloudpack/app-server');\n const servers = await startServers(\n {\n definition,\n bundleServerOptions: { disableCache: !options.cache, port: options.bundleServerPort },\n port: options.appServerPort,\n },\n apiContext,\n );\n\n // Save the session to active sessions.\n const sessionTracker = await trackSession(session);\n\n const cleanup = async () => {\n // Unwatch all the watchers\n await Promise.all(configWatchers.map((unwatch) => unwatch()));\n\n // Dispose the config watcher\n await configWatcher.dispose();\n\n // Stop tracking the session.\n await sessionTracker.close();\n\n await Promise.all(\n Object.entries({ apiServer, ...servers }).map(async ([name, server]) => {\n if (!server) return;\n\n const desc = `${name} (${server.url})`;\n console.info(`Closing ${desc}`);\n try {\n await server.close();\n console.info(`Closed ${desc}`);\n } catch (err) {\n console.warn(`Error closing ${desc}:`, err);\n }\n }),\n );\n };\n\n autoDispose({ dispose: cleanup });\n\n const defaultUrl = makeUrl(config.server?.defaultPath || '', session.urls.appServer).href;\n\n // Log the time elapsed from when the CLI started until the browser is ready to be opened.\n await telemetryClient.tracer.startActiveSpan(\n 'TIME_TO_OPEN_BROWSER',\n { startTime: getCliStartTime(), attributes: { open: options.open } },\n () => {\n // Open the browser.\n if (options.open === false) {\n console.log('Please open the browser manually to:', defaultUrl);\n } else {\n let urlToOpen: string;\n if (typeof options.open === 'string') {\n // If the string doesn't start with http or https, pick a protocol based on config.server.https\n if (!options.open.startsWith('http://') && !options.open.startsWith('https://')) {\n urlToOpen = `${config.server?.https ? 'https' : 'http'}://${options.open}`;\n } else {\n urlToOpen = options.open;\n }\n } else {\n // Use the default path from the config with the first domain.\n urlToOpen = defaultUrl;\n }\n\n if (!isRestart) {\n void openBrowser({ url: urlToOpen }, apiContext).catch((err: unknown) => {\n console.warn('Error opening browser:', (err as Error | undefined)?.stack || err);\n console.warn('Please open the browser manually to:', defaultUrl);\n });\n }\n }\n },\n );\n\n startEvents.emit('ready');\n })().catch((err) => {\n console.error('Error in start command:', err);\n resolve({ hasErrors: true, message: `Error in start command: ${err}` });\n });\n });\n};\n\n// cspell:ignore Prereqs\n"]}
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/commands/start/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import { createApiContext, ensurePackageBundled, type PartialContext } from '@ms-cloudpack/api-server';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport { makeUrl } from '@ms-cloudpack/path-string-parsing';\nimport { yellow } from '@ms-cloudpack/task-reporter';\nimport path from 'path';\nimport type { CommandExitParams, CommandAction } from '../../types/CommandAction.js';\nimport { runPrerequisites } from '../../utilities/runPrerequisites.js';\nimport { openBrowser } from './openBrowser.js';\nimport { trackSession } from './trackSession.js';\nimport type { StartOptions } from './types/StartOptions.js';\nimport { getCliStartTime } from '../../utilities/getCliStartTime.js';\nimport { createApiServer } from '../../utilities/createApiServer.js';\nimport { resolveCloudpackInternalPath } from '../../utilities/resolveCloudpackInternalPath.js';\nimport { getDomain, parseHttpsConfig } from '@ms-cloudpack/create-express-app';\nimport { handleKnownParseHttpsErrors } from '../../utilities/handleKnownParseHttpsErrors.js';\nimport { createWatcher } from '@ms-cloudpack/file-watcher';\nimport { commandEvents } from '../../utilities/commandEvents.js';\nimport { readConfig } from '@ms-cloudpack/config';\nimport { disposeServer } from '../../utilities/disposeServer.js';\n\n/**\n * Defines the \"start\" verb entry point.\n */\nexport const execute: CommandAction<StartOptions> = async (params) => {\n const { appPath, config, options, autoDispose, isRestart } = params;\n\n console.log('App path:', yellow(appPath));\n console.log('Bundle mode:', yellow(options.mode));\n\n await runPrerequisites(params);\n\n // If the user has specified https options in the config, parse them at start.\n // This makes sure that the HTTPS configuration is ready before starting the servers and shows errors early.\n // We need to do this after prerequisites are run, in case users setup their certs there.\n if (config?.server?.https) {\n try {\n const domain = getDomain(config.server.domain);\n config.server.parsedHttps = await parseHttpsConfig({ domain, https: config.server.https, cwd: appPath });\n } catch (err) {\n handleKnownParseHttpsErrors({ err, projectName: path.basename(appPath) });\n throw err;\n }\n }\n\n const overlayPath = await resolveCloudpackInternalPath({\n packageName: '@ms-cloudpack/overlay',\n importMetaUrl: import.meta.url,\n });\n\n const shouldUseRemoteCache = config.features?.enableCloudHosted || config.features?.enableRemoteCacheDownloads;\n const apiContext = autoDispose(\n await createApiContext({\n ...params,\n remoteCacheClientLoginMethod: shouldUseRemoteCache ? options.login : undefined,\n additionalPaths: overlayPath ? [overlayPath] : undefined,\n }),\n );\n const { packages, session, telemetryClient } = apiContext;\n\n return new Promise<CommandExitParams>((resolve) => {\n (async () => {\n let hasConfigChanged = false;\n const configWatcher = createWatcher();\n await Promise.all(\n config.configPaths?.appConfigPaths.map(\n (configPath) =>\n configWatcher.watch({ path: path.basename(configPath), watchPaths: [configPath] }, () => {\n if (hasConfigChanged) {\n return;\n }\n void readConfig(appPath)\n .then(() => {\n hasConfigChanged = true;\n resolve({ restart: true, message: 'Config changed. Restarting Cloudpack...' });\n })\n .catch((error) => console.warn('Config change detected, but the config file is invalid.', error));\n }) ?? [],\n ) ?? [],\n );\n\n // Set up config watcher disposal (up here in case the config changes before setup completes).\n autoDispose(configWatcher);\n\n // Increment the session version if caching is disabled.\n if (options.cache === false) {\n session.incrementSessionVersion();\n }\n\n // Make sure the package has a valid definition.\n const definition = await packages.get(appPath);\n\n if (options.logResolveMap) {\n // Write the resolve map to disk.\n await writeJson(path.join(appPath, 'resolve-map.json'), session.resolveMap);\n }\n\n // Start api server for tracking status and handling remote requests.\n const apiServerResult = await createApiServer({ port: options.apiServerPort }, apiContext);\n if (apiServerResult.hasErrors) {\n return apiServerResult;\n }\n const { apiServer } = apiServerResult;\n autoDispose({ dispose: () => disposeServer('API server', apiServer) });\n\n // Kick off bundling app package as soon as api server is ready.\n void ensurePackageBundled({ name: definition.name, version: definition.version }, apiContext);\n\n // Then start bundle and app servers for hosting the app.\n const { startServers } = await import('@ms-cloudpack/app-server');\n const servers = await startServers(\n {\n definition,\n bundleServerOptions: { disableCache: !options.cache, port: options.bundleServerPort },\n port: options.appServerPort,\n },\n apiContext,\n );\n autoDispose({ dispose: () => disposeServer('app server', servers.appServer) });\n autoDispose({ dispose: () => disposeServer('bundle server', servers.bundleServer) });\n\n // Save the session to active sessions.\n const sessionTracker = await trackSession(session);\n autoDispose({ dispose: () => sessionTracker.close() });\n\n // Log the time elapsed from when the CLI started until the browser is ready to be opened.\n await telemetryClient.tracer.startActiveSpan(\n 'TIME_TO_OPEN_BROWSER',\n { startTime: getCliStartTime(), attributes: { open: options.open } },\n () => {\n if (!isRestart) {\n handleOpenBrowser(options, apiContext);\n }\n },\n );\n\n commandEvents.emit('ready');\n })().catch((err) => {\n console.error('Error in start command:', err);\n resolve({ hasErrors: true, message: `Error in start command: ${err}` });\n });\n });\n};\n\nfunction handleOpenBrowser(\n options: StartOptions,\n apiContext: PartialContext<'telemetryClient', 'config' | 'urls'>,\n): void {\n const { config, urls } = apiContext.session;\n\n const defaultUrl = makeUrl(config.server?.defaultPath || '', urls.appServer).href;\n\n // Open the browser.\n if (options.open === false) {\n console.log('Please open the browser manually to:', defaultUrl);\n } else {\n let urlToOpen: string;\n if (typeof options.open === 'string') {\n // If the string doesn't start with http or https, pick a protocol based on config.server.https\n if (!options.open.startsWith('http://') && !options.open.startsWith('https://')) {\n urlToOpen = `${config.server?.https ? 'https' : 'http'}://${options.open}`;\n } else {\n urlToOpen = options.open;\n }\n } else {\n // Use the default path from the config with the first domain.\n urlToOpen = defaultUrl;\n }\n\n void openBrowser({ url: urlToOpen }, apiContext).catch((err: unknown) => {\n console.warn('Error opening browser:', (err as Error | undefined)?.stack || err);\n console.warn('Please open the browser manually to:', defaultUrl);\n });\n }\n}\n\n// cspell:ignore Prereqs\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/start/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAQ9E,gCAAgC;AAChC,eAAO,MAAM,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/start/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAQ9E,gCAAgC;AAChC,eAAO,MAAM,IAAI,EAAE,mBAkClB,CAAC"}
|
|
@@ -11,7 +11,7 @@ export const init = (program) => {
|
|
|
11
11
|
options: {
|
|
12
12
|
app: reusedOptions.app(),
|
|
13
13
|
open: [
|
|
14
|
-
new Option('--open
|
|
14
|
+
new Option('--open [url]', 'Open the browser (to the URL if provided).'),
|
|
15
15
|
new Option('--no-open', 'Do not open the browser.'),
|
|
16
16
|
],
|
|
17
17
|
cache: reusedOptions.cache(),
|
|
@@ -24,10 +24,9 @@ export const init = (program) => {
|
|
|
24
24
|
bundleServerPort: getPortOption('--bundle-server-port <port>', 'bundle'),
|
|
25
25
|
login: reusedOptions.login('start'),
|
|
26
26
|
},
|
|
27
|
-
applyOptionsToConfig: (
|
|
28
|
-
if
|
|
29
|
-
|
|
30
|
-
}
|
|
27
|
+
applyOptionsToConfig: ({ showOverlay, open }) => {
|
|
28
|
+
// These will be ignored if no values are set
|
|
29
|
+
return { extraServerConfig: { showOverlay, open } };
|
|
31
30
|
},
|
|
32
31
|
getExecutor: () => import('./execute.js'),
|
|
33
32
|
// If cwd isn't a cloudpack app, discover other cloudpack apps and possibly prompt the user
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/start/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGzD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,gCAAgC;AAChC,MAAM,kBAAkB,GAA+C,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAE1G,gCAAgC;AAChC,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,OAAO,EAAE,EAAE;IACnD,OAAO,CAAC,aAAa,CAAe;QAClC,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,qCAAqC;QAClD,OAAO,EAAE;YACP,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE;YACxB,IAAI,EAAE;gBACJ,IAAI,MAAM,CAAC,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/start/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { InvalidArgumentError, Option } from 'commander';\nimport type { CommandInitFunction } from '../../types/CommandInitFunction.js';\nimport type { StartOptions } from './types/StartOptions.js';\nimport { portNumbers } from 'get-port';\nimport { reusedOptions } from '../../utilities/reusedOptions.js';\n\n// verify the values are correct\nconst showOverlayChoices: NonNullable<StartOptions['showOverlay']>[] = ['always', 'errors-only', 'never'];\n\n/** Defines the \"start\" verb. */\nexport const init: CommandInitFunction = (program) => {\n program.addSubCommand<StartOptions>({\n name: 'start',\n description: 'Starts a web inner-loop for an app.',\n options: {\n app: reusedOptions.app(),\n open: [\n new Option('--open [url]', 'Open the browser (to the URL if provided).'),\n new Option('--no-open', 'Do not open the browser.'),\n ],\n cache: reusedOptions.cache(),\n mode: reusedOptions.mode({ action: 'run' }),\n showOverlay: new Option(\n '--show-overlay <when>',\n 'Override whether to show the Cloudpack overlay (status badge and dialog) in the app UI.',\n // Don't specify a default for this option to avoid unconditionally overriding any value\n // set in the ServerConfig\n ).choices(showOverlayChoices),\n logResolveMap: reusedOptions.logResolveMap(),\n logBundleInfo: reusedOptions.logBundleInfo({ requiresNoCache: true }),\n apiServerPort: getPortOption('--api-server-port <port>', 'API', true),\n appServerPort: getPortOption('--app-server-port <port>', 'app'),\n bundleServerPort: getPortOption('--bundle-server-port <port>', 'bundle'),\n login: reusedOptions.login('start'),\n },\n applyOptionsToConfig: ({ showOverlay, open }) => {\n // These will be ignored if no values are set\n return { extraServerConfig: { showOverlay, open } };\n },\n getExecutor: () => import('./execute.js'),\n // If cwd isn't a cloudpack app, discover other cloudpack apps and possibly prompt the user\n // to choose one. Also handles --app.\n discoverAppPaths: 'single',\n });\n};\n\nfunction getPortOption(flags: string, name: string, isFirst?: boolean): Option {\n return new Option(\n flags,\n `Port for the ${name} server (${isFirst ? 'single, comma-separated, or range with dash' : 'as above'}).`,\n ).argParser(parsePorts);\n}\n\nfunction parsePorts(value: string): number[] {\n if (value.includes('-')) {\n const split = value.split('-');\n if (split.length !== 2) {\n throw new InvalidArgumentError(`Invalid port range: \"${value}\"`);\n }\n return [...portNumbers(parseNumber(split[0]), parseNumber(split[1]))];\n }\n\n return value.split(',').map(parseNumber);\n}\n\nfunction parseNumber(value: string): number {\n value = value.trim();\n const parsed = parseInt(value, 10);\n if (isNaN(parsed)) {\n throw new InvalidArgumentError(`Port must be a number; received: \"${value}\"`);\n }\n return parsed;\n}\n"]}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { ServerConfig } from '@ms-cloudpack/common-types';
|
|
2
2
|
import type { ReusedOptions } from '../../../types/ReusedOptions.js';
|
|
3
3
|
export interface StartOptions extends Pick<ReusedOptions, 'app' | 'cache' | 'login' | 'logBundleInfo' | 'logResolveMap' | 'mode'>, Pick<ServerConfig, 'showOverlay'> {
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Whether to open the browser or a specific url to open the browser to.
|
|
6
|
+
* Defaults to the value from `ServerConfig.open` or `true`.
|
|
7
|
+
*/
|
|
5
8
|
open?: boolean | string;
|
|
6
9
|
/** Mostly for testing: custom port for the API server */
|
|
7
10
|
apiServerPort?: number | number[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartOptions.d.ts","sourceRoot":"","sources":["../../../../src/commands/start/types/StartOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,WAAW,YACf,SAAQ,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,eAAe,GAAG,MAAM,CAAC,EACjG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;IACnC
|
|
1
|
+
{"version":3,"file":"StartOptions.d.ts","sourceRoot":"","sources":["../../../../src/commands/start/types/StartOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,WAAW,YACf,SAAQ,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,eAAe,GAAG,MAAM,CAAC,EACjG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;IACnC;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAExB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAElC,gGAAgG;IAChG,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAElC,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartOptions.js","sourceRoot":"","sources":["../../../../src/commands/start/types/StartOptions.ts"],"names":[],"mappings":"","sourcesContent":["import type { ServerConfig } from '@ms-cloudpack/common-types';\nimport type { ReusedOptions } from '../../../types/ReusedOptions.js';\n\nexport interface StartOptions\n extends Pick<ReusedOptions, 'app' | 'cache' | 'login' | 'logBundleInfo' | 'logResolveMap' | 'mode'>,\n Pick<ServerConfig, 'showOverlay'> {\n
|
|
1
|
+
{"version":3,"file":"StartOptions.js","sourceRoot":"","sources":["../../../../src/commands/start/types/StartOptions.ts"],"names":[],"mappings":"","sourcesContent":["import type { ServerConfig } from '@ms-cloudpack/common-types';\nimport type { ReusedOptions } from '../../../types/ReusedOptions.js';\n\nexport interface StartOptions\n extends Pick<ReusedOptions, 'app' | 'cache' | 'login' | 'logBundleInfo' | 'logResolveMap' | 'mode'>,\n Pick<ServerConfig, 'showOverlay'> {\n /**\n * Whether to open the browser or a specific url to open the browser to.\n * Defaults to the value from `ServerConfig.open` or `true`.\n */\n open?: boolean | string;\n\n /** Mostly for testing: custom port for the API server */\n apiServerPort?: number | number[];\n\n /** Mostly for testing: custom port for the app server (also set in config via `server.port`) */\n appServerPort?: number | number[];\n\n /** Mostly for testing: custom port for the bundle server */\n bundleServerPort?: number | number[];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandExecutor.d.ts","sourceRoot":"","sources":["../../src/utilities/CommandExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAe9D,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,2BAA2B,CAAC;AACrG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"CommandExecutor.d.ts","sourceRoot":"","sources":["../../src/utilities/CommandExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAe9D,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,2BAA2B,CAAC;AACrG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAS7E,MAAM,WAAW,qBAAqB,CAAC,QAAQ,SAAS,aAAa;IACnE,iCAAiC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,2CAA2C;IAC3C,OAAO,EAAE,QAAQ,CAAC;IAElB,uCAAuC;IACvC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEjC,0CAA0C;IAC1C,cAAc,EAAE,cAAc,CAAC;IAE/B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;OAKG;IACH,gBAAgB,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAEnD;;;OAGG;IACH,oBAAoB,EAChB,CAAC,CACC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC,CAAC,KAC3D,IAAI,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,GAAG,SAAS,CAAC,GAC9D,SAAS,CAAC;CACf;AAED;;GAEG;AAEH,qBAAa,eAAe,CAAC,QAAQ,SAAS,aAAa;IACzD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,qBAAqB,CAA0D;IACvF,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAC,CAAa;IAClC,OAAO,CAAC,sBAAsB,CAAC,CAAe;IAE9C,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAmC;WAE9C,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;gBASzD,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC;IAYnD,uBAAuB;IAEV,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+FrC;;;OAGG;YACW,mBAAmB;IAqGjC,qEAAqE;IACrE,OAAO,CAAC,+BAA+B;YAgBzB,cAAc;IAkD5B,SAAS,CAAC,cAAc,QAAO,IAAI,CAgBjC;IAEF;;;OAGG;cACa,KAAK,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;CAoCjE"}
|
|
@@ -11,6 +11,7 @@ import { TaskRunner } from '@ms-cloudpack/api-server';
|
|
|
11
11
|
import { readLocalConfigs } from './readLocalConfigs.js';
|
|
12
12
|
import { readRemoteConfigs } from './readRemoteConfigs.js';
|
|
13
13
|
import { getCliStartTime } from './getCliStartTime.js';
|
|
14
|
+
import { commandEvents } from './commandEvents.js';
|
|
14
15
|
/**
|
|
15
16
|
* This class manages orchestration and shared state while executing a command.
|
|
16
17
|
*/
|
|
@@ -202,7 +203,6 @@ export class CommandExecutor {
|
|
|
202
203
|
? noLoggingConfig
|
|
203
204
|
: defaultLoggingConfig),
|
|
204
205
|
});
|
|
205
|
-
const contexts = [];
|
|
206
206
|
const logLevel = this._options.verbose ? 'VERBOSE' : this._options.debug ? 'DEBUG' : undefined;
|
|
207
207
|
if (!this._options.debug) {
|
|
208
208
|
this._reporter.ignoreLogMessage('ApplicationInsights:');
|
|
@@ -212,9 +212,8 @@ export class CommandExecutor {
|
|
|
212
212
|
logLevel,
|
|
213
213
|
serviceName: 'cli',
|
|
214
214
|
});
|
|
215
|
-
this._autoDisposableList.add({
|
|
216
|
-
|
|
217
|
-
});
|
|
215
|
+
this._autoDisposableList.add({ dispose: () => telemetryApi.shutdown() });
|
|
216
|
+
const contexts = [];
|
|
218
217
|
for (const appPath of Object.keys(configs)) {
|
|
219
218
|
const config = configs[appPath];
|
|
220
219
|
const definition = await readJson(path.join(appPath, 'package.json'));
|
|
@@ -316,6 +315,9 @@ export class CommandExecutor {
|
|
|
316
315
|
this._hasCalledExit = true;
|
|
317
316
|
// Dispose all registered disposables.
|
|
318
317
|
await this._autoDisposableList.dispose();
|
|
318
|
+
// Remove all event listeners. Currently this is only done on final disposal because one of
|
|
319
|
+
// the start tests relies on a 'ready' event listener carrying over across restarts.
|
|
320
|
+
commandEvents.removeAllListeners();
|
|
319
321
|
// Show the summary message (this will throw if called twice).
|
|
320
322
|
await this._reporter.complete({
|
|
321
323
|
summary: hasErrors ? red(message) : message,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandExecutor.js","sourceRoot":"","sources":["../../src/utilities/CommandExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReadConfigOptions } from '@ms-cloudpack/config';\nimport type { CloudpackConfig, PackageJson } from '@ms-cloudpack/common-types';\nimport { readJson } from '@ms-cloudpack/json-utilities';\nimport {\n TaskReporter,\n bold,\n debugLoggingConfig,\n defaultLoggingConfig,\n noLoggingConfig,\n red,\n verboseLoggingConfig,\n yellow,\n} from '@ms-cloudpack/task-reporter';\nimport { startTelemetry, type TelemetryApi, type TelemetryClient } from '@ms-cloudpack/telemetry';\nimport path from 'path';\nimport type { CommandAction, CommandExitParams, AppCommandContext } from '../types/CommandAction.js';\nimport type { ProgramOptions } from '../types/ProgramOptions.js';\nimport type { SharedOptions } from '../types/SharedOptions.js';\nimport { AutoDisposableList } from './AutoDisposableList.js';\nimport { getVersion } from '@ms-cloudpack/package-utilities';\nimport { environmentInfo } from '@ms-cloudpack/environment';\nimport type { ReusedOptions } from '../types/ReusedOptions.js';\nimport type { AppPathDiscoveryMode } from '../types/AppPathDiscoveryMode.js';\nimport { discoverRemoteAppPaths } from './discoverRemoteAppPaths.js';\nimport { discoverLocalAppPaths } from './discoverLocalAppPaths.js';\nimport { TaskRunner } from '@ms-cloudpack/api-server';\nimport { readLocalConfigs, type InvalidCloudpackConfigError } from './readLocalConfigs.js';\nimport { readRemoteConfigs } from './readRemoteConfigs.js';\nimport { getCliStartTime } from './getCliStartTime.js';\n\nexport interface CommandExecutorParams<TOptions extends SharedOptions> {\n /** Command-specific arguments */\n args: string[];\n\n /** Command-specific and shared options. */\n options: TOptions;\n\n /** Function to execute the command. */\n execute: CommandAction<TOptions>;\n\n /** Shared program-level configuration. */\n programOptions: ProgramOptions;\n\n /** Verb being run, e.g. `bundle` or `cache clean`. */\n verb: string;\n\n /**\n * By default, the command will run against `cwd` (usually `process.cwd()`).\n * If this option is set, attempt to discover app path(s) instead.\n * (`cwd` will still be preferred if it has a `cloudpack.config.json`.)\n * See {@link AppPathDiscoveryMode} for details.\n */\n discoverAppPaths: AppPathDiscoveryMode | undefined;\n\n /**\n * Apply any command-specific CLI options that need to be passed through to `readConfig`.\n * (Shared and reused options are applied automatically.)\n */\n applyOptionsToConfig:\n | ((\n options: Omit<TOptions, keyof (SharedOptions & ReusedOptions)>,\n ) => Pick<ReadConfigOptions, 'extraServerConfig'> | undefined)\n | undefined;\n}\n\n/**\n * This class manages orchestration and shared state while executing a command.\n */\n// 'app' is an optional reused option\nexport class CommandExecutor<TOptions extends SharedOptions> {\n private _options: TOptions;\n private _execute: CommandAction<TOptions>;\n private _programOptions: ProgramOptions;\n private _verb: string;\n private _discoverAppPaths: AppPathDiscoveryMode | undefined;\n private _applyOptionsToConfig: CommandExecutorParams<TOptions>['applyOptionsToConfig'];\n private _reporter: TaskReporter;\n private _autoDisposableList: AutoDisposableList;\n private _hasCalledExit = false;\n private _args: string[];\n private _sigintCount = 0;\n private _onInterrupt?: () => void;\n private _getMessageOnInterrupt?: () => string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- options type isn't used\n private static _activeInstances = new Set<CommandExecutor<any>>();\n\n public static async exitAll(params: CommandExitParams): Promise<void> {\n // There should only be one instance at a time, but we assume multiple instances for safety.\n for (const instance of CommandExecutor._activeInstances) {\n await instance._exit(params);\n process.off('SIGINT', instance._sigintHandler);\n }\n CommandExecutor._activeInstances = new Set();\n }\n\n constructor(params: CommandExecutorParams<TOptions>) {\n this._args = params.args;\n this._options = params.options;\n this._execute = params.execute;\n this._programOptions = params.programOptions;\n this._verb = params.verb;\n this._discoverAppPaths = params.discoverAppPaths;\n this._applyOptionsToConfig = params.applyOptionsToConfig;\n this._reporter = new TaskReporter();\n this._autoDisposableList = new AutoDisposableList();\n }\n\n /** Run the command. */\n // This has to be a separate method because constructors can't be async.\n public async execute(): Promise<void> {\n CommandExecutor._activeInstances.add(this);\n try {\n // Handle SIGINT (Ctrl+C) gracefully.\n if (!environmentInfo.isJest) {\n process.on('SIGINT', this._sigintHandler);\n }\n\n let shouldRestart = false;\n do {\n const contexts = await this._initializeContexts();\n\n if (!Array.isArray(contexts)) {\n await this._exit(contexts);\n return;\n }\n\n const spanName = `${this._verb.toUpperCase().replace(/ /g, '_')}_EXECUTE`;\n const results: CommandExitParams[] = [];\n\n for (const context of contexts) {\n // Call the execute function which is the real command logic\n // (ie: real init command logic, real start command logic, etc.)\n const result = await context.telemetryClient.tracer.startActiveSpan(spanName, async (span) => {\n this._onInterrupt = () => {\n span.setAttribute('isInterrupted', true);\n span.end();\n };\n\n return this._execute({\n ...context,\n span,\n isMultiApp: contexts.length > 1,\n args: this._args,\n options: this._options,\n isRestart: shouldRestart,\n autoDispose: (disposable) => this._autoDisposableList.add(disposable),\n setInterruptMessageHandler: (getMessage) => {\n this._getMessageOnInterrupt = getMessage;\n },\n });\n });\n if (result?.isInterrupted) {\n return await this._exit(result);\n }\n if (result) {\n results.push(result);\n } else {\n // If the command returned null, this means it should keep running (e.g. start).\n // We disallow returning undefined to avoid accidents.\n throw new Error('Command executor must return exit options or null');\n }\n this._onInterrupt = undefined;\n }\n\n // Clear the shouldRestart flag after passing it to the command execution.\n // This ensures the next iteration starts with shouldRestart=false, until\n // a command explicitly requests another restart by returning { restart: true }\n if (shouldRestart) {\n shouldRestart = false;\n }\n\n if (results.length) {\n if (results.some((r) => r.restart)) {\n shouldRestart = true;\n // Dispose all registered disposables.\n await this._autoDisposableList.dispose();\n this._reporter.reset(true /* clearOutputs */);\n\n console.warn(results.map((r) => r.message).join('\\n'));\n } else {\n // If one or more apps returned a result, exit.\n await this._exit({\n message: results.map((r) => r.message).join('\\n'),\n hasErrors: results.some((r) => r.hasErrors),\n // If any app returned a non-zero exit code, use that.\n exitCode: results.find(({ exitCode }) => !!exitCode)?.exitCode,\n });\n }\n }\n } while (shouldRestart);\n } catch (error) {\n // If an error occurs, exit the process with a non-zero exit code.\n const err = error as InvalidCloudpackConfigError;\n const message = err.isExpected\n ? err.message // Only show message for expected errors\n : err.stack || err.message || String(error); // Show full stack for unexpected errors\n\n await this._exit({\n hasErrors: true,\n message,\n });\n }\n }\n\n /**\n * Determine the app paths and initialize the context for each app.\n * @returns Context(s), or an exit options object if there was an error. (might also throw on error)\n */\n private async _initializeContexts(): Promise<AppCommandContext[] | CommandExitParams> {\n let appPaths: string[];\n\n if (this._discoverAppPaths) {\n // Search for cloudpack configs to determine the app path(s)\n const { app, login } = this._options as unknown as Pick<ReusedOptions, 'app' | 'login'>;\n const appPathsResult =\n this._discoverAppPaths === 'remote'\n ? await discoverRemoteAppPaths({\n options: {\n login,\n cachePath: this._options.cachePath,\n desiredApp: app,\n },\n context: {\n reporter: this._reporter,\n },\n })\n : await discoverLocalAppPaths({\n cwd: this._programOptions.cwd,\n discover: this._discoverAppPaths,\n desiredApp: app,\n });\n if (!Array.isArray(appPathsResult)) {\n // This means there was an error (or the user cancelled) while getting app paths.\n return appPathsResult;\n }\n appPaths = appPathsResult;\n } else {\n // Just use the cwd\n appPaths = [this._programOptions.cwd];\n }\n\n // The task runner is shared between all apps so that task results can potentially be reused.\n const taskRunner = new TaskRunner();\n\n const readConfig = this._discoverAppPaths === 'remote' ? readRemoteConfigs : readLocalConfigs;\n const configs = await readConfig(appPaths, {\n ...this._getConfigOptionsFromCliOptions(),\n enableDefaultFeatures: true,\n });\n\n const helpMessages = new Set<string>(\n Object.values(configs)\n .filter((c) => c.helpMessage)\n .map((c) => c.helpMessage) as string[],\n );\n\n // Set reporter options and print the product info header\n this._reporter.setOptions({\n productName: 'Cloudpack',\n version: this._programOptions.version,\n description: () => `Running \"${bold(this._programOptions.argv.slice(2).join(' '))}\"`,\n helpMessage: [...helpMessages].join('\\n'),\n plainTextMode: !this._options.color,\n logFile: !!this._options.logFile,\n cwd: this._programOptions.cwd,\n ...(this._options.debug\n ? debugLoggingConfig\n : this._options.verbose\n ? verboseLoggingConfig\n : this._options.quiet\n ? noLoggingConfig\n : defaultLoggingConfig),\n });\n\n const contexts: AppCommandContext[] = [];\n\n const logLevel = this._options.verbose ? 'VERBOSE' : this._options.debug ? 'DEBUG' : undefined;\n if (!this._options.debug) {\n this._reporter.ignoreLogMessage('ApplicationInsights:');\n }\n\n const telemetryApi = startTelemetry({\n productVersion: getVersion(import.meta.url),\n logLevel,\n serviceName: 'cli',\n });\n\n this._autoDisposableList.add({\n dispose: () => telemetryApi.shutdown(),\n });\n\n for (const appPath of Object.keys(configs)) {\n const config = configs[appPath];\n const definition = await readJson<PackageJson>(path.join(appPath, 'package.json'));\n const { name = path.basename(appPath) } = definition || {};\n\n const telemetryClient = await this._initTelemetry(name, config, telemetryApi);\n\n contexts.push({\n appPath,\n cachePath: this._options.cachePath,\n config,\n reporter: this._reporter,\n telemetryClient,\n taskRunner,\n });\n }\n\n return contexts;\n }\n\n /** Translate certain CLI options into options for `readConfig()`. */\n private _getConfigOptionsFromCliOptions(): ReadConfigOptions {\n // These options don't exist for all commands, but that's fine.\n const options = this._options as Partial<ReusedOptions & SharedOptions>;\n return {\n mode: options.mode,\n logBundleInfo: options.logBundleInfo,\n configFileName: options.config,\n // Handle --bundler by passing it as a universal package override, which will be appended\n // to any user-provided packageSettings so that it takes precedence.\n extraPackageSettings: options.bundler ? [{ match: '*', bundler: options.bundler }] : undefined,\n extraFeatures: options.features,\n extraDefineFlags: options.define,\n ...(this._applyOptionsToConfig?.(this._options) || {}),\n };\n }\n\n private async _initTelemetry(\n appName: string | undefined,\n config: CloudpackConfig,\n telemetryApi: TelemetryApi,\n ): Promise<TelemetryClient> {\n // Mark the start time for telemetry.\n const startTime = performance.now();\n\n const programOptions = this._programOptions;\n\n const connectionString =\n this._programOptions.disableTelemetry || environmentInfo.isJest\n ? undefined\n : config.telemetry?.connectionString || environmentInfo.cloudpack.telemetryConnectionString;\n\n const telemetryClient = await telemetryApi.createClient(connectionString);\n\n telemetryClient.tracer.startSpan('CLI_ENTRY', { startTime: getCliStartTime() }).end();\n\n await telemetryClient.tracer.startActiveSpan('INIT_TELEMETRY', { startTime }, (span) => {\n const enabledFeatureNames = Object.entries(config.features || {})\n .filter(([, value]) => value)\n .map(([key]) => key);\n\n if (enabledFeatureNames.length) {\n console.log(`Enabled features: ${enabledFeatureNames.map((f) => yellow(f)).join(', ')}`);\n }\n\n const telemetryAttributes = {\n verb: this._verb,\n arguments: programOptions.argv.slice(3).join(' '),\n environment: environmentInfo.isCI ? 'ci' : environmentInfo.isCodespaces ? 'codespaces' : 'local',\n appName: appName || '<unknown>',\n mode: config.mode,\n features: enabledFeatureNames,\n externalCorrelationId: environmentInfo.cloudpack.telemetryExternalCorrelationId,\n // Azure DevOps build attributes\n ...environmentInfo.ado,\n };\n\n for (const [key, value] of Object.entries(telemetryAttributes)) {\n if (value) {\n span.setAttribute(key, value);\n }\n }\n });\n\n return telemetryClient;\n }\n\n protected _sigintHandler = (): void => {\n this._sigintCount++;\n\n if (this._sigintCount > 1) {\n console.debug('Forcing exit');\n\n // We are forcing the process to exit.\n // No clean-up is needed because user pressed Ctrl+C twice.\n // eslint-disable-next-line no-restricted-properties -- top-level cleanup\n process.exit(1);\n }\n\n this._onInterrupt?.();\n\n // We are trying to exit gracefully.\n void this._exit({ isInterrupted: true, message: '' });\n };\n\n /**\n * Exit function called with the result returned by the command's execute function,\n * or manually via `CommandExecutor.exitAll()` in tests.\n */\n protected async _exit(params: CommandExitParams): Promise<never> {\n const { hasErrors = this._reporter.hasErrors(), exitCode = hasErrors ? 1 : 0 } = params;\n const message = params.isInterrupted ? this._getMessageOnInterrupt?.() || 'Interrupted by user' : params.message;\n\n if (this._hasCalledExit) {\n // Skip most of the operations if exit() was called multiple times.\n // But only use the error message if not in a test, due to the way we're mocking process.exit.\n if (!environmentInfo.isJest) {\n const prettyParams = Object.entries(params)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(', ');\n console.warn(`exit() was called multiple times. This call's options: ${prettyParams}.`);\n }\n } else {\n this._hasCalledExit = true;\n\n // Dispose all registered disposables.\n await this._autoDisposableList.dispose();\n\n // Show the summary message (this will throw if called twice).\n await this._reporter.complete({\n summary: hasErrors ? red(message) : message,\n showHelp: exitCode !== 0,\n });\n }\n\n CommandExecutor._activeInstances.delete(this);\n process.off('SIGINT', this._sigintHandler);\n\n // eslint-disable-next-line no-restricted-properties -- top-level cleanup\n process.exit(exitCode);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CommandExecutor.js","sourceRoot":"","sources":["../../src/utilities/CommandExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReadConfigOptions } from '@ms-cloudpack/config';\nimport type { CloudpackConfig, PackageJson } from '@ms-cloudpack/common-types';\nimport { readJson } from '@ms-cloudpack/json-utilities';\nimport {\n TaskReporter,\n bold,\n debugLoggingConfig,\n defaultLoggingConfig,\n noLoggingConfig,\n red,\n verboseLoggingConfig,\n yellow,\n} from '@ms-cloudpack/task-reporter';\nimport { startTelemetry, type TelemetryApi, type TelemetryClient } from '@ms-cloudpack/telemetry';\nimport path from 'path';\nimport type { CommandAction, CommandExitParams, AppCommandContext } from '../types/CommandAction.js';\nimport type { ProgramOptions } from '../types/ProgramOptions.js';\nimport type { SharedOptions } from '../types/SharedOptions.js';\nimport { AutoDisposableList } from './AutoDisposableList.js';\nimport { getVersion } from '@ms-cloudpack/package-utilities';\nimport { environmentInfo } from '@ms-cloudpack/environment';\nimport type { ReusedOptions } from '../types/ReusedOptions.js';\nimport type { AppPathDiscoveryMode } from '../types/AppPathDiscoveryMode.js';\nimport { discoverRemoteAppPaths } from './discoverRemoteAppPaths.js';\nimport { discoverLocalAppPaths } from './discoverLocalAppPaths.js';\nimport { TaskRunner } from '@ms-cloudpack/api-server';\nimport { readLocalConfigs, type InvalidCloudpackConfigError } from './readLocalConfigs.js';\nimport { readRemoteConfigs } from './readRemoteConfigs.js';\nimport { getCliStartTime } from './getCliStartTime.js';\nimport { commandEvents } from './commandEvents.js';\n\nexport interface CommandExecutorParams<TOptions extends SharedOptions> {\n /** Command-specific arguments */\n args: string[];\n\n /** Command-specific and shared options. */\n options: TOptions;\n\n /** Function to execute the command. */\n execute: CommandAction<TOptions>;\n\n /** Shared program-level configuration. */\n programOptions: ProgramOptions;\n\n /** Verb being run, e.g. `bundle` or `cache clean`. */\n verb: string;\n\n /**\n * By default, the command will run against `cwd` (usually `process.cwd()`).\n * If this option is set, attempt to discover app path(s) instead.\n * (`cwd` will still be preferred if it has a `cloudpack.config.json`.)\n * See {@link AppPathDiscoveryMode} for details.\n */\n discoverAppPaths: AppPathDiscoveryMode | undefined;\n\n /**\n * Apply any command-specific CLI options that need to be passed through to `readConfig`.\n * (Shared and reused options are applied automatically.)\n */\n applyOptionsToConfig:\n | ((\n options: Omit<TOptions, keyof (SharedOptions & ReusedOptions)>,\n ) => Pick<ReadConfigOptions, 'extraServerConfig'> | undefined)\n | undefined;\n}\n\n/**\n * This class manages orchestration and shared state while executing a command.\n */\n// 'app' is an optional reused option\nexport class CommandExecutor<TOptions extends SharedOptions> {\n private _options: TOptions;\n private _execute: CommandAction<TOptions>;\n private _programOptions: ProgramOptions;\n private _verb: string;\n private _discoverAppPaths: AppPathDiscoveryMode | undefined;\n private _applyOptionsToConfig: CommandExecutorParams<TOptions>['applyOptionsToConfig'];\n private _reporter: TaskReporter;\n private _autoDisposableList: AutoDisposableList;\n private _hasCalledExit = false;\n private _args: string[];\n private _sigintCount = 0;\n private _onInterrupt?: () => void;\n private _getMessageOnInterrupt?: () => string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- options type isn't used\n private static _activeInstances = new Set<CommandExecutor<any>>();\n\n public static async exitAll(params: CommandExitParams): Promise<void> {\n // There should only be one instance at a time, but we assume multiple instances for safety.\n for (const instance of CommandExecutor._activeInstances) {\n await instance._exit(params);\n process.off('SIGINT', instance._sigintHandler);\n }\n CommandExecutor._activeInstances = new Set();\n }\n\n constructor(params: CommandExecutorParams<TOptions>) {\n this._args = params.args;\n this._options = params.options;\n this._execute = params.execute;\n this._programOptions = params.programOptions;\n this._verb = params.verb;\n this._discoverAppPaths = params.discoverAppPaths;\n this._applyOptionsToConfig = params.applyOptionsToConfig;\n this._reporter = new TaskReporter();\n this._autoDisposableList = new AutoDisposableList();\n }\n\n /** Run the command. */\n // This has to be a separate method because constructors can't be async.\n public async execute(): Promise<void> {\n CommandExecutor._activeInstances.add(this);\n try {\n // Handle SIGINT (Ctrl+C) gracefully.\n if (!environmentInfo.isJest) {\n process.on('SIGINT', this._sigintHandler);\n }\n\n let shouldRestart = false;\n do {\n const contexts = await this._initializeContexts();\n\n if (!Array.isArray(contexts)) {\n await this._exit(contexts);\n return;\n }\n\n const spanName = `${this._verb.toUpperCase().replace(/ /g, '_')}_EXECUTE`;\n const results: CommandExitParams[] = [];\n\n for (const context of contexts) {\n // Call the execute function which is the real command logic\n // (ie: real init command logic, real start command logic, etc.)\n const result = await context.telemetryClient.tracer.startActiveSpan(spanName, async (span) => {\n this._onInterrupt = () => {\n span.setAttribute('isInterrupted', true);\n span.end();\n };\n\n return this._execute({\n ...context,\n span,\n isMultiApp: contexts.length > 1,\n args: this._args,\n options: this._options,\n isRestart: shouldRestart,\n autoDispose: (disposable) => this._autoDisposableList.add(disposable),\n setInterruptMessageHandler: (getMessage) => {\n this._getMessageOnInterrupt = getMessage;\n },\n });\n });\n if (result?.isInterrupted) {\n return await this._exit(result);\n }\n if (result) {\n results.push(result);\n } else {\n // If the command returned null, this means it should keep running (e.g. start).\n // We disallow returning undefined to avoid accidents.\n throw new Error('Command executor must return exit options or null');\n }\n this._onInterrupt = undefined;\n }\n\n // Clear the shouldRestart flag after passing it to the command execution.\n // This ensures the next iteration starts with shouldRestart=false, until\n // a command explicitly requests another restart by returning { restart: true }\n if (shouldRestart) {\n shouldRestart = false;\n }\n\n if (results.length) {\n if (results.some((r) => r.restart)) {\n shouldRestart = true;\n // Dispose all registered disposables.\n await this._autoDisposableList.dispose();\n this._reporter.reset(true /* clearOutputs */);\n\n console.warn(results.map((r) => r.message).join('\\n'));\n } else {\n // If one or more apps returned a result, exit.\n await this._exit({\n message: results.map((r) => r.message).join('\\n'),\n hasErrors: results.some((r) => r.hasErrors),\n // If any app returned a non-zero exit code, use that.\n exitCode: results.find(({ exitCode }) => !!exitCode)?.exitCode,\n });\n }\n }\n } while (shouldRestart);\n } catch (error) {\n // If an error occurs, exit the process with a non-zero exit code.\n const err = error as InvalidCloudpackConfigError;\n const message = err.isExpected\n ? err.message // Only show message for expected errors\n : err.stack || err.message || String(error); // Show full stack for unexpected errors\n\n await this._exit({\n hasErrors: true,\n message,\n });\n }\n }\n\n /**\n * Determine the app paths and initialize the context for each app.\n * @returns Context(s), or an exit options object if there was an error. (might also throw on error)\n */\n private async _initializeContexts(): Promise<AppCommandContext[] | CommandExitParams> {\n let appPaths: string[];\n\n if (this._discoverAppPaths) {\n // Search for cloudpack configs to determine the app path(s)\n const { app, login } = this._options as unknown as Pick<ReusedOptions, 'app' | 'login'>;\n const appPathsResult =\n this._discoverAppPaths === 'remote'\n ? await discoverRemoteAppPaths({\n options: {\n login,\n cachePath: this._options.cachePath,\n desiredApp: app,\n },\n context: {\n reporter: this._reporter,\n },\n })\n : await discoverLocalAppPaths({\n cwd: this._programOptions.cwd,\n discover: this._discoverAppPaths,\n desiredApp: app,\n });\n if (!Array.isArray(appPathsResult)) {\n // This means there was an error (or the user cancelled) while getting app paths.\n return appPathsResult;\n }\n appPaths = appPathsResult;\n } else {\n // Just use the cwd\n appPaths = [this._programOptions.cwd];\n }\n\n // The task runner is shared between all apps so that task results can potentially be reused.\n const taskRunner = new TaskRunner();\n\n const readConfig = this._discoverAppPaths === 'remote' ? readRemoteConfigs : readLocalConfigs;\n const configs = await readConfig(appPaths, {\n ...this._getConfigOptionsFromCliOptions(),\n enableDefaultFeatures: true,\n });\n\n const helpMessages = new Set<string>(\n Object.values(configs)\n .filter((c) => c.helpMessage)\n .map((c) => c.helpMessage) as string[],\n );\n\n // Set reporter options and print the product info header\n this._reporter.setOptions({\n productName: 'Cloudpack',\n version: this._programOptions.version,\n description: () => `Running \"${bold(this._programOptions.argv.slice(2).join(' '))}\"`,\n helpMessage: [...helpMessages].join('\\n'),\n plainTextMode: !this._options.color,\n logFile: !!this._options.logFile,\n cwd: this._programOptions.cwd,\n ...(this._options.debug\n ? debugLoggingConfig\n : this._options.verbose\n ? verboseLoggingConfig\n : this._options.quiet\n ? noLoggingConfig\n : defaultLoggingConfig),\n });\n\n const logLevel = this._options.verbose ? 'VERBOSE' : this._options.debug ? 'DEBUG' : undefined;\n if (!this._options.debug) {\n this._reporter.ignoreLogMessage('ApplicationInsights:');\n }\n\n const telemetryApi = startTelemetry({\n productVersion: getVersion(import.meta.url),\n logLevel,\n serviceName: 'cli',\n });\n\n this._autoDisposableList.add({ dispose: () => telemetryApi.shutdown() });\n\n const contexts: AppCommandContext[] = [];\n\n for (const appPath of Object.keys(configs)) {\n const config = configs[appPath];\n const definition = await readJson<PackageJson>(path.join(appPath, 'package.json'));\n const { name = path.basename(appPath) } = definition || {};\n\n const telemetryClient = await this._initTelemetry(name, config, telemetryApi);\n\n contexts.push({\n appPath,\n cachePath: this._options.cachePath,\n config,\n reporter: this._reporter,\n telemetryClient,\n taskRunner,\n });\n }\n\n return contexts;\n }\n\n /** Translate certain CLI options into options for `readConfig()`. */\n private _getConfigOptionsFromCliOptions(): ReadConfigOptions {\n // These options don't exist for all commands, but that's fine.\n const options = this._options as Partial<ReusedOptions & SharedOptions>;\n return {\n mode: options.mode,\n logBundleInfo: options.logBundleInfo,\n configFileName: options.config,\n // Handle --bundler by passing it as a universal package override, which will be appended\n // to any user-provided packageSettings so that it takes precedence.\n extraPackageSettings: options.bundler ? [{ match: '*', bundler: options.bundler }] : undefined,\n extraFeatures: options.features,\n extraDefineFlags: options.define,\n ...(this._applyOptionsToConfig?.(this._options) || {}),\n };\n }\n\n private async _initTelemetry(\n appName: string | undefined,\n config: CloudpackConfig,\n telemetryApi: TelemetryApi,\n ): Promise<TelemetryClient> {\n // Mark the start time for telemetry.\n const startTime = performance.now();\n\n const programOptions = this._programOptions;\n\n const connectionString =\n this._programOptions.disableTelemetry || environmentInfo.isJest\n ? undefined\n : config.telemetry?.connectionString || environmentInfo.cloudpack.telemetryConnectionString;\n\n const telemetryClient = await telemetryApi.createClient(connectionString);\n\n telemetryClient.tracer.startSpan('CLI_ENTRY', { startTime: getCliStartTime() }).end();\n\n await telemetryClient.tracer.startActiveSpan('INIT_TELEMETRY', { startTime }, (span) => {\n const enabledFeatureNames = Object.entries(config.features || {})\n .filter(([, value]) => value)\n .map(([key]) => key);\n\n if (enabledFeatureNames.length) {\n console.log(`Enabled features: ${enabledFeatureNames.map((f) => yellow(f)).join(', ')}`);\n }\n\n const telemetryAttributes = {\n verb: this._verb,\n arguments: programOptions.argv.slice(3).join(' '),\n environment: environmentInfo.isCI ? 'ci' : environmentInfo.isCodespaces ? 'codespaces' : 'local',\n appName: appName || '<unknown>',\n mode: config.mode,\n features: enabledFeatureNames,\n externalCorrelationId: environmentInfo.cloudpack.telemetryExternalCorrelationId,\n // Azure DevOps build attributes\n ...environmentInfo.ado,\n };\n\n for (const [key, value] of Object.entries(telemetryAttributes)) {\n if (value) {\n span.setAttribute(key, value);\n }\n }\n });\n\n return telemetryClient;\n }\n\n protected _sigintHandler = (): void => {\n this._sigintCount++;\n\n if (this._sigintCount > 1) {\n console.debug('Forcing exit');\n\n // We are forcing the process to exit.\n // No clean-up is needed because user pressed Ctrl+C twice.\n // eslint-disable-next-line no-restricted-properties -- top-level cleanup\n process.exit(1);\n }\n\n this._onInterrupt?.();\n\n // We are trying to exit gracefully.\n void this._exit({ isInterrupted: true, message: '' });\n };\n\n /**\n * Exit function called with the result returned by the command's execute function,\n * or manually via `CommandExecutor.exitAll()` in tests.\n */\n protected async _exit(params: CommandExitParams): Promise<never> {\n const { hasErrors = this._reporter.hasErrors(), exitCode = hasErrors ? 1 : 0 } = params;\n const message = params.isInterrupted ? this._getMessageOnInterrupt?.() || 'Interrupted by user' : params.message;\n\n if (this._hasCalledExit) {\n // Skip most of the operations if exit() was called multiple times.\n // But only use the error message if not in a test, due to the way we're mocking process.exit.\n if (!environmentInfo.isJest) {\n const prettyParams = Object.entries(params)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(', ');\n console.warn(`exit() was called multiple times. This call's options: ${prettyParams}.`);\n }\n } else {\n this._hasCalledExit = true;\n\n // Dispose all registered disposables.\n await this._autoDisposableList.dispose();\n\n // Remove all event listeners. Currently this is only done on final disposal because one of\n // the start tests relies on a 'ready' event listener carrying over across restarts.\n commandEvents.removeAllListeners();\n\n // Show the summary message (this will throw if called twice).\n await this._reporter.complete({\n summary: hasErrors ? red(message) : message,\n showHelp: exitCode !== 0,\n });\n }\n\n CommandExecutor._activeInstances.delete(this);\n process.off('SIGINT', this._sigintHandler);\n\n // eslint-disable-next-line no-restricted-properties -- top-level cleanup\n process.exit(exitCode);\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
/**
|
|
3
|
+
* Event emitter for command lifecycle events. Not all events are applicable to all commands.
|
|
4
|
+
*
|
|
5
|
+
* This event emitter provides a reliable mechanism for coordinating test execution
|
|
6
|
+
* with server initialization, ensuring that test assertions only run after all
|
|
7
|
+
* necessary services are fully operational.
|
|
8
|
+
*
|
|
9
|
+
* Events:
|
|
10
|
+
* - `'ready'`: An interactive command is ready.
|
|
11
|
+
* - For `start`, all servers are ready (and browser opening has started).
|
|
12
|
+
*/
|
|
13
|
+
export declare const commandEvents: EventEmitter<{
|
|
14
|
+
ready: [];
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=commandEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandEvents.d.ts","sourceRoot":"","sources":["../../src/utilities/commandEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa;WAA6B,EAAE;EAAK,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
/**
|
|
3
|
+
* Event emitter for command lifecycle events. Not all events are applicable to all commands.
|
|
4
|
+
*
|
|
5
|
+
* This event emitter provides a reliable mechanism for coordinating test execution
|
|
6
|
+
* with server initialization, ensuring that test assertions only run after all
|
|
7
|
+
* necessary services are fully operational.
|
|
8
|
+
*
|
|
9
|
+
* Events:
|
|
10
|
+
* - `'ready'`: An interactive command is ready.
|
|
11
|
+
* - For `start`, all servers are ready (and browser opening has started).
|
|
12
|
+
*/
|
|
13
|
+
export const commandEvents = new EventEmitter();
|
|
14
|
+
//# sourceMappingURL=commandEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandEvents.js","sourceRoot":"","sources":["../../src/utilities/commandEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,YAAY,EAAiB,CAAC","sourcesContent":["import { EventEmitter } from 'node:events';\n\n/**\n * Event emitter for command lifecycle events. Not all events are applicable to all commands.\n *\n * This event emitter provides a reliable mechanism for coordinating test execution\n * with server initialization, ensuring that test assertions only run after all\n * necessary services are fully operational.\n *\n * Events:\n * - `'ready'`: An interactive command is ready.\n * - For `start`, all servers are ready (and browser opening has started).\n */\nexport const commandEvents = new EventEmitter<{ ready: [] }>();\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AppServer } from '@ms-cloudpack/app-server';
|
|
2
|
+
/**
|
|
3
|
+
* Dispose an app/API/bundle server with logging and error handling.
|
|
4
|
+
*/
|
|
5
|
+
export declare function disposeServer(name: string, server: Pick<AppServer, 'url' | 'close'> | undefined): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=disposeServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disposeServer.d.ts","sourceRoot":"","sources":["../../src/utilities/disposeServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrH"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispose an app/API/bundle server with logging and error handling.
|
|
3
|
+
*/
|
|
4
|
+
export async function disposeServer(name, server) {
|
|
5
|
+
if (!server)
|
|
6
|
+
return;
|
|
7
|
+
const desc = `${name} (${server.url})`;
|
|
8
|
+
console.info(`Closing ${desc}`);
|
|
9
|
+
try {
|
|
10
|
+
await server.close();
|
|
11
|
+
console.info(`Closed ${desc}`);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
console.warn(`Error closing ${desc}:`, err);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=disposeServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disposeServer.js","sourceRoot":"","sources":["../../src/utilities/disposeServer.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,MAAoD;IACpG,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,IAAI,GAAG,GAAG,IAAI,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,iBAAiB,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC","sourcesContent":["import type { AppServer } from '@ms-cloudpack/app-server';\n\n/**\n * Dispose an app/API/bundle server with logging and error handling.\n */\nexport async function disposeServer(name: string, server: Pick<AppServer, 'url' | 'close'> | undefined): Promise<void> {\n if (!server) return;\n\n const desc = `${name} (${server.url})`;\n console.info(`Closing ${desc}`);\n try {\n await server.close();\n console.info(`Closed ${desc}`);\n } catch (err) {\n console.warn(`Error closing ${desc}:`, err);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ms-cloudpack/cli",
|
|
3
|
-
"version": "0.77.
|
|
3
|
+
"version": "0.77.10",
|
|
4
4
|
"description": "The Cloudpack command line interface - a tool for managing fast inner and outer looping in web apps.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -18,25 +18,25 @@
|
|
|
18
18
|
"cloudpack": "./bin/cloudpack.js"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@ms-cloudpack/api-server": "^0.64.
|
|
22
|
-
"@ms-cloudpack/app-server": "^0.20.
|
|
23
|
-
"@ms-cloudpack/bundler": "^0.26.
|
|
24
|
-
"@ms-cloudpack/bundler-capabilities": "^0.3.
|
|
25
|
-
"@ms-cloudpack/common-types": "^0.28.
|
|
26
|
-
"@ms-cloudpack/config": "^0.38.
|
|
27
|
-
"@ms-cloudpack/create-express-app": "^1.10.
|
|
21
|
+
"@ms-cloudpack/api-server": "^0.64.24",
|
|
22
|
+
"@ms-cloudpack/app-server": "^0.20.16",
|
|
23
|
+
"@ms-cloudpack/bundler": "^0.26.1",
|
|
24
|
+
"@ms-cloudpack/bundler-capabilities": "^0.3.4",
|
|
25
|
+
"@ms-cloudpack/common-types": "^0.28.1",
|
|
26
|
+
"@ms-cloudpack/config": "^0.38.6",
|
|
27
|
+
"@ms-cloudpack/create-express-app": "^1.10.53",
|
|
28
28
|
"@ms-cloudpack/environment": "^0.1.1",
|
|
29
|
-
"@ms-cloudpack/file-watcher": "^0.4.
|
|
29
|
+
"@ms-cloudpack/file-watcher": "^0.4.11",
|
|
30
30
|
"@ms-cloudpack/json-utilities": "^0.1.11",
|
|
31
|
-
"@ms-cloudpack/link-proxy": "^0.2.
|
|
32
|
-
"@ms-cloudpack/overlay": "^0.19.
|
|
33
|
-
"@ms-cloudpack/package-utilities": "^12.5.
|
|
31
|
+
"@ms-cloudpack/link-proxy": "^0.2.38",
|
|
32
|
+
"@ms-cloudpack/overlay": "^0.19.34",
|
|
33
|
+
"@ms-cloudpack/package-utilities": "^12.5.3",
|
|
34
34
|
"@ms-cloudpack/path-string-parsing": "^1.2.7",
|
|
35
|
-
"@ms-cloudpack/path-utilities": "^3.1.
|
|
36
|
-
"@ms-cloudpack/remote-cache": "^0.11.
|
|
37
|
-
"@ms-cloudpack/setup-utilities": "^0.5.
|
|
35
|
+
"@ms-cloudpack/path-utilities": "^3.1.24",
|
|
36
|
+
"@ms-cloudpack/remote-cache": "^0.11.42",
|
|
37
|
+
"@ms-cloudpack/setup-utilities": "^0.5.45",
|
|
38
38
|
"@ms-cloudpack/task-reporter": "^0.17.4",
|
|
39
|
-
"@ms-cloudpack/telemetry": "^0.11.
|
|
39
|
+
"@ms-cloudpack/telemetry": "^0.11.42",
|
|
40
40
|
"@yarnpkg/lockfile": "^1.1.0",
|
|
41
41
|
"commander": "^14.0.0",
|
|
42
42
|
"cross-spawn": "^7.0.3",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"workspace-tools": "^0.38.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
|
-
"@ms-cloudpack/common-types": "^0.28.
|
|
52
|
+
"@ms-cloudpack/common-types": "^0.28.1",
|
|
53
53
|
"@ms-cloudpack/common-types-browser": "^0.6.3",
|
|
54
54
|
"@ms-cloudpack/eslint-plugin-internal": "^0.0.1",
|
|
55
55
|
"@ms-cloudpack/scripts": "^0.0.1",
|
package/schema/AppConfig.json
CHANGED
|
@@ -153,6 +153,14 @@
|
|
|
153
153
|
"description": "The default path under the domain to use when opening the browser.",
|
|
154
154
|
"default": ""
|
|
155
155
|
},
|
|
156
|
+
"open": {
|
|
157
|
+
"type": [
|
|
158
|
+
"boolean",
|
|
159
|
+
"string"
|
|
160
|
+
],
|
|
161
|
+
"description": "Whether to automatically open the browser when the server starts, or a specific URL to open. (You can also use the `--open` or `--no-open` CLI options.)",
|
|
162
|
+
"default": true
|
|
163
|
+
},
|
|
156
164
|
"https": {
|
|
157
165
|
"anyOf": [
|
|
158
166
|
{
|
package/schema/UserConfig.json
CHANGED
|
@@ -154,6 +154,14 @@
|
|
|
154
154
|
"description": "The default path under the domain to use when opening the browser.",
|
|
155
155
|
"default": ""
|
|
156
156
|
},
|
|
157
|
+
"open": {
|
|
158
|
+
"type": [
|
|
159
|
+
"boolean",
|
|
160
|
+
"string"
|
|
161
|
+
],
|
|
162
|
+
"description": "Whether to automatically open the browser when the server starts, or a specific URL to open. (You can also use the `--open` or `--no-open` CLI options.)",
|
|
163
|
+
"default": true
|
|
164
|
+
},
|
|
157
165
|
"https": {
|
|
158
166
|
"anyOf": [
|
|
159
167
|
{
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import EventEmitter from 'events';
|
|
2
|
-
/**
|
|
3
|
-
* Event emitter for start command lifecycle events.
|
|
4
|
-
*
|
|
5
|
-
* This event emitter provides a reliable mechanism for coordinating test execution
|
|
6
|
-
* with server initialization, ensuring that test assertions only run after all
|
|
7
|
-
* necessary services are fully operational.
|
|
8
|
-
*
|
|
9
|
-
* Events:
|
|
10
|
-
* - ready: Emitted when all servers are ready. This allows tests to wait for full
|
|
11
|
-
* initialization before running assertions.
|
|
12
|
-
*/
|
|
13
|
-
export declare const startEvents: EventEmitter<{
|
|
14
|
-
ready: [];
|
|
15
|
-
}>;
|
|
16
|
-
//# sourceMappingURL=startEvents.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"startEvents.d.ts","sourceRoot":"","sources":["../../../src/commands/start/startEvents.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW;WAA6B,EAAE;EAAK,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import EventEmitter from 'events';
|
|
2
|
-
/**
|
|
3
|
-
* Event emitter for start command lifecycle events.
|
|
4
|
-
*
|
|
5
|
-
* This event emitter provides a reliable mechanism for coordinating test execution
|
|
6
|
-
* with server initialization, ensuring that test assertions only run after all
|
|
7
|
-
* necessary services are fully operational.
|
|
8
|
-
*
|
|
9
|
-
* Events:
|
|
10
|
-
* - ready: Emitted when all servers are ready. This allows tests to wait for full
|
|
11
|
-
* initialization before running assertions.
|
|
12
|
-
*/
|
|
13
|
-
export const startEvents = new EventEmitter();
|
|
14
|
-
//# sourceMappingURL=startEvents.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"startEvents.js","sourceRoot":"","sources":["../../../src/commands/start/startEvents.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,YAAY,EAAiB,CAAC","sourcesContent":["import EventEmitter from 'events';\n\n/**\n * Event emitter for start command lifecycle events.\n *\n * This event emitter provides a reliable mechanism for coordinating test execution\n * with server initialization, ensuring that test assertions only run after all\n * necessary services are fully operational.\n *\n * Events:\n * - ready: Emitted when all servers are ready. This allows tests to wait for full\n * initialization before running assertions.\n */\nexport const startEvents = new EventEmitter<{ ready: [] }>();\n"]}
|