@lage-run/cli 0.24.3 → 0.24.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +91 -1
- package/CHANGELOG.md +28 -2
- package/lib/commands/exec/action.d.ts +1 -0
- package/lib/commands/exec/action.js +3 -0
- package/lib/commands/exec/action.js.map +1 -1
- package/lib/commands/exec/executeRemotely.d.ts +3 -1
- package/lib/commands/exec/executeRemotely.js +12 -55
- package/lib/commands/exec/executeRemotely.js.map +1 -1
- package/lib/commands/exec/index.js +2 -1
- package/lib/commands/exec/index.js.map +1 -1
- package/lib/commands/info/action.js +8 -21
- package/lib/commands/info/action.js.map +1 -1
- package/lib/commands/launchServerInBackground.d.ts +11 -0
- package/lib/commands/launchServerInBackground.js +98 -0
- package/lib/commands/launchServerInBackground.js.map +1 -0
- package/lib/commands/run/createTargetGraph.js +26 -2
- package/lib/commands/run/createTargetGraph.js.map +1 -1
- package/lib/commands/run/runAction.js +9 -1
- package/lib/commands/run/runAction.js.map +1 -1
- package/lib/commands/server/action.d.ts +1 -0
- package/lib/commands/server/action.js +3 -2
- package/lib/commands/server/action.js.map +1 -1
- package/lib/commands/server/index.js +3 -8
- package/lib/commands/server/index.js.map +1 -1
- package/lib/commands/server/lageService.d.ts +5 -3
- package/lib/commands/server/lageService.js +49 -30
- package/lib/commands/server/lageService.js.map +1 -1
- package/lib/filter/getFilteredPackages.js +2 -65
- package/lib/filter/getFilteredPackages.js.map +1 -1
- package/lib/filter/hasRepoChanged.d.ts +2 -0
- package/lib/filter/hasRepoChanged.js +75 -0
- package/lib/filter/hasRepoChanged.js.map +1 -0
- package/lib/optimizeTargetGraph.d.ts +3 -0
- package/lib/optimizeTargetGraph.js +49 -0
- package/lib/optimizeTargetGraph.js.map +1 -0
- package/package.json +11 -10
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,97 @@
|
|
|
2
2
|
"name": "@lage-run/cli",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "Wed,
|
|
5
|
+
"date": "Wed, 04 Dec 2024 23:49:59 GMT",
|
|
6
|
+
"version": "0.24.5",
|
|
7
|
+
"tag": "@lage-run/cli_v0.24.5",
|
|
8
|
+
"comments": {
|
|
9
|
+
"patch": [
|
|
10
|
+
{
|
|
11
|
+
"author": "kchau@microsoft.com",
|
|
12
|
+
"package": "@lage-run/cli",
|
|
13
|
+
"commit": "a512ef3dffa4e87edcd33a762e10418e0579ca02",
|
|
14
|
+
"comment": "Fixes the server worker model to use aggregated pool"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"author": "beachball",
|
|
18
|
+
"package": "@lage-run/cli",
|
|
19
|
+
"comment": "Bump @lage-run/scheduler to v1.4.1",
|
|
20
|
+
"commit": "not available"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"author": "beachball",
|
|
24
|
+
"package": "@lage-run/cli",
|
|
25
|
+
"comment": "Bump @lage-run/worker-threads-pool to v0.8.5",
|
|
26
|
+
"commit": "not available"
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"date": "Mon, 02 Dec 2024 17:23:22 GMT",
|
|
33
|
+
"version": "0.24.4",
|
|
34
|
+
"tag": "@lage-run/cli_v0.24.4",
|
|
35
|
+
"comments": {
|
|
36
|
+
"patch": [
|
|
37
|
+
{
|
|
38
|
+
"author": "kchau@microsoft.com",
|
|
39
|
+
"package": "@lage-run/cli",
|
|
40
|
+
"commit": "51d453bb81eb36a37656502fb716f611860d910e",
|
|
41
|
+
"comment": "adds the ability to create stagedTargets"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"author": "beachball",
|
|
45
|
+
"package": "@lage-run/cli",
|
|
46
|
+
"comment": "Bump @lage-run/cache to v1.3.10",
|
|
47
|
+
"commit": "not available"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"author": "beachball",
|
|
51
|
+
"package": "@lage-run/cli",
|
|
52
|
+
"comment": "Bump @lage-run/config to v0.4.11",
|
|
53
|
+
"commit": "not available"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"author": "beachball",
|
|
57
|
+
"package": "@lage-run/cli",
|
|
58
|
+
"comment": "Bump @lage-run/hasher to v1.6.7",
|
|
59
|
+
"commit": "not available"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"author": "beachball",
|
|
63
|
+
"package": "@lage-run/cli",
|
|
64
|
+
"comment": "Bump @lage-run/reporters to v1.2.18",
|
|
65
|
+
"commit": "not available"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"author": "beachball",
|
|
69
|
+
"package": "@lage-run/cli",
|
|
70
|
+
"comment": "Bump @lage-run/runners to v1.2.0",
|
|
71
|
+
"commit": "not available"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"author": "beachball",
|
|
75
|
+
"package": "@lage-run/cli",
|
|
76
|
+
"comment": "Bump @lage-run/scheduler to v1.4.0",
|
|
77
|
+
"commit": "not available"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"author": "beachball",
|
|
81
|
+
"package": "@lage-run/cli",
|
|
82
|
+
"comment": "Bump @lage-run/scheduler-types to v0.3.22",
|
|
83
|
+
"commit": "not available"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"author": "beachball",
|
|
87
|
+
"package": "@lage-run/cli",
|
|
88
|
+
"comment": "Bump @lage-run/target-graph to v0.11.0",
|
|
89
|
+
"commit": "not available"
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"date": "Wed, 20 Nov 2024 08:12:37 GMT",
|
|
6
96
|
"version": "0.24.3",
|
|
7
97
|
"tag": "@lage-run/cli_v0.24.3",
|
|
8
98
|
"comments": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,38 @@
|
|
|
1
1
|
# Change Log - @lage-run/cli
|
|
2
2
|
|
|
3
|
-
<!-- This log was last generated on Wed,
|
|
3
|
+
<!-- This log was last generated on Wed, 04 Dec 2024 23:49:59 GMT and should not be manually modified. -->
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 0.24.5
|
|
8
|
+
|
|
9
|
+
Wed, 04 Dec 2024 23:49:59 GMT
|
|
10
|
+
|
|
11
|
+
### Patches
|
|
12
|
+
|
|
13
|
+
- Fixes the server worker model to use aggregated pool (kchau@microsoft.com)
|
|
14
|
+
- Bump @lage-run/scheduler to v1.4.1
|
|
15
|
+
- Bump @lage-run/worker-threads-pool to v0.8.5
|
|
16
|
+
|
|
17
|
+
## 0.24.4
|
|
18
|
+
|
|
19
|
+
Mon, 02 Dec 2024 17:23:22 GMT
|
|
20
|
+
|
|
21
|
+
### Patches
|
|
22
|
+
|
|
23
|
+
- adds the ability to create stagedTargets (kchau@microsoft.com)
|
|
24
|
+
- Bump @lage-run/cache to v1.3.10
|
|
25
|
+
- Bump @lage-run/config to v0.4.11
|
|
26
|
+
- Bump @lage-run/hasher to v1.6.7
|
|
27
|
+
- Bump @lage-run/reporters to v1.2.18
|
|
28
|
+
- Bump @lage-run/runners to v1.2.0
|
|
29
|
+
- Bump @lage-run/scheduler to v1.4.0
|
|
30
|
+
- Bump @lage-run/scheduler-types to v0.3.22
|
|
31
|
+
- Bump @lage-run/target-graph to v0.11.0
|
|
32
|
+
|
|
7
33
|
## 0.24.3
|
|
8
34
|
|
|
9
|
-
Wed, 20 Nov 2024 08:12:
|
|
35
|
+
Wed, 20 Nov 2024 08:12:37 GMT
|
|
10
36
|
|
|
11
37
|
### Patches
|
|
12
38
|
|
|
@@ -26,6 +26,9 @@ async function execAction(options, command) {
|
|
|
26
26
|
const { server } = options;
|
|
27
27
|
if (server) {
|
|
28
28
|
logger.info("Running in server mode");
|
|
29
|
+
if (typeof options.tasks === "undefined") {
|
|
30
|
+
throw new Error("No tasks specified, this is required for when running in server mode");
|
|
31
|
+
}
|
|
29
32
|
await (0, _executeRemotely.executeRemotely)(options, command);
|
|
30
33
|
} else {
|
|
31
34
|
await (0, _executeInProcess.executeInProcess)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/exec/action.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport createLogger from \"@lage-run/logger\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { executeInProcess } from \"./executeInProcess.js\";\nimport { executeRemotely } from \"./executeRemotely.js\";\n\ninterface ExecOptions extends ReporterInitOptions {\n cwd?: string;\n server?: boolean | string;\n timeout?: number;\n nodeArg?: string;\n}\n\nexport async function execAction(options: ExecOptions, command: Command) {\n const logger = createLogger();\n options.cwd = options.cwd ?? process.cwd();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n initializeReporters(logger, options);\n\n const { server } = options;\n if (server) {\n logger.info(\"Running in server mode\");\n await executeRemotely(options, command);\n } else {\n await executeInProcess({ logger, args: command.args, cwd: options.cwd, nodeArg: options.nodeArg });\n }\n}\n"],"names":["execAction","options","command","logger","createLogger","cwd","process","logLevel","reporter","initializeReporters","server","info","executeRemotely","executeInProcess","args","nodeArg"],"mappings":";;;;+
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/exec/action.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport createLogger from \"@lage-run/logger\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { executeInProcess } from \"./executeInProcess.js\";\nimport { executeRemotely } from \"./executeRemotely.js\";\n\ninterface ExecOptions extends ReporterInitOptions {\n cwd?: string;\n server?: boolean | string;\n timeout?: number;\n nodeArg?: string;\n tasks?: string[];\n}\n\ninterface ExecRemoteOptions extends ExecOptions {\n tasks: string[];\n}\n\nexport async function execAction(options: ExecOptions, command: Command) {\n const logger = createLogger();\n options.cwd = options.cwd ?? process.cwd();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n initializeReporters(logger, options);\n\n const { server } = options;\n if (server) {\n logger.info(\"Running in server mode\");\n\n if (typeof options.tasks === \"undefined\") {\n throw new Error(\"No tasks specified, this is required for when running in server mode\");\n }\n\n await executeRemotely(options as ExecRemoteOptions, command);\n } else {\n await executeInProcess({ logger, args: command.args, cwd: options.cwd, nodeArg: options.nodeArg });\n }\n}\n"],"names":["execAction","options","command","logger","createLogger","cwd","process","logLevel","reporter","initializeReporters","server","info","tasks","Error","executeRemotely","executeInProcess","args","nodeArg"],"mappings":";;;;+BAmBsBA;;;eAAAA;;;+DAlBG;qCAEW;kCACH;iCACD;;;;;;AAczB,eAAeA,WAAWC,OAAoB,EAAEC,OAAgB;IACrE,MAAMC,SAASC,IAAAA,eAAY;IAC3BH,QAAQI,GAAG,GAAGJ,QAAQI,GAAG,IAAIC,QAAQD,GAAG;IACxCJ,QAAQM,QAAQ,GAAGN,QAAQM,QAAQ,IAAI;IACvCN,QAAQO,QAAQ,GAAGP,QAAQO,QAAQ,IAAI;IACvCC,IAAAA,wCAAmB,EAACN,QAAQF;IAE5B,MAAM,EAAES,MAAM,EAAE,GAAGT;IACnB,IAAIS,QAAQ;QACVP,OAAOQ,IAAI,CAAC;QAEZ,IAAI,OAAOV,QAAQW,KAAK,KAAK,aAAa;YACxC,MAAM,IAAIC,MAAM;QAClB;QAEA,MAAMC,IAAAA,gCAAe,EAACb,SAA8BC;IACtD,OAAO;QACL,MAAMa,IAAAA,kCAAgB,EAAC;YAAEZ;YAAQa,MAAMd,QAAQc,IAAI;YAAEX,KAAKJ,QAAQI,GAAG;YAAEY,SAAShB,QAAQgB,OAAO;QAAC;IAClG;AACF"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { ReporterInitOptions } from "../../types/ReporterInitOptions.js";
|
|
2
|
+
import type { Command } from "commander";
|
|
2
3
|
interface ExecRemotelyOptions extends ReporterInitOptions {
|
|
3
4
|
cwd?: string;
|
|
4
5
|
server?: string | boolean;
|
|
5
6
|
timeout?: number;
|
|
7
|
+
tasks: string[];
|
|
6
8
|
}
|
|
7
|
-
export declare function executeRemotely(options: ExecRemotelyOptions, command:
|
|
9
|
+
export declare function executeRemotely(options: ExecRemotelyOptions, command: Command): Promise<void>;
|
|
8
10
|
export {};
|
|
@@ -13,13 +13,11 @@ const _initializeReporters = require("../initializeReporters.js");
|
|
|
13
13
|
const _rpc = require("@lage-run/rpc");
|
|
14
14
|
const _filterArgsForTasks = require("../run/filterArgsForTasks.js");
|
|
15
15
|
const _simulateFileAccess = require("./simulateFileAccess.js");
|
|
16
|
-
const _execa = /*#__PURE__*/ _interop_require_default(require("execa"));
|
|
17
|
-
const _getBinPaths = require("../../getBinPaths.js");
|
|
18
16
|
const _parseServerOption = require("../parseServerOption.js");
|
|
19
|
-
const _properlockfile = /*#__PURE__*/ _interop_require_default(require("proper-lockfile"));
|
|
20
17
|
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
21
18
|
const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
22
19
|
const _workspacetools = require("workspace-tools");
|
|
20
|
+
const _launchServerInBackground = require("../launchServerInBackground.js");
|
|
23
21
|
function _interop_require_default(obj) {
|
|
24
22
|
return obj && obj.__esModule ? obj : {
|
|
25
23
|
default: obj
|
|
@@ -113,68 +111,27 @@ function ensurePidFile(lockfilePath) {
|
|
|
113
111
|
async function executeRemotely(options, command) {
|
|
114
112
|
// launch a 'lage-server.js' process, detached if it is not already running
|
|
115
113
|
// send the command to the server process
|
|
116
|
-
const { server } = options;
|
|
117
|
-
const timeout = options.timeout ??
|
|
114
|
+
const { server, tasks } = options;
|
|
115
|
+
const timeout = options.timeout ?? 5 * 60;
|
|
118
116
|
const { host, port } = (0, _parseServerOption.parseServerOption)(server);
|
|
119
117
|
const logger = (0, _logger.default)();
|
|
120
118
|
options.logLevel = options.logLevel ?? "info";
|
|
121
119
|
options.reporter = options.reporter ?? "json";
|
|
122
120
|
(0, _initializeReporters.initializeReporters)(logger, options);
|
|
123
121
|
const root = (0, _workspacetools.getWorkspaceRoot)(options.cwd ?? process.cwd());
|
|
124
|
-
const lockfilePath = _path.default.join(root, `node_modules/.cache/lage/.lage-server-${host}-${port}.pid`);
|
|
125
122
|
let client = await tryCreateClient(host, port);
|
|
126
123
|
const args = command.args;
|
|
124
|
+
logger.info(`Command args ${command.args.join(" ")}`);
|
|
127
125
|
if (!client) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
minTimeout: 0.5 * 1000,
|
|
137
|
-
maxTimeout: 60 * 1000,
|
|
138
|
-
randomize: true
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
const pid = parseInt(_fs.default.readFileSync(lockfilePath, "utf-8"));
|
|
142
|
-
const isServerRunning = pid && isAlive(pid);
|
|
143
|
-
logger.info("Checking if server is already running", {
|
|
144
|
-
pid,
|
|
145
|
-
isServerRunning
|
|
126
|
+
await (0, _launchServerInBackground.launchServerInBackground)({
|
|
127
|
+
host,
|
|
128
|
+
port,
|
|
129
|
+
tasks,
|
|
130
|
+
args,
|
|
131
|
+
timeout,
|
|
132
|
+
logger,
|
|
133
|
+
root
|
|
146
134
|
});
|
|
147
|
-
if (pid && isServerRunning) {
|
|
148
|
-
logger.info("Server already running", {
|
|
149
|
-
pid
|
|
150
|
-
});
|
|
151
|
-
} else {
|
|
152
|
-
const binPaths = (0, _getBinPaths.getBinPaths)();
|
|
153
|
-
const lageServerBinPath = binPaths["lage-server"];
|
|
154
|
-
const lageServerArgs = [
|
|
155
|
-
"--host",
|
|
156
|
-
host,
|
|
157
|
-
"--port",
|
|
158
|
-
port,
|
|
159
|
-
"--timeout",
|
|
160
|
-
timeout,
|
|
161
|
-
...args
|
|
162
|
-
];
|
|
163
|
-
logger.info(`Launching lage-server with these parameters: ${lageServerArgs.join(" ")}`);
|
|
164
|
-
const child = (0, _execa.default)(lageServerBinPath, lageServerArgs, {
|
|
165
|
-
cwd: root,
|
|
166
|
-
detached: true,
|
|
167
|
-
stdio: "ignore"
|
|
168
|
-
});
|
|
169
|
-
if (child && child.pid) {
|
|
170
|
-
_fs.default.writeFileSync(lockfilePath, child.pid.toString());
|
|
171
|
-
}
|
|
172
|
-
child.unref();
|
|
173
|
-
logger.info("Server started", {
|
|
174
|
-
pid: child.pid
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
await releaseLock();
|
|
178
135
|
logger.info("Creating a client to connect to the background services");
|
|
179
136
|
client = await tryCreateClientWithRetries(host, port, logger);
|
|
180
137
|
if (!client) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/exec/executeRemotely.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport createLogger from \"@lage-run/logger\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { LageClient } from \"@lage-run/rpc\";\nimport { ConnectError, createClient } from \"@lage-run/rpc\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport { simulateFileAccess } from \"./simulateFileAccess.js\";\nimport execa from \"execa\";\nimport { getBinPaths } from \"../../getBinPaths.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport lockfile from \"proper-lockfile\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { getWorkspaceRoot } from \"workspace-tools\";\n\ninterface ExecRemotelyOptions extends ReporterInitOptions {\n cwd?: string;\n server?: string | boolean;\n timeout?: number;\n}\n\nasync function tryCreateClient(host: string, port: number) {\n const client = createClient({\n baseUrl: `http://${host}:${port}`,\n httpVersion: \"2\",\n });\n\n try {\n const success = await client.ping({});\n if (success.pong) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n return undefined;\n }\n\n throw e;\n }\n\n return undefined;\n}\n\nasync function tryCreateClientWithRetries(host: string, port: number, logger: Logger) {\n let client: ReturnType<typeof createClient> | undefined;\n\n const start = Date.now();\n while (Date.now() - start < 5 * 1000) {\n try {\n client = await tryCreateClient(host, port);\n\n if (client) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n logger.error(\"Error connecting to server\", e);\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n return undefined;\n}\n\nasync function executeOnServer(args: string[], client: LageClient, logger: Logger) {\n const task = args.length === 1 ? args[0] : args[1];\n const packageName = args.length > 1 ? args[0] : undefined;\n\n if (!task) {\n throw new Error(\"No task provided\");\n }\n\n const { taskArgs } = filterArgsForTasks(args ?? []);\n\n try {\n const response = await client.runTarget({\n packageName,\n task,\n taskArgs,\n });\n logger.info(`Task ${response.packageName} ${response.task} exited with code ${response.exitCode} `);\n return response;\n } catch (error) {\n if (error instanceof ConnectError) {\n logger.error(\"Error connecting to server\", { error });\n } else {\n logger.error(\"Error running task\", { error });\n }\n }\n}\n\nfunction isAlive(pid: number) {\n try {\n return process.kill(pid, 0);\n } catch {\n return false;\n }\n}\n\nfunction ensurePidFile(lockfilePath: string) {\n if (!fs.existsSync(path.dirname(lockfilePath))) {\n fs.mkdirSync(path.dirname(lockfilePath), { recursive: true });\n }\n\n if (!fs.existsSync(lockfilePath)) {\n try {\n const fd = fs.openSync(lockfilePath, \"w\");\n fs.closeSync(fd);\n } catch {\n // ignore\n }\n }\n}\n\nexport async function executeRemotely(options: ExecRemotelyOptions, command) {\n // launch a 'lage-server.js' process, detached if it is not already running\n // send the command to the server process\n const { server } = options;\n const timeout = options.timeout ?? 120;\n\n const { host, port } = parseServerOption(server);\n\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n initializeReporters(logger, options);\n\n const root = getWorkspaceRoot(options.cwd ?? process.cwd())!;\n\n const lockfilePath = path.join(root, `node_modules/.cache/lage/.lage-server-${host}-${port}.pid`);\n\n let client = await tryCreateClient(host, port);\n const args = command.args;\n\n if (!client) {\n logger.info(`Starting server on http://${host}:${port}`);\n logger.info(`acquiring lock: ${lockfilePath}`);\n\n ensurePidFile(lockfilePath);\n\n const releaseLock = await lockfile.lock(lockfilePath, {\n stale: 1000 * 60 * 1,\n retries: {\n retries: 10,\n factor: 3,\n minTimeout: 0.5 * 1000,\n maxTimeout: 60 * 1000,\n randomize: true,\n },\n });\n\n const pid = parseInt(fs.readFileSync(lockfilePath, \"utf-8\"));\n const isServerRunning = pid && isAlive(pid);\n logger.info(\"Checking if server is already running\", { pid, isServerRunning });\n if (pid && isServerRunning) {\n logger.info(\"Server already running\", { pid });\n } else {\n const binPaths = getBinPaths();\n const lageServerBinPath = binPaths[\"lage-server\"];\n const lageServerArgs = [\"--host\", host, \"--port\", port, \"--timeout\", timeout, ...args];\n\n logger.info(`Launching lage-server with these parameters: ${lageServerArgs.join(\" \")}`);\n const child = execa(lageServerBinPath, lageServerArgs, {\n cwd: root,\n detached: true,\n stdio: \"ignore\",\n });\n\n if (child && child.pid) {\n fs.writeFileSync(lockfilePath, child.pid.toString());\n }\n\n child.unref();\n logger.info(\"Server started\", { pid: child.pid });\n }\n\n await releaseLock();\n\n logger.info(\"Creating a client to connect to the background services\");\n client = await tryCreateClientWithRetries(host, port, logger);\n\n if (!client) {\n throw new Error(\"Server could not be started\");\n }\n }\n\n logger.info(`Executing on server http://${host}:${port}`);\n const response = await executeOnServer(args, client, logger);\n\n if (response) {\n process.stdout.write(response.stdout);\n process.stderr.write(response.stderr);\n process.exitCode = response.exitCode;\n\n if (response.exitCode === 0) {\n await simulateFileAccess(logger, response.inputs, response.outputs);\n }\n } else {\n process.exitCode = 1;\n }\n\n logger.info(\"Task execution finished\");\n}\n"],"names":["executeRemotely","tryCreateClient","host","port","client","createClient","baseUrl","httpVersion","success","ping","pong","e","ConnectError","undefined","tryCreateClientWithRetries","logger","start","Date","now","error","Promise","resolve","setTimeout","executeOnServer","args","task","length","packageName","Error","taskArgs","filterArgsForTasks","response","runTarget","info","exitCode","isAlive","pid","process","kill","ensurePidFile","lockfilePath","fs","existsSync","path","dirname","mkdirSync","recursive","fd","openSync","closeSync","options","command","server","timeout","parseServerOption","createLogger","logLevel","reporter","initializeReporters","root","getWorkspaceRoot","cwd","join","releaseLock","lockfile","lock","stale","retries","factor","minTimeout","maxTimeout","randomize","parseInt","readFileSync","isServerRunning","binPaths","getBinPaths","lageServerBinPath","lageServerArgs","child","execa","detached","stdio","writeFileSync","toString","unref","stdout","write","stderr","simulateFileAccess","inputs","outputs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/exec/executeRemotely.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport createLogger from \"@lage-run/logger\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { LageClient } from \"@lage-run/rpc\";\nimport { ConnectError, createClient } from \"@lage-run/rpc\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport { simulateFileAccess } from \"./simulateFileAccess.js\";\nimport execa from \"execa\";\nimport { getBinPaths } from \"../../getBinPaths.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport lockfile from \"proper-lockfile\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { getWorkspaceRoot } from \"workspace-tools\";\nimport type { Command } from \"commander\";\nimport { launchServerInBackground } from \"../launchServerInBackground.js\";\n\ninterface ExecRemotelyOptions extends ReporterInitOptions {\n cwd?: string;\n server?: string | boolean;\n timeout?: number;\n tasks: string[];\n}\n\nasync function tryCreateClient(host: string, port: number) {\n const client = createClient({\n baseUrl: `http://${host}:${port}`,\n httpVersion: \"2\",\n });\n\n try {\n const success = await client.ping({});\n if (success.pong) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n return undefined;\n }\n\n throw e;\n }\n\n return undefined;\n}\n\nasync function tryCreateClientWithRetries(host: string, port: number, logger: Logger) {\n let client: ReturnType<typeof createClient> | undefined;\n\n const start = Date.now();\n while (Date.now() - start < 5 * 1000) {\n try {\n client = await tryCreateClient(host, port);\n\n if (client) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n logger.error(\"Error connecting to server\", e);\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n return undefined;\n}\n\nasync function executeOnServer(args: string[], client: LageClient, logger: Logger) {\n const task = args.length === 1 ? args[0] : args[1];\n const packageName = args.length > 1 ? args[0] : undefined;\n\n if (!task) {\n throw new Error(\"No task provided\");\n }\n\n const { taskArgs } = filterArgsForTasks(args ?? []);\n\n try {\n const response = await client.runTarget({\n packageName,\n task,\n taskArgs,\n });\n logger.info(`Task ${response.packageName} ${response.task} exited with code ${response.exitCode} `);\n return response;\n } catch (error) {\n if (error instanceof ConnectError) {\n logger.error(\"Error connecting to server\", { error });\n } else {\n logger.error(\"Error running task\", { error });\n }\n }\n}\n\nfunction isAlive(pid: number) {\n try {\n return process.kill(pid, 0);\n } catch {\n return false;\n }\n}\n\nfunction ensurePidFile(lockfilePath: string) {\n if (!fs.existsSync(path.dirname(lockfilePath))) {\n fs.mkdirSync(path.dirname(lockfilePath), { recursive: true });\n }\n\n if (!fs.existsSync(lockfilePath)) {\n try {\n const fd = fs.openSync(lockfilePath, \"w\");\n fs.closeSync(fd);\n } catch {\n // ignore\n }\n }\n}\n\nexport async function executeRemotely(options: ExecRemotelyOptions, command: Command) {\n // launch a 'lage-server.js' process, detached if it is not already running\n // send the command to the server process\n const { server, tasks } = options;\n const timeout = options.timeout ?? 5 * 60;\n\n const { host, port } = parseServerOption(server);\n\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n initializeReporters(logger, options);\n\n const root = getWorkspaceRoot(options.cwd ?? process.cwd())!;\n\n let client = await tryCreateClient(host, port);\n const args = command.args;\n\n logger.info(`Command args ${command.args.join(\" \")}`);\n\n if (!client) {\n await launchServerInBackground({\n host,\n port,\n tasks,\n args,\n timeout,\n logger,\n root,\n });\n\n logger.info(\"Creating a client to connect to the background services\");\n client = await tryCreateClientWithRetries(host, port, logger);\n\n if (!client) {\n throw new Error(\"Server could not be started\");\n }\n }\n\n logger.info(`Executing on server http://${host}:${port}`);\n const response = await executeOnServer(args, client, logger);\n\n if (response) {\n process.stdout.write(response.stdout);\n process.stderr.write(response.stderr);\n process.exitCode = response.exitCode;\n\n if (response.exitCode === 0) {\n await simulateFileAccess(logger, response.inputs, response.outputs);\n }\n } else {\n process.exitCode = 1;\n }\n\n logger.info(\"Task execution finished\");\n}\n"],"names":["executeRemotely","tryCreateClient","host","port","client","createClient","baseUrl","httpVersion","success","ping","pong","e","ConnectError","undefined","tryCreateClientWithRetries","logger","start","Date","now","error","Promise","resolve","setTimeout","executeOnServer","args","task","length","packageName","Error","taskArgs","filterArgsForTasks","response","runTarget","info","exitCode","isAlive","pid","process","kill","ensurePidFile","lockfilePath","fs","existsSync","path","dirname","mkdirSync","recursive","fd","openSync","closeSync","options","command","server","tasks","timeout","parseServerOption","createLogger","logLevel","reporter","initializeReporters","root","getWorkspaceRoot","cwd","join","launchServerInBackground","stdout","write","stderr","simulateFileAccess","inputs","outputs"],"mappings":"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"}
|
|
@@ -20,5 +20,6 @@ function _interop_require_default(obj) {
|
|
|
20
20
|
const execCommand = new _commander.Command("exec");
|
|
21
21
|
execCommand.option("-c|--concurrency <number>", "max jobs to run at a time", (v)=>parseInt(v), _os.default.cpus().length - 1);
|
|
22
22
|
execCommand.option("-s|--server [host:port]", "lage server host");
|
|
23
|
-
execCommand.option("-t|--timeout <seconds>", "lage server autoshutoff timeout", (v)=>parseInt(v),
|
|
23
|
+
execCommand.option("-t|--timeout <seconds>", "lage server autoshutoff timeout", (v)=>parseInt(v), 5 * 60);
|
|
24
|
+
execCommand.option("--tasks [tasks...]", "A list of tasks to run, separated by space e.g. 'build test', used with --server");
|
|
24
25
|
(0, _addLoggerOptions.addLoggerOptions)(execCommand).action(_action.execAction);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/exec/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { execAction } from \"./action.js\";\nimport { addLoggerOptions } from \"../addLoggerOptions.js\";\nimport os from \"os\";\n\nconst execCommand = new Command(\"exec\");\nexecCommand.option(\"-c|--concurrency <number>\", \"max jobs to run at a time\", (v) => parseInt(v), os.cpus().length - 1);\nexecCommand.option(\"-s|--server [host:port]\", \"lage server host\");\nexecCommand.option<number>(\"-t|--timeout <seconds>\", \"lage server autoshutoff timeout\", (v) => parseInt(v),
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/exec/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { execAction } from \"./action.js\";\nimport { addLoggerOptions } from \"../addLoggerOptions.js\";\nimport os from \"os\";\n\nconst execCommand = new Command(\"exec\");\nexecCommand.option(\"-c|--concurrency <number>\", \"max jobs to run at a time\", (v) => parseInt(v), os.cpus().length - 1);\nexecCommand.option(\"-s|--server [host:port]\", \"lage server host\");\nexecCommand.option<number>(\"-t|--timeout <seconds>\", \"lage server autoshutoff timeout\", (v) => parseInt(v), 5 * 60);\nexecCommand.option(\"--tasks [tasks...]\", \"A list of tasks to run, separated by space e.g. 'build test', used with --server\");\naddLoggerOptions(execCommand).action(execAction);\nexport { execCommand };\n"],"names":["execCommand","Command","option","v","parseInt","os","cpus","length","addLoggerOptions","action","execAction"],"mappings":";;;;+BAWSA;;;eAAAA;;;2BAXe;wBACG;kCACM;2DAClB;;;;;;AAEf,MAAMA,cAAc,IAAIC,kBAAO,CAAC;AAChCD,YAAYE,MAAM,CAAC,6BAA6B,6BAA6B,CAACC,IAAMC,SAASD,IAAIE,WAAE,CAACC,IAAI,GAAGC,MAAM,GAAG;AACpHP,YAAYE,MAAM,CAAC,2BAA2B;AAC9CF,YAAYE,MAAM,CAAS,0BAA0B,mCAAmC,CAACC,IAAMC,SAASD,IAAI,IAAI;AAChHH,YAAYE,MAAM,CAAC,sBAAsB;AACzCM,IAAAA,kCAAgB,EAACR,aAAaS,MAAM,CAACC,kBAAU"}
|
|
@@ -14,7 +14,6 @@ const _config = require("@lage-run/config");
|
|
|
14
14
|
const _workspacetools = require("workspace-tools");
|
|
15
15
|
const _getFilteredPackages = require("../../filter/getFilteredPackages.js");
|
|
16
16
|
const _logger = /*#__PURE__*/ _interop_require_default(require("@lage-run/logger"));
|
|
17
|
-
const _targetgraph = require("@lage-run/target-graph");
|
|
18
17
|
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
19
18
|
const _shellquote = require("shell-quote");
|
|
20
19
|
const _initializeReporters = require("../initializeReporters.js");
|
|
@@ -22,6 +21,7 @@ const _runners = require("@lage-run/runners");
|
|
|
22
21
|
const _getBinPaths = require("../../getBinPaths.js");
|
|
23
22
|
const _runnerPickerOptions = require("../../runnerPickerOptions.js");
|
|
24
23
|
const _parseServerOption = require("../parseServerOption.js");
|
|
24
|
+
const _optimizeTargetGraph = require("../../optimizeTargetGraph.js");
|
|
25
25
|
function _interop_require_default(obj) {
|
|
26
26
|
return obj && obj.__esModule ? obj : {
|
|
27
27
|
default: obj
|
|
@@ -65,32 +65,17 @@ async function infoAction(options, command) {
|
|
|
65
65
|
});
|
|
66
66
|
const pickerOptions = (0, _runnerPickerOptions.runnerPickerOptions)(options.nodeArg, config.npmClient, taskArgs);
|
|
67
67
|
const runnerPicker = new _runners.TargetRunnerPicker(pickerOptions);
|
|
68
|
-
const optimizedTargets = await optimizeTargetGraph(targetGraph, runnerPicker);
|
|
68
|
+
const optimizedTargets = await (0, _optimizeTargetGraph.optimizeTargetGraph)(targetGraph, runnerPicker);
|
|
69
69
|
const binPaths = (0, _getBinPaths.getBinPaths)();
|
|
70
|
-
const packageTasks = optimizedTargets.map((target)=>generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos));
|
|
70
|
+
const packageTasks = optimizedTargets.map((target)=>generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos, tasks));
|
|
71
71
|
logger.info("info", {
|
|
72
72
|
command: command.args,
|
|
73
73
|
scope,
|
|
74
74
|
packageTasks
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
...graph.targets.values()
|
|
80
|
-
], async (target)=>{
|
|
81
|
-
if (target.type === "noop") {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
const runner = await runnerPicker.pick(target);
|
|
85
|
-
if (!await runner.shouldRun(target)) {
|
|
86
|
-
return true;
|
|
87
|
-
}
|
|
88
|
-
return false;
|
|
89
|
-
});
|
|
90
|
-
return (0, _targetgraph.transitiveReduction)(targetMinimizedNodes);
|
|
91
|
-
}
|
|
92
|
-
function generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos) {
|
|
93
|
-
const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos);
|
|
77
|
+
function generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos, tasks) {
|
|
78
|
+
const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos, tasks);
|
|
94
79
|
const workingDirectory = getWorkingDirectory(target);
|
|
95
80
|
const packageTask = {
|
|
96
81
|
id: target.id,
|
|
@@ -102,7 +87,7 @@ function generatePackageTask(target, taskArgs, config, options, binPaths, packag
|
|
|
102
87
|
};
|
|
103
88
|
return packageTask;
|
|
104
89
|
}
|
|
105
|
-
function generateCommand(target, taskArgs, config, options, binPaths, packageInfos) {
|
|
90
|
+
function generateCommand(target, taskArgs, config, options, binPaths, packageInfos, tasks) {
|
|
106
91
|
const shouldRunWorkersAsService = typeof process.env.LAGE_WORKER_SERVER === "string" && process.env.LAGE_WORKER_SERVER !== "false" || !!options.server;
|
|
107
92
|
if (target.type === "npmScript") {
|
|
108
93
|
const script = target.packageName !== undefined ? packageInfos[target.packageName]?.scripts?.[target.task] : undefined;
|
|
@@ -128,6 +113,8 @@ function generateCommand(target, taskArgs, config, options, binPaths, packageInf
|
|
|
128
113
|
const command = [
|
|
129
114
|
binPaths["lage"],
|
|
130
115
|
"exec",
|
|
116
|
+
"--tasks",
|
|
117
|
+
...tasks,
|
|
131
118
|
"--server",
|
|
132
119
|
`${host}:${port}`
|
|
133
120
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/info/action.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport type { ConfigOptions } from \"@lage-run/config\";\nimport { getConfig } from \"@lage-run/config\";\nimport { type PackageInfos, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport createLogger from \"@lage-run/logger\";\nimport { removeNodes, transitiveReduction } from \"@lage-run/target-graph\";\nimport path from \"path\";\nimport { parse } from \"shell-quote\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { TargetGraph, Target } from \"@lage-run/target-graph\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { TargetRunnerPicker } from \"@lage-run/runners\";\nimport { getBinPaths } from \"../../getBinPaths.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\n\ninterface InfoActionOptions extends ReporterInitOptions {\n dependencies: boolean;\n dependents: boolean;\n since: string;\n scope: string[];\n to: string[];\n cache: boolean;\n nodeArg: string;\n ignore: string[];\n server: string;\n}\n\ninterface PackageTask {\n id: string;\n command: string[];\n dependencies: string[];\n workingDirectory: string;\n package: string;\n task: string;\n}\n\n/**\n * The info command displays information about a target graph in a workspace.\n * The generated output can be read and used by other task runners, such as BuildXL.\n *\n * Expected format:\n * [\n * {\n * \"id\": \"bar##build\",\n * \"package\": \"bar\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/bar\",\n * \"dependencies\": []\n * },\n * {\n * \"id\": \"foo##build\",\n * \"package\": \"foo\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"bar##build\"\n * ]\n * },\n * {\n * \"id\": \"foo##test\",\n * \"package\": \"foo\",\n * \"task\": \"test\",\n * \"command\": \"npm run test --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"foo##build\"\n * ]\n * },\n * ...\n * ]\n */\nexport async function infoAction(options: InfoActionOptions, command: Command) {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n options.server = typeof options.server === \"boolean\" && options.server ? \"localhost:5332\" : options.server;\n initializeReporters(logger, options);\n const root = getWorkspaceRoot(cwd)!;\n\n const packageInfos = getPackageInfos(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n });\n\n const scope = getFilteredPackages({\n root,\n packageInfos,\n logger,\n includeDependencies: options.dependencies,\n includeDependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n since: options.since,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n repoWideChanges: config.repoWideChanges,\n sinceIgnoreGlobs: options.ignore.concat(config.ignore),\n });\n\n const pickerOptions = runnerPickerOptions(options.nodeArg, config.npmClient, taskArgs);\n\n const runnerPicker = new TargetRunnerPicker(pickerOptions);\n\n const optimizedTargets = await optimizeTargetGraph(targetGraph, runnerPicker);\n const binPaths = getBinPaths();\n const packageTasks = optimizedTargets.map((target) => generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos));\n\n logger.info(\"info\", {\n command: command.args,\n scope,\n packageTasks,\n });\n}\n\nasync function optimizeTargetGraph(graph: TargetGraph, runnerPicker: TargetRunnerPicker) {\n const targetMinimizedNodes = await removeNodes([...graph.targets.values()], async (target) => {\n if (target.type === \"noop\") {\n return true;\n }\n\n const runner = await runnerPicker.pick(target);\n if (!(await runner.shouldRun(target))) {\n return true;\n }\n\n return false;\n });\n\n return transitiveReduction(targetMinimizedNodes);\n}\n\nfunction generatePackageTask(\n target: Target,\n taskArgs: string[],\n config: ConfigOptions,\n options: InfoActionOptions,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos\n): PackageTask {\n const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos);\n const workingDirectory = getWorkingDirectory(target);\n\n const packageTask: PackageTask = {\n id: target.id,\n command,\n dependencies: target.dependencies,\n workingDirectory,\n package: target.packageName ?? \"\",\n task: target.task,\n };\n\n return packageTask;\n}\n\nfunction generateCommand(\n target: Target,\n taskArgs: string[],\n config: ConfigOptions,\n options: InfoActionOptions,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos\n) {\n const shouldRunWorkersAsService =\n (typeof process.env.LAGE_WORKER_SERVER === \"string\" && process.env.LAGE_WORKER_SERVER !== \"false\") || !!options.server;\n\n if (target.type === \"npmScript\") {\n const script = target.packageName !== undefined ? packageInfos[target.packageName]?.scripts?.[target.task] : undefined;\n\n // If the script is a node script, and that it does not have any shell operators (&&, ||, etc)\n // then we can simply pass this along to info command rather than using npm client to run it.\n if (script && script.startsWith(\"node\")) {\n const parsed = parse(script);\n if (parsed.length > 0 && parsed.every((entry) => typeof entry === \"string\")) {\n return [...(parsed as string[]), ...taskArgs];\n }\n }\n\n const npmClient = config.npmClient ?? \"npm\";\n const command = [npmClient, ...getNpmArgs(target.task, taskArgs)];\n return command;\n } else if (target.type === \"worker\" && shouldRunWorkersAsService) {\n const { host, port } = parseServerOption(options.server);\n const command = [binPaths[\"lage\"], \"exec\", \"--server\", `${host}:${port}`];\n if (options.concurrency) {\n command.push(\"--concurrency\", options.concurrency.toString());\n }\n\n if (target.packageName) {\n command.push(target.packageName);\n }\n\n if (target.task) {\n command.push(target.task);\n }\n\n command.push(...taskArgs);\n return command;\n } else if (target.type === \"worker\") {\n const command = [binPaths.lage, \"exec\"];\n command.push(target.packageName ?? \"\");\n command.push(target.task);\n command.push(...taskArgs);\n return command;\n }\n\n return [];\n}\n\nfunction getWorkingDirectory(target) {\n const cwd = process.cwd();\n const workingDirectory = path.relative(getWorkspaceRoot(cwd) ?? \"\", target.cwd).replace(/\\\\/g, \"/\");\n return workingDirectory;\n}\n\nfunction getNpmArgs(task: string, taskTargs: string[]) {\n const extraArgs = taskTargs != undefined && taskTargs.length > 0 ? [\"--\", ...taskTargs] : [];\n return [\"run\", task, ...extraArgs];\n}\n"],"names":["infoAction","options","command","cwd","process","config","getConfig","logger","createLogger","logLevel","reporter","server","initializeReporters","root","getWorkspaceRoot","packageInfos","getPackageInfos","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","pickerOptions","runnerPickerOptions","nodeArg","npmClient","runnerPicker","TargetRunnerPicker","optimizedTargets","optimizeTargetGraph","binPaths","getBinPaths","packageTasks","map","target","generatePackageTask","info","graph","targetMinimizedNodes","removeNodes","targets","values","type","runner","pick","shouldRun","transitiveReduction","generateCommand","workingDirectory","getWorkingDirectory","packageTask","id","package","packageName","task","shouldRunWorkersAsService","env","LAGE_WORKER_SERVER","script","undefined","scripts","startsWith","parsed","parse","length","every","entry","getNpmArgs","host","port","parseServerOption","concurrency","push","toString","lage","path","relative","replace","taskTargs","extraArgs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/info/action.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport type { ConfigOptions } from \"@lage-run/config\";\nimport { getConfig } from \"@lage-run/config\";\nimport { type PackageInfos, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport createLogger from \"@lage-run/logger\";\nimport path from \"path\";\nimport { parse } from \"shell-quote\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { TargetRunnerPicker } from \"@lage-run/runners\";\nimport { getBinPaths } from \"../../getBinPaths.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport { optimizeTargetGraph } from \"../../optimizeTargetGraph.js\";\n\ninterface InfoActionOptions extends ReporterInitOptions {\n dependencies: boolean;\n dependents: boolean;\n since: string;\n scope: string[];\n to: string[];\n cache: boolean;\n nodeArg: string;\n ignore: string[];\n server: string;\n}\n\ninterface PackageTask {\n id: string;\n command: string[];\n dependencies: string[];\n workingDirectory: string;\n package: string;\n task: string;\n}\n\n/**\n * The info command displays information about a target graph in a workspace.\n * The generated output can be read and used by other task runners, such as BuildXL.\n *\n * Expected format:\n * [\n * {\n * \"id\": \"bar##build\",\n * \"package\": \"bar\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/bar\",\n * \"dependencies\": []\n * },\n * {\n * \"id\": \"foo##build\",\n * \"package\": \"foo\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"bar##build\"\n * ]\n * },\n * {\n * \"id\": \"foo##test\",\n * \"package\": \"foo\",\n * \"task\": \"test\",\n * \"command\": \"npm run test --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"foo##build\"\n * ]\n * },\n * ...\n * ]\n */\nexport async function infoAction(options: InfoActionOptions, command: Command) {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n options.server = typeof options.server === \"boolean\" && options.server ? \"localhost:5332\" : options.server;\n initializeReporters(logger, options);\n const root = getWorkspaceRoot(cwd)!;\n\n const packageInfos = getPackageInfos(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n });\n\n const scope = getFilteredPackages({\n root,\n packageInfos,\n logger,\n includeDependencies: options.dependencies,\n includeDependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n since: options.since,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n repoWideChanges: config.repoWideChanges,\n sinceIgnoreGlobs: options.ignore.concat(config.ignore),\n });\n\n const pickerOptions = runnerPickerOptions(options.nodeArg, config.npmClient, taskArgs);\n\n const runnerPicker = new TargetRunnerPicker(pickerOptions);\n\n const optimizedTargets = await optimizeTargetGraph(targetGraph, runnerPicker);\n const binPaths = getBinPaths();\n const packageTasks = optimizedTargets.map((target) =>\n generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos, tasks)\n );\n\n logger.info(\"info\", {\n command: command.args,\n scope,\n packageTasks,\n });\n}\n\nfunction generatePackageTask(\n target: Target,\n taskArgs: string[],\n config: ConfigOptions,\n options: InfoActionOptions,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos,\n tasks: string[]\n): PackageTask {\n const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos, tasks);\n const workingDirectory = getWorkingDirectory(target);\n\n const packageTask: PackageTask = {\n id: target.id,\n command,\n dependencies: target.dependencies,\n workingDirectory,\n package: target.packageName ?? \"\",\n task: target.task,\n };\n\n return packageTask;\n}\n\nfunction generateCommand(\n target: Target,\n taskArgs: string[],\n config: ConfigOptions,\n options: InfoActionOptions,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos,\n tasks: string[]\n) {\n const shouldRunWorkersAsService =\n (typeof process.env.LAGE_WORKER_SERVER === \"string\" && process.env.LAGE_WORKER_SERVER !== \"false\") || !!options.server;\n\n if (target.type === \"npmScript\") {\n const script = target.packageName !== undefined ? packageInfos[target.packageName]?.scripts?.[target.task] : undefined;\n\n // If the script is a node script, and that it does not have any shell operators (&&, ||, etc)\n // then we can simply pass this along to info command rather than using npm client to run it.\n if (script && script.startsWith(\"node\")) {\n const parsed = parse(script);\n if (parsed.length > 0 && parsed.every((entry) => typeof entry === \"string\")) {\n return [...(parsed as string[]), ...taskArgs];\n }\n }\n\n const npmClient = config.npmClient ?? \"npm\";\n const command = [npmClient, ...getNpmArgs(target.task, taskArgs)];\n return command;\n } else if (target.type === \"worker\" && shouldRunWorkersAsService) {\n const { host, port } = parseServerOption(options.server);\n const command = [binPaths[\"lage\"], \"exec\", \"--tasks\", ...tasks, \"--server\", `${host}:${port}`];\n if (options.concurrency) {\n command.push(\"--concurrency\", options.concurrency.toString());\n }\n\n if (target.packageName) {\n command.push(target.packageName);\n }\n\n if (target.task) {\n command.push(target.task);\n }\n\n command.push(...taskArgs);\n return command;\n } else if (target.type === \"worker\") {\n const command = [binPaths.lage, \"exec\"];\n command.push(target.packageName ?? \"\");\n command.push(target.task);\n command.push(...taskArgs);\n return command;\n }\n\n return [];\n}\n\nfunction getWorkingDirectory(target) {\n const cwd = process.cwd();\n const workingDirectory = path.relative(getWorkspaceRoot(cwd) ?? \"\", target.cwd).replace(/\\\\/g, \"/\");\n return workingDirectory;\n}\n\nfunction getNpmArgs(task: string, taskTargs: string[]) {\n const extraArgs = taskTargs != undefined && taskTargs.length > 0 ? [\"--\", ...taskTargs] : [];\n return [\"run\", task, ...extraArgs];\n}\n"],"names":["infoAction","options","command","cwd","process","config","getConfig","logger","createLogger","logLevel","reporter","server","initializeReporters","root","getWorkspaceRoot","packageInfos","getPackageInfos","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","pickerOptions","runnerPickerOptions","nodeArg","npmClient","runnerPicker","TargetRunnerPicker","optimizedTargets","optimizeTargetGraph","binPaths","getBinPaths","packageTasks","map","target","generatePackageTask","info","generateCommand","workingDirectory","getWorkingDirectory","packageTask","id","package","packageName","task","shouldRunWorkersAsService","env","LAGE_WORKER_SERVER","type","script","undefined","scripts","startsWith","parsed","parse","length","every","entry","getNpmArgs","host","port","parseServerOption","concurrency","push","toString","lage","path","relative","replace","taskTargs","extraArgs"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Logger } from "@lage-run/logger";
|
|
2
|
+
export interface launchServerInBackgroundOptions {
|
|
3
|
+
logger: Logger;
|
|
4
|
+
root: string;
|
|
5
|
+
host: string;
|
|
6
|
+
port: number;
|
|
7
|
+
tasks: string[];
|
|
8
|
+
timeout: number;
|
|
9
|
+
args: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function launchServerInBackground({ logger, root, host, port, tasks, timeout, args }: launchServerInBackgroundOptions): Promise<void>;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "launchServerInBackground", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return launchServerInBackground;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
12
|
+
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
13
|
+
const _properlockfile = /*#__PURE__*/ _interop_require_default(require("proper-lockfile"));
|
|
14
|
+
const _execa = /*#__PURE__*/ _interop_require_default(require("execa"));
|
|
15
|
+
const _getBinPaths = require("../getBinPaths.js");
|
|
16
|
+
function _interop_require_default(obj) {
|
|
17
|
+
return obj && obj.__esModule ? obj : {
|
|
18
|
+
default: obj
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async function launchServerInBackground({ logger, root, host, port, tasks, timeout, args }) {
|
|
22
|
+
const lockfilePath = _path.default.join(root, `node_modules/.cache/lage/.lage-server-${host}-${port}.pid`);
|
|
23
|
+
logger.info(`Starting server on http://${host}:${port}`);
|
|
24
|
+
logger.info(`acquiring lock: ${lockfilePath}`);
|
|
25
|
+
ensurePidFile(lockfilePath);
|
|
26
|
+
const releaseLock = await _properlockfile.default.lock(lockfilePath, {
|
|
27
|
+
stale: 1000 * 60 * 1,
|
|
28
|
+
retries: {
|
|
29
|
+
retries: 10,
|
|
30
|
+
factor: 3,
|
|
31
|
+
minTimeout: 0.5 * 1000,
|
|
32
|
+
maxTimeout: 60 * 1000,
|
|
33
|
+
randomize: true
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const pid = parseInt(_fs.default.readFileSync(lockfilePath, "utf-8"));
|
|
37
|
+
const isServerRunning = pid && isAlive(pid);
|
|
38
|
+
logger.info("Checking if server is already running", {
|
|
39
|
+
pid,
|
|
40
|
+
isServerRunning
|
|
41
|
+
});
|
|
42
|
+
if (pid && isServerRunning) {
|
|
43
|
+
logger.info("Server already running", {
|
|
44
|
+
pid
|
|
45
|
+
});
|
|
46
|
+
} else {
|
|
47
|
+
const binPaths = (0, _getBinPaths.getBinPaths)();
|
|
48
|
+
const lageServerBinPath = binPaths["lage-server"];
|
|
49
|
+
const lageServerArgs = [
|
|
50
|
+
"--tasks",
|
|
51
|
+
...tasks,
|
|
52
|
+
"--host",
|
|
53
|
+
host,
|
|
54
|
+
"--port",
|
|
55
|
+
`${port}`,
|
|
56
|
+
"--timeout",
|
|
57
|
+
`${timeout}`,
|
|
58
|
+
...args
|
|
59
|
+
];
|
|
60
|
+
logger.info(`Launching lage-server with these parameters: ${lageServerArgs.join(" ")}`);
|
|
61
|
+
const child = (0, _execa.default)(lageServerBinPath, lageServerArgs, {
|
|
62
|
+
cwd: root,
|
|
63
|
+
detached: true,
|
|
64
|
+
stdio: "ignore",
|
|
65
|
+
maxBuffer: 1024 * 1024 * 100
|
|
66
|
+
});
|
|
67
|
+
if (child && child.pid) {
|
|
68
|
+
_fs.default.writeFileSync(lockfilePath, child.pid.toString());
|
|
69
|
+
}
|
|
70
|
+
child.unref();
|
|
71
|
+
logger.info("Server started", {
|
|
72
|
+
pid: child.pid
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
await releaseLock();
|
|
76
|
+
}
|
|
77
|
+
function ensurePidFile(lockfilePath) {
|
|
78
|
+
if (!_fs.default.existsSync(_path.default.dirname(lockfilePath))) {
|
|
79
|
+
_fs.default.mkdirSync(_path.default.dirname(lockfilePath), {
|
|
80
|
+
recursive: true
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (!_fs.default.existsSync(lockfilePath)) {
|
|
84
|
+
try {
|
|
85
|
+
const fd = _fs.default.openSync(lockfilePath, "w");
|
|
86
|
+
_fs.default.closeSync(fd);
|
|
87
|
+
} catch {
|
|
88
|
+
// ignore
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function isAlive(pid) {
|
|
93
|
+
try {
|
|
94
|
+
return process.kill(pid, 0);
|
|
95
|
+
} catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/commands/launchServerInBackground.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport lockfile from \"proper-lockfile\";\nimport execa from \"execa\";\nimport { getBinPaths } from \"../getBinPaths.js\";\n\nexport interface launchServerInBackgroundOptions {\n logger: Logger;\n root: string;\n host: string;\n port: number;\n tasks: string[];\n timeout: number;\n args: string[];\n}\n\nexport async function launchServerInBackground({ logger, root, host, port, tasks, timeout, args }: launchServerInBackgroundOptions) {\n const lockfilePath = path.join(root, `node_modules/.cache/lage/.lage-server-${host}-${port}.pid`);\n\n logger.info(`Starting server on http://${host}:${port}`);\n logger.info(`acquiring lock: ${lockfilePath}`);\n\n ensurePidFile(lockfilePath);\n\n const releaseLock = await lockfile.lock(lockfilePath, {\n stale: 1000 * 60 * 1,\n retries: {\n retries: 10,\n factor: 3,\n minTimeout: 0.5 * 1000,\n maxTimeout: 60 * 1000,\n randomize: true,\n },\n });\n\n const pid = parseInt(fs.readFileSync(lockfilePath, \"utf-8\"));\n const isServerRunning = pid && isAlive(pid);\n logger.info(\"Checking if server is already running\", { pid, isServerRunning });\n if (pid && isServerRunning) {\n logger.info(\"Server already running\", { pid });\n } else {\n const binPaths = getBinPaths();\n const lageServerBinPath = binPaths[\"lage-server\"];\n const lageServerArgs = [\"--tasks\", ...tasks, \"--host\", host, \"--port\", `${port}`, \"--timeout\", `${timeout}`, ...args];\n\n logger.info(`Launching lage-server with these parameters: ${lageServerArgs.join(\" \")}`);\n const child = execa(lageServerBinPath, lageServerArgs, {\n cwd: root,\n detached: true,\n stdio: \"ignore\",\n maxBuffer: 1024 * 1024 * 100,\n });\n\n if (child && child.pid) {\n fs.writeFileSync(lockfilePath, child.pid.toString());\n }\n\n child.unref();\n logger.info(\"Server started\", { pid: child.pid });\n }\n\n await releaseLock();\n}\n\nfunction ensurePidFile(lockfilePath: string) {\n if (!fs.existsSync(path.dirname(lockfilePath))) {\n fs.mkdirSync(path.dirname(lockfilePath), { recursive: true });\n }\n\n if (!fs.existsSync(lockfilePath)) {\n try {\n const fd = fs.openSync(lockfilePath, \"w\");\n fs.closeSync(fd);\n } catch {\n // ignore\n }\n }\n}\n\nfunction isAlive(pid: number) {\n try {\n return process.kill(pid, 0);\n } catch {\n return false;\n }\n}\n"],"names":["launchServerInBackground","logger","root","host","port","tasks","timeout","args","lockfilePath","path","join","info","ensurePidFile","releaseLock","lockfile","lock","stale","retries","factor","minTimeout","maxTimeout","randomize","pid","parseInt","fs","readFileSync","isServerRunning","isAlive","binPaths","getBinPaths","lageServerBinPath","lageServerArgs","child","execa","cwd","detached","stdio","maxBuffer","writeFileSync","toString","unref","existsSync","dirname","mkdirSync","recursive","fd","openSync","closeSync","process","kill"],"mappings":";;;;+BAiBsBA;;;eAAAA;;;2DAhBP;6DACE;uEACI;8DACH;6BACU;;;;;;AAYrB,eAAeA,yBAAyB,EAAEC,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,IAAI,EAAEC,KAAK,EAAEC,OAAO,EAAEC,IAAI,EAAmC;IAChI,MAAMC,eAAeC,aAAI,CAACC,IAAI,CAACR,MAAM,CAAC,sCAAsC,EAAEC,KAAK,CAAC,EAAEC,KAAK,IAAI,CAAC;IAEhGH,OAAOU,IAAI,CAAC,CAAC,0BAA0B,EAAER,KAAK,CAAC,EAAEC,MAAM;IACvDH,OAAOU,IAAI,CAAC,CAAC,gBAAgB,EAAEH,cAAc;IAE7CI,cAAcJ;IAEd,MAAMK,cAAc,MAAMC,uBAAQ,CAACC,IAAI,CAACP,cAAc;QACpDQ,OAAO,OAAO,KAAK;QACnBC,SAAS;YACPA,SAAS;YACTC,QAAQ;YACRC,YAAY,MAAM;YAClBC,YAAY,KAAK;YACjBC,WAAW;QACb;IACF;IAEA,MAAMC,MAAMC,SAASC,WAAE,CAACC,YAAY,CAACjB,cAAc;IACnD,MAAMkB,kBAAkBJ,OAAOK,QAAQL;IACvCrB,OAAOU,IAAI,CAAC,yCAAyC;QAAEW;QAAKI;IAAgB;IAC5E,IAAIJ,OAAOI,iBAAiB;QAC1BzB,OAAOU,IAAI,CAAC,0BAA0B;YAAEW;QAAI;IAC9C,OAAO;QACL,MAAMM,WAAWC,IAAAA,wBAAW;QAC5B,MAAMC,oBAAoBF,QAAQ,CAAC,cAAc;QACjD,MAAMG,iBAAiB;YAAC;eAAc1B;YAAO;YAAUF;YAAM;YAAU,GAAGC,MAAM;YAAE;YAAa,GAAGE,SAAS;eAAKC;SAAK;QAErHN,OAAOU,IAAI,CAAC,CAAC,6CAA6C,EAAEoB,eAAerB,IAAI,CAAC,MAAM;QACtF,MAAMsB,QAAQC,IAAAA,cAAK,EAACH,mBAAmBC,gBAAgB;YACrDG,KAAKhC;YACLiC,UAAU;YACVC,OAAO;YACPC,WAAW,OAAO,OAAO;QAC3B;QAEA,IAAIL,SAASA,MAAMV,GAAG,EAAE;YACtBE,WAAE,CAACc,aAAa,CAAC9B,cAAcwB,MAAMV,GAAG,CAACiB,QAAQ;QACnD;QAEAP,MAAMQ,KAAK;QACXvC,OAAOU,IAAI,CAAC,kBAAkB;YAAEW,KAAKU,MAAMV,GAAG;QAAC;IACjD;IAEA,MAAMT;AACR;AAEA,SAASD,cAAcJ,YAAoB;IACzC,IAAI,CAACgB,WAAE,CAACiB,UAAU,CAAChC,aAAI,CAACiC,OAAO,CAAClC,gBAAgB;QAC9CgB,WAAE,CAACmB,SAAS,CAAClC,aAAI,CAACiC,OAAO,CAAClC,eAAe;YAAEoC,WAAW;QAAK;IAC7D;IAEA,IAAI,CAACpB,WAAE,CAACiB,UAAU,CAACjC,eAAe;QAChC,IAAI;YACF,MAAMqC,KAAKrB,WAAE,CAACsB,QAAQ,CAACtC,cAAc;YACrCgB,WAAE,CAACuB,SAAS,CAACF;QACf,EAAE,OAAM;QACN,SAAS;QACX;IACF;AACF;AAEA,SAASlB,QAAQL,GAAW;IAC1B,IAAI;QACF,OAAO0B,QAAQC,IAAI,CAAC3B,KAAK;IAC3B,EAAE,OAAM;QACN,OAAO;IACT;AACF"}
|