@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.
Files changed (36) hide show
  1. package/CHANGELOG.json +91 -1
  2. package/CHANGELOG.md +28 -2
  3. package/lib/commands/exec/action.d.ts +1 -0
  4. package/lib/commands/exec/action.js +3 -0
  5. package/lib/commands/exec/action.js.map +1 -1
  6. package/lib/commands/exec/executeRemotely.d.ts +3 -1
  7. package/lib/commands/exec/executeRemotely.js +12 -55
  8. package/lib/commands/exec/executeRemotely.js.map +1 -1
  9. package/lib/commands/exec/index.js +2 -1
  10. package/lib/commands/exec/index.js.map +1 -1
  11. package/lib/commands/info/action.js +8 -21
  12. package/lib/commands/info/action.js.map +1 -1
  13. package/lib/commands/launchServerInBackground.d.ts +11 -0
  14. package/lib/commands/launchServerInBackground.js +98 -0
  15. package/lib/commands/launchServerInBackground.js.map +1 -0
  16. package/lib/commands/run/createTargetGraph.js +26 -2
  17. package/lib/commands/run/createTargetGraph.js.map +1 -1
  18. package/lib/commands/run/runAction.js +9 -1
  19. package/lib/commands/run/runAction.js.map +1 -1
  20. package/lib/commands/server/action.d.ts +1 -0
  21. package/lib/commands/server/action.js +3 -2
  22. package/lib/commands/server/action.js.map +1 -1
  23. package/lib/commands/server/index.js +3 -8
  24. package/lib/commands/server/index.js.map +1 -1
  25. package/lib/commands/server/lageService.d.ts +5 -3
  26. package/lib/commands/server/lageService.js +49 -30
  27. package/lib/commands/server/lageService.js.map +1 -1
  28. package/lib/filter/getFilteredPackages.js +2 -65
  29. package/lib/filter/getFilteredPackages.js.map +1 -1
  30. package/lib/filter/hasRepoChanged.d.ts +2 -0
  31. package/lib/filter/hasRepoChanged.js +75 -0
  32. package/lib/filter/hasRepoChanged.js.map +1 -0
  33. package/lib/optimizeTargetGraph.d.ts +3 -0
  34. package/lib/optimizeTargetGraph.js +49 -0
  35. package/lib/optimizeTargetGraph.js.map +1 -0
  36. 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, 20 Nov 2024 08:12:07 GMT",
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, 20 Nov 2024 08:12:07 GMT and should not be manually modified. -->
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:07 GMT
35
+ Wed, 20 Nov 2024 08:12:37 GMT
10
36
 
11
37
  ### Patches
12
38
 
@@ -5,6 +5,7 @@ interface ExecOptions extends ReporterInitOptions {
5
5
  server?: boolean | string;
6
6
  timeout?: number;
7
7
  nodeArg?: string;
8
+ tasks?: string[];
8
9
  }
9
10
  export declare function execAction(options: ExecOptions, command: Command): Promise<void>;
10
11
  export {};
@@ -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":";;;;+BAcsBA;;;eAAAA;;;+DAbG;qCAEW;kCACH;iCACD;;;;;;AASzB,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;QACZ,MAAMC,IAAAA,gCAAe,EAACX,SAASC;IACjC,OAAO;QACL,MAAMW,IAAAA,kCAAgB,EAAC;YAAEV;YAAQW,MAAMZ,QAAQY,IAAI;YAAET,KAAKJ,QAAQI,GAAG;YAAEU,SAASd,QAAQc,OAAO;QAAC;IAClG;AACF"}
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: any): Promise<void>;
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 ?? 120;
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
- logger.info(`Starting server on http://${host}:${port}`);
129
- logger.info(`acquiring lock: ${lockfilePath}`);
130
- ensurePidFile(lockfilePath);
131
- const releaseLock = await _properlockfile.default.lock(lockfilePath, {
132
- stale: 1000 * 60 * 1,
133
- retries: {
134
- retries: 10,
135
- factor: 3,
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), 3 * 60);
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), 3 * 60);\n\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;AAEhHK,IAAAA,kCAAgB,EAACR,aAAaS,MAAM,CAACC,kBAAU"}
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
- async function optimizeTargetGraph(graph, runnerPicker) {
78
- const targetMinimizedNodes = await (0, _targetgraph.removeNodes)([
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"}