@lage-run/cli 0.24.4 → 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 CHANGED
@@ -2,7 +2,34 @@
2
2
  "name": "@lage-run/cli",
3
3
  "entries": [
4
4
  {
5
- "date": "Mon, 02 Dec 2024 17:22:51 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",
6
33
  "version": "0.24.4",
7
34
  "tag": "@lage-run/cli_v0.24.4",
8
35
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,22 @@
1
1
  # Change Log - @lage-run/cli
2
2
 
3
- <!-- This log was last generated on Mon, 02 Dec 2024 17:22:51 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
+
7
17
  ## 0.24.4
8
18
 
9
- Mon, 02 Dec 2024 17:22:51 GMT
19
+ Mon, 02 Dec 2024 17:23:22 GMT
10
20
 
11
21
  ### Patches
12
22
 
@@ -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"}
@@ -67,15 +67,15 @@ async function infoAction(options, command) {
67
67
  const runnerPicker = new _runners.TargetRunnerPicker(pickerOptions);
68
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
- function generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos) {
78
- 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);
79
79
  const workingDirectory = getWorkingDirectory(target);
80
80
  const packageTask = {
81
81
  id: target.id,
@@ -87,7 +87,7 @@ function generatePackageTask(target, taskArgs, config, options, binPaths, packag
87
87
  };
88
88
  return packageTask;
89
89
  }
90
- function generateCommand(target, taskArgs, config, options, binPaths, packageInfos) {
90
+ function generateCommand(target, taskArgs, config, options, binPaths, packageInfos, tasks) {
91
91
  const shouldRunWorkersAsService = typeof process.env.LAGE_WORKER_SERVER === "string" && process.env.LAGE_WORKER_SERVER !== "false" || !!options.server;
92
92
  if (target.type === "npmScript") {
93
93
  const script = target.packageName !== undefined ? packageInfos[target.packageName]?.scripts?.[target.task] : undefined;
@@ -113,6 +113,8 @@ function generateCommand(target, taskArgs, config, options, binPaths, packageInf
113
113
  const command = [
114
114
  binPaths["lage"],
115
115
  "exec",
116
+ "--tasks",
117
+ ...tasks,
116
118
  "--server",
117
119
  `${host}:${port}`
118
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 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) => generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos));\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): 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","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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"}
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"}
@@ -5,6 +5,7 @@ interface WorkerOptions extends ReporterInitOptions {
5
5
  host?: string;
6
6
  timeout?: number;
7
7
  shutdown: boolean;
8
+ tasks: string[];
8
9
  }
9
10
  export declare function serverAction(options: WorkerOptions): Promise<void>;
10
11
  export {};
@@ -18,7 +18,7 @@ function _interop_require_default(obj) {
18
18
  };
19
19
  }
20
20
  async function serverAction(options) {
21
- const { port = 5332, host = "localhost", timeout = 1 } = options;
21
+ const { port = 5332, host = "localhost", timeout = 1, tasks } = options;
22
22
  const logger = (0, _logger.default)();
23
23
  options.logLevel = options.logLevel ?? "info";
24
24
  options.logFile = options.logFile ?? "node_modules/.cache/lage/server.log";
@@ -34,7 +34,8 @@ async function serverAction(options) {
34
34
  clearCountdown: clearTimer
35
35
  },
36
36
  logger,
37
- maxWorkers: options.concurrency
37
+ concurrency: options.concurrency,
38
+ tasks
38
39
  });
39
40
  const server = await (0, _rpc.createServer)(lageService, abortController);
40
41
  await server.listen({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/server/action.ts"],"sourcesContent":["import createLogger, { type Logger } from \"@lage-run/logger\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { createLageService } from \"./lageService.js\";\nimport { createServer } from \"@lage-run/rpc\";\n\ninterface WorkerOptions extends ReporterInitOptions {\n nodeArg?: string[];\n port?: number;\n host?: string;\n timeout?: number;\n shutdown: boolean;\n}\n\nexport async function serverAction(options: WorkerOptions) {\n const { port = 5332, host = \"localhost\", timeout = 1 } = options;\n\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.logFile = options.logFile ?? \"node_modules/.cache/lage/server.log\";\n options.reporter = options.reporter ?? \"verboseFileLog\";\n initializeReporters(logger, options);\n\n logger.info(`Starting server on http://${host}:${port}`);\n\n const abortController = new AbortController();\n\n const lageService = await createLageService({\n cwd: process.cwd(),\n serverControls: {\n abortController,\n countdownToShutdown: () => resetTimer(logger, timeout, abortController, server),\n clearCountdown: clearTimer,\n },\n logger,\n maxWorkers: options.concurrency,\n });\n const server = await createServer(lageService, abortController);\n\n await server.listen({ host, port });\n logger.info(`Server listening on http://${host}:${port}, timeout in ${timeout} seconds`);\n}\n\nlet timeoutHandle: NodeJS.Timeout | undefined;\nfunction resetTimer(logger: Logger, timeout: number, abortController: AbortController, server: any) {\n clearTimer();\n\n timeoutHandle = globalThis.setTimeout(() => {\n logger.info(`Server timed out after ${timeout} seconds`);\n abortController.abort();\n server.close();\n }, timeout * 1000);\n}\n\nfunction clearTimer() {\n if (timeoutHandle) {\n globalThis.clearTimeout(timeoutHandle);\n }\n}\n"],"names":["serverAction","options","port","host","timeout","logger","createLogger","logLevel","logFile","reporter","initializeReporters","info","abortController","AbortController","lageService","createLageService","cwd","process","serverControls","countdownToShutdown","resetTimer","server","clearCountdown","clearTimer","maxWorkers","concurrency","createServer","listen","timeoutHandle","globalThis","setTimeout","abort","close","clearTimeout"],"mappings":";;;;+BAcsBA;;;eAAAA;;;+DAdoB;qCAEN;6BACF;qBACL;;;;;;AAUtB,eAAeA,aAAaC,OAAsB;IACvD,MAAM,EAAEC,OAAO,IAAI,EAAEC,OAAO,WAAW,EAAEC,UAAU,CAAC,EAAE,GAAGH;IAEzD,MAAMI,SAASC,IAAAA,eAAY;IAC3BL,QAAQM,QAAQ,GAAGN,QAAQM,QAAQ,IAAI;IACvCN,QAAQO,OAAO,GAAGP,QAAQO,OAAO,IAAI;IACrCP,QAAQQ,QAAQ,GAAGR,QAAQQ,QAAQ,IAAI;IACvCC,IAAAA,wCAAmB,EAACL,QAAQJ;IAE5BI,OAAOM,IAAI,CAAC,CAAC,0BAA0B,EAAER,KAAK,CAAC,EAAED,MAAM;IAEvD,MAAMU,kBAAkB,IAAIC;IAE5B,MAAMC,cAAc,MAAMC,IAAAA,8BAAiB,EAAC;QAC1CC,KAAKC,QAAQD,GAAG;QAChBE,gBAAgB;YACdN;YACAO,qBAAqB,IAAMC,WAAWf,QAAQD,SAASQ,iBAAiBS;YACxEC,gBAAgBC;QAClB;QACAlB;QACAmB,YAAYvB,QAAQwB,WAAW;IACjC;IACA,MAAMJ,SAAS,MAAMK,IAAAA,iBAAY,EAACZ,aAAaF;IAE/C,MAAMS,OAAOM,MAAM,CAAC;QAAExB;QAAMD;IAAK;IACjCG,OAAOM,IAAI,CAAC,CAAC,2BAA2B,EAAER,KAAK,CAAC,EAAED,KAAK,aAAa,EAAEE,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAIwB;AACJ,SAASR,WAAWf,MAAc,EAAED,OAAe,EAAEQ,eAAgC,EAAES,MAAW;IAChGE;IAEAK,gBAAgBC,WAAWC,UAAU,CAAC;QACpCzB,OAAOM,IAAI,CAAC,CAAC,uBAAuB,EAAEP,QAAQ,QAAQ,CAAC;QACvDQ,gBAAgBmB,KAAK;QACrBV,OAAOW,KAAK;IACd,GAAG5B,UAAU;AACf;AAEA,SAASmB;IACP,IAAIK,eAAe;QACjBC,WAAWI,YAAY,CAACL;IAC1B;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/server/action.ts"],"sourcesContent":["import createLogger, { type Logger } from \"@lage-run/logger\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { createLageService } from \"./lageService.js\";\nimport { createServer } from \"@lage-run/rpc\";\n\ninterface WorkerOptions extends ReporterInitOptions {\n nodeArg?: string[];\n port?: number;\n host?: string;\n timeout?: number;\n shutdown: boolean;\n tasks: string[];\n}\n\nexport async function serverAction(options: WorkerOptions) {\n const { port = 5332, host = \"localhost\", timeout = 1, tasks } = options;\n\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.logFile = options.logFile ?? \"node_modules/.cache/lage/server.log\";\n options.reporter = options.reporter ?? \"verboseFileLog\";\n initializeReporters(logger, options);\n\n logger.info(`Starting server on http://${host}:${port}`);\n\n const abortController = new AbortController();\n\n const lageService = await createLageService({\n cwd: process.cwd(),\n serverControls: {\n abortController,\n countdownToShutdown: () => resetTimer(logger, timeout, abortController, server),\n clearCountdown: clearTimer,\n },\n logger,\n concurrency: options.concurrency,\n tasks,\n });\n const server = await createServer(lageService, abortController);\n\n await server.listen({ host, port });\n logger.info(`Server listening on http://${host}:${port}, timeout in ${timeout} seconds`);\n}\n\nlet timeoutHandle: NodeJS.Timeout | undefined;\nfunction resetTimer(logger: Logger, timeout: number, abortController: AbortController, server: any) {\n clearTimer();\n\n timeoutHandle = globalThis.setTimeout(() => {\n logger.info(`Server timed out after ${timeout} seconds`);\n abortController.abort();\n server.close();\n }, timeout * 1000);\n}\n\nfunction clearTimer() {\n if (timeoutHandle) {\n globalThis.clearTimeout(timeoutHandle);\n }\n}\n"],"names":["serverAction","options","port","host","timeout","tasks","logger","createLogger","logLevel","logFile","reporter","initializeReporters","info","abortController","AbortController","lageService","createLageService","cwd","process","serverControls","countdownToShutdown","resetTimer","server","clearCountdown","clearTimer","concurrency","createServer","listen","timeoutHandle","globalThis","setTimeout","abort","close","clearTimeout"],"mappings":";;;;+BAesBA;;;eAAAA;;;+DAfoB;qCAEN;6BACF;qBACL;;;;;;AAWtB,eAAeA,aAAaC,OAAsB;IACvD,MAAM,EAAEC,OAAO,IAAI,EAAEC,OAAO,WAAW,EAAEC,UAAU,CAAC,EAAEC,KAAK,EAAE,GAAGJ;IAEhE,MAAMK,SAASC,IAAAA,eAAY;IAC3BN,QAAQO,QAAQ,GAAGP,QAAQO,QAAQ,IAAI;IACvCP,QAAQQ,OAAO,GAAGR,QAAQQ,OAAO,IAAI;IACrCR,QAAQS,QAAQ,GAAGT,QAAQS,QAAQ,IAAI;IACvCC,IAAAA,wCAAmB,EAACL,QAAQL;IAE5BK,OAAOM,IAAI,CAAC,CAAC,0BAA0B,EAAET,KAAK,CAAC,EAAED,MAAM;IAEvD,MAAMW,kBAAkB,IAAIC;IAE5B,MAAMC,cAAc,MAAMC,IAAAA,8BAAiB,EAAC;QAC1CC,KAAKC,QAAQD,GAAG;QAChBE,gBAAgB;YACdN;YACAO,qBAAqB,IAAMC,WAAWf,QAAQF,SAASS,iBAAiBS;YACxEC,gBAAgBC;QAClB;QACAlB;QACAmB,aAAaxB,QAAQwB,WAAW;QAChCpB;IACF;IACA,MAAMiB,SAAS,MAAMI,IAAAA,iBAAY,EAACX,aAAaF;IAE/C,MAAMS,OAAOK,MAAM,CAAC;QAAExB;QAAMD;IAAK;IACjCI,OAAOM,IAAI,CAAC,CAAC,2BAA2B,EAAET,KAAK,CAAC,EAAED,KAAK,aAAa,EAAEE,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAIwB;AACJ,SAASP,WAAWf,MAAc,EAAEF,OAAe,EAAES,eAAgC,EAAES,MAAW;IAChGE;IAEAI,gBAAgBC,WAAWC,UAAU,CAAC;QACpCxB,OAAOM,IAAI,CAAC,CAAC,uBAAuB,EAAER,QAAQ,QAAQ,CAAC;QACvDS,gBAAgBkB,KAAK;QACrBT,OAAOU,KAAK;IACd,GAAG5B,UAAU;AACf;AAEA,SAASoB;IACP,IAAII,eAAe;QACjBC,WAAWI,YAAY,CAACL;IAC1B;AACF"}
@@ -8,18 +8,13 @@ Object.defineProperty(exports, "serverCommand", {
8
8
  return serverCommand;
9
9
  }
10
10
  });
11
- const _os = /*#__PURE__*/ _interop_require_default(require("os"));
12
11
  const _commander = require("commander");
13
12
  const _action = require("./action.js");
14
13
  const _addLoggerOptions = require("../addLoggerOptions.js");
15
- function _interop_require_default(obj) {
16
- return obj && obj.__esModule ? obj : {
17
- default: obj
18
- };
19
- }
20
14
  const serverCommand = new _commander.Command("server");
21
- serverCommand.option("-c|--concurrency <number>", "max jobs to run at a time", (v)=>parseInt(v), _os.default.cpus().length - 1);
15
+ serverCommand.option("-c|--concurrency <number>", "max jobs to run at a time", (v)=>parseInt(v));
22
16
  serverCommand.option("-h|--host <host>", "lage server host", "localhost");
23
17
  serverCommand.option("-p|--port <port>", "lage worker server port", (v)=>parseInt(v), 5332);
24
- serverCommand.option("-t|--timeout <seconds>", "lage server autoshutoff timeout", (v)=>parseInt(v), 1 * 60);
18
+ serverCommand.option("-t|--timeout <seconds>", "lage server autoshutoff timeout", (v)=>parseInt(v), 5 * 60);
19
+ serverCommand.option("--tasks <tasks...>", "A list of tasks to run, separated by space e.g. 'build test'");
25
20
  (0, _addLoggerOptions.addLoggerOptions)(serverCommand).action(_action.serverAction);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/server/index.ts"],"sourcesContent":["import os from \"os\";\nimport { Command } from \"commander\";\nimport { serverAction } from \"./action.js\";\nimport { addLoggerOptions } from \"../addLoggerOptions.js\";\n\nconst serverCommand = new Command(\"server\");\nserverCommand.option(\"-c|--concurrency <number>\", \"max jobs to run at a time\", (v) => parseInt(v), os.cpus().length - 1);\nserverCommand.option(\"-h|--host <host>\", \"lage server host\", \"localhost\");\nserverCommand.option<number>(\"-p|--port <port>\", \"lage worker server port\", (v) => parseInt(v), 5332);\nserverCommand.option<number>(\"-t|--timeout <seconds>\", \"lage server autoshutoff timeout\", (v) => parseInt(v), 1 * 60);\n\naddLoggerOptions(serverCommand).action(serverAction);\n\nexport { serverCommand };\n"],"names":["serverCommand","Command","option","v","parseInt","os","cpus","length","addLoggerOptions","action","serverAction"],"mappings":";;;;+BAaSA;;;eAAAA;;;2DAbM;2BACS;wBACK;kCACI;;;;;;AAEjC,MAAMA,gBAAgB,IAAIC,kBAAO,CAAC;AAClCD,cAAcE,MAAM,CAAC,6BAA6B,6BAA6B,CAACC,IAAMC,SAASD,IAAIE,WAAE,CAACC,IAAI,GAAGC,MAAM,GAAG;AACtHP,cAAcE,MAAM,CAAC,oBAAoB,oBAAoB;AAC7DF,cAAcE,MAAM,CAAS,oBAAoB,2BAA2B,CAACC,IAAMC,SAASD,IAAI;AAChGH,cAAcE,MAAM,CAAS,0BAA0B,mCAAmC,CAACC,IAAMC,SAASD,IAAI,IAAI;AAElHK,IAAAA,kCAAgB,EAACR,eAAeS,MAAM,CAACC,oBAAY"}
1
+ {"version":3,"sources":["../../../src/commands/server/index.ts"],"sourcesContent":["import os from \"os\";\nimport { Command } from \"commander\";\nimport { serverAction } from \"./action.js\";\nimport { addLoggerOptions } from \"../addLoggerOptions.js\";\n\nconst serverCommand = new Command(\"server\");\nserverCommand.option(\"-c|--concurrency <number>\", \"max jobs to run at a time\", (v) => parseInt(v));\nserverCommand.option(\"-h|--host <host>\", \"lage server host\", \"localhost\");\nserverCommand.option<number>(\"-p|--port <port>\", \"lage worker server port\", (v) => parseInt(v), 5332);\nserverCommand.option<number>(\"-t|--timeout <seconds>\", \"lage server autoshutoff timeout\", (v) => parseInt(v), 5 * 60);\nserverCommand.option(\"--tasks <tasks...>\", \"A list of tasks to run, separated by space e.g. 'build test'\");\n\naddLoggerOptions(serverCommand).action(serverAction);\n\nexport { serverCommand };\n"],"names":["serverCommand","Command","option","v","parseInt","addLoggerOptions","action","serverAction"],"mappings":";;;;+BAcSA;;;eAAAA;;;2BAbe;wBACK;kCACI;AAEjC,MAAMA,gBAAgB,IAAIC,kBAAO,CAAC;AAClCD,cAAcE,MAAM,CAAC,6BAA6B,6BAA6B,CAACC,IAAMC,SAASD;AAC/FH,cAAcE,MAAM,CAAC,oBAAoB,oBAAoB;AAC7DF,cAAcE,MAAM,CAAS,oBAAoB,2BAA2B,CAACC,IAAMC,SAASD,IAAI;AAChGH,cAAcE,MAAM,CAAS,0BAA0B,mCAAmC,CAACC,IAAMC,SAASD,IAAI,IAAI;AAClHH,cAAcE,MAAM,CAAC,sBAAsB;AAE3CG,IAAAA,kCAAgB,EAACL,eAAeM,MAAM,CAACC,oBAAY"}
@@ -6,10 +6,12 @@ interface ServiceControls {
6
6
  countdownToShutdown: () => void;
7
7
  clearCountdown: () => void;
8
8
  }
9
- export declare function createLageService({ cwd, serverControls, logger, maxWorkers, }: {
9
+ interface CreateLageServiceOptions {
10
10
  cwd: string;
11
11
  serverControls: ServiceControls;
12
12
  logger: Logger;
13
- maxWorkers?: number;
14
- }): Promise<ILageService>;
13
+ concurrency?: number;
14
+ tasks: string[];
15
+ }
16
+ export declare function createLageService({ cwd, serverControls, logger, concurrency, tasks, }: CreateLageServiceOptions): Promise<ILageService>;
15
17
  export {};
@@ -18,35 +18,28 @@ const _getOutputFiles = require("./getOutputFiles.js");
18
18
  const _globby = require("@lage-run/globby");
19
19
  const _MemoryStream = require("./MemoryStream.js");
20
20
  const _runnerPickerOptions = require("../../runnerPickerOptions.js");
21
- function findAllTasks(pipeline) {
22
- const tasks = new Set();
23
- for (const key of Object.keys(pipeline)){
24
- if (key.includes("#") || key.startsWith("#") || key.endsWith("//")) {
25
- const { task } = (0, _targetgraph.getPackageAndTask)(key);
26
- tasks.add(task);
27
- } else {
28
- tasks.add(key);
29
- }
30
- }
31
- return Array.from(tasks);
32
- }
21
+ const _filterPipelineDefinitions = require("../run/filterPipelineDefinitions.js");
22
+ const _formathrtime = require("@lage-run/format-hrtime");
33
23
  let initializedPromise;
24
+ function formatBytes(bytes) {
25
+ return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
26
+ }
34
27
  /**
35
28
  * Initializes the lageService: the extra "initializePromise" ensures only one initialization is done at a time across threads
36
29
  * @param cwd
37
30
  * @param logger
38
31
  * @returns
39
- */ async function initialize({ cwd, logger, serverControls, nodeArg, taskArgs, maxWorkers }) {
40
- if (initializedPromise) {
41
- return await initializedPromise;
42
- }
32
+ */ async function initialize({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }) {
43
33
  async function createInitializedPromise() {
44
- logger.info("Initializing context");
34
+ if (initializedPromise) {
35
+ return initializedPromise;
36
+ }
45
37
  const config = await (0, _config.getConfig)(cwd);
46
38
  const root = (0, _workspacetools.getWorkspaceRoot)(cwd);
39
+ const maxWorkers = (0, _config.getConcurrency)(concurrency, config.concurrency);
40
+ logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(", ")}`);
47
41
  const { pipeline } = config;
48
42
  const packageInfos = (0, _workspacetools.getPackageInfos)(root);
49
- const tasks = findAllTasks(pipeline);
50
43
  const targetGraph = await (0, _createTargetGraph.createTargetGraph)({
51
44
  logger,
52
45
  root,
@@ -72,16 +65,24 @@ let initializedPromise;
72
65
  });
73
66
  logger.info("Initializing Package Tree");
74
67
  await packageTree.initialize();
75
- const pool = new _workerthreadspool.WorkerPool({
76
- script: require.resolve("./singleTargetWorker.js"),
68
+ const filteredPipeline = (0, _filterPipelineDefinitions.filterPipelineDefinitions)(targetGraph.targets.values(), config.pipeline);
69
+ const pool = new _workerthreadspool.AggregatedPool({
70
+ logger,
71
+ maxWorkersByGroup: new Map([
72
+ ...(0, _config.getMaxWorkersPerTask)(filteredPipeline, maxWorkers)
73
+ ]),
74
+ groupBy: ({ target })=>target.task,
77
75
  maxWorkers,
76
+ script: require.resolve("./singleTargetWorker.js"),
78
77
  workerOptions: {
79
- stderr: true,
80
78
  stdout: true,
79
+ stderr: true,
81
80
  workerData: {
82
81
  runners: {
83
82
  ...(0, _runnerPickerOptions.runnerPickerOptions)(nodeArg, config.npmClient, taskArgs),
84
- ...config.runners
83
+ ...config.runners,
84
+ shouldCache: false,
85
+ shouldResetCache: false
85
86
  }
86
87
  }
87
88
  }
@@ -89,6 +90,9 @@ let initializedPromise;
89
90
  serverControls.abortController.signal.addEventListener("abort", ()=>{
90
91
  pool?.close();
91
92
  });
93
+ pool?.on("freedWorker", ()=>{
94
+ logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);
95
+ });
92
96
  pool?.on("idle", ()=>{
93
97
  logger.info("All workers are idle, shutting down after timeout");
94
98
  serverControls.countdownToShutdown();
@@ -105,8 +109,7 @@ let initializedPromise;
105
109
  initializedPromise = createInitializedPromise();
106
110
  return await initializedPromise;
107
111
  }
108
- async function createLageService({ cwd, serverControls, logger, maxWorkers }) {
109
- logger.info(`Server started with ${maxWorkers} workers`);
112
+ async function createLageService({ cwd, serverControls, logger, concurrency, tasks }) {
110
113
  return {
111
114
  async ping () {
112
115
  return {
@@ -124,9 +127,9 @@ async function createLageService({ cwd, serverControls, logger, maxWorkers }) {
124
127
  nodeArg: request.nodeOptions,
125
128
  taskArgs: request.taskArgs,
126
129
  serverControls,
127
- maxWorkers
130
+ concurrency,
131
+ tasks
128
132
  });
129
- logger.info("Running target", request);
130
133
  const runners = (0, _runnerPickerOptions.runnerPickerOptions)(request.nodeOptions, config.npmClient, request.taskArgs);
131
134
  const id = (0, _targetgraph.getTargetId)(request.packageName, request.task);
132
135
  if (!targetGraph.targets.has(id)) {
@@ -137,9 +140,6 @@ async function createLageService({ cwd, serverControls, logger, maxWorkers }) {
137
140
  exitCode: 1
138
141
  };
139
142
  }
140
- logger.info("Target found", {
141
- id
142
- });
143
143
  const target = targetGraph.targets.get(id);
144
144
  const task = {
145
145
  target,
@@ -149,6 +149,20 @@ async function createLageService({ cwd, serverControls, logger, maxWorkers }) {
149
149
  const writableStderr = new _MemoryStream.MemoryStream();
150
150
  let pipedStdout;
151
151
  let pipedStderr;
152
+ const targetRun = {
153
+ queueTime: process.hrtime(),
154
+ target,
155
+ duration: [
156
+ 0,
157
+ 0
158
+ ],
159
+ startTime: [
160
+ 0,
161
+ 0
162
+ ],
163
+ status: "queued",
164
+ threadId: 0
165
+ };
152
166
  try {
153
167
  await pool.exec(task, 0, (worker, stdout, stderr)=>{
154
168
  logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);
@@ -156,8 +170,13 @@ async function createLageService({ cwd, serverControls, logger, maxWorkers }) {
156
170
  pipedStderr = stderr;
157
171
  stdout.pipe(writableStdout);
158
172
  stderr.pipe(writableStderr);
173
+ targetRun.threadId = worker.threadId;
174
+ targetRun.status = "running";
175
+ targetRun.startTime = process.hrtime();
159
176
  }, (worker)=>{
160
- logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} end`);
177
+ targetRun.status = "success";
178
+ targetRun.duration = (0, _formathrtime.hrtimeDiff)(targetRun.startTime, process.hrtime());
179
+ logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} end: ${(0, _formathrtime.formatDuration)((0, _formathrtime.hrToSeconds)(targetRun.duration))}`);
161
180
  pipedStdout.unpipe(writableStdout);
162
181
  pipedStderr.unpipe(writableStderr);
163
182
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/server/lageService.ts"],"sourcesContent":["import { type ConfigOptions, getConfig, type PipelineDefinition } from \"@lage-run/config\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { ILageService } from \"@lage-run/rpc\";\nimport { getTargetId, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { getPackageAndTask } from \"@lage-run/target-graph\";\nimport { type Readable } from \"stream\";\nimport { type Pool, WorkerPool } from \"@lage-run/worker-threads-pool\";\nimport { getInputFiles, PackageTree } from \"@lage-run/hasher\";\nimport { createDependencyMap } from \"workspace-tools\";\nimport { getOutputFiles } from \"./getOutputFiles.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { MemoryStream } from \"./MemoryStream.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\n\nfunction findAllTasks(pipeline: PipelineDefinition) {\n const tasks = new Set<string>();\n for (const key of Object.keys(pipeline)) {\n if (key.includes(\"#\") || key.startsWith(\"#\") || key.endsWith(\"//\")) {\n const { task } = getPackageAndTask(key);\n tasks.add(task);\n } else {\n tasks.add(key);\n }\n }\n return Array.from(tasks);\n}\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n}\n\nlet initializedPromise: Promise<LageServiceContext> | undefined;\ninterface ServiceControls {\n abortController: AbortController;\n countdownToShutdown: () => void;\n clearCountdown: () => void;\n}\ninterface InitializeOptions {\n cwd: string;\n logger: Logger;\n serverControls: ServiceControls;\n maxWorkers?: number;\n nodeArg?: string;\n taskArgs: string[];\n}\n/**\n * Initializes the lageService: the extra \"initializePromise\" ensures only one initialization is done at a time across threads\n * @param cwd\n * @param logger\n * @returns\n */\nasync function initialize({ cwd, logger, serverControls, nodeArg, taskArgs, maxWorkers }: InitializeOptions): Promise<LageServiceContext> {\n if (initializedPromise) {\n return await initializedPromise;\n }\n\n async function createInitializedPromise() {\n logger.info(\"Initializing context\");\n const config = await getConfig(cwd);\n const root = getWorkspaceRoot(cwd)!;\n\n const { pipeline } = config;\n\n const packageInfos = getPackageInfos(root);\n const tasks = findAllTasks(pipeline);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: false,\n dependents: false,\n ignore: [],\n pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: undefined,\n since: undefined,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n });\n\n const dependencyMap = createDependencyMap(packageInfos, { withDevDependencies: true, withPeerDependencies: false });\n const packageTree = new PackageTree({\n root,\n packageInfos,\n includeUntracked: true,\n });\n\n logger.info(\"Initializing Package Tree\");\n await packageTree.initialize();\n\n const pool = new WorkerPool({\n script: require.resolve(\"./singleTargetWorker.js\"),\n maxWorkers,\n workerOptions: {\n stderr: true,\n stdout: true,\n workerData: {\n runners: {\n ...runnerPickerOptions(nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n },\n },\n },\n });\n\n serverControls.abortController.signal.addEventListener(\"abort\", () => {\n pool?.close();\n });\n\n pool?.on(\"idle\", () => {\n logger.info(\"All workers are idle, shutting down after timeout\");\n serverControls.countdownToShutdown();\n });\n\n return { config, targetGraph, packageTree, dependencyMap, root, pool };\n }\n\n initializedPromise = createInitializedPromise();\n\n return await initializedPromise;\n}\n\nexport async function createLageService({\n cwd,\n serverControls,\n logger,\n maxWorkers,\n}: {\n cwd: string;\n serverControls: ServiceControls;\n logger: Logger;\n maxWorkers?: number;\n}): Promise<ILageService> {\n logger.info(`Server started with ${maxWorkers} workers`);\n\n return {\n async ping() {\n return { pong: true };\n },\n\n async runTarget(request) {\n serverControls.clearCountdown();\n\n // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call\n // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same\n // `lage info` call\n const { config, targetGraph, dependencyMap, packageTree, root, pool } = await initialize({\n cwd,\n logger,\n nodeArg: request.nodeOptions,\n taskArgs: request.taskArgs,\n serverControls,\n maxWorkers,\n });\n\n logger.info(\"Running target\", request);\n\n const runners = runnerPickerOptions(request.nodeOptions, config.npmClient, request.taskArgs);\n\n const id = getTargetId(request.packageName, request.task);\n\n if (!targetGraph.targets.has(id)) {\n logger.info(`Target not found: ${request.packageName}#${request.task}`);\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n };\n }\n\n logger.info(\"Target found\", { id });\n\n const target = targetGraph.targets.get(id)!;\n const task = {\n target,\n runners,\n };\n\n const writableStdout = new MemoryStream();\n const writableStderr = new MemoryStream();\n let pipedStdout: Readable;\n let pipedStderr: Readable;\n\n try {\n await pool.exec(\n task,\n 0,\n (worker, stdout, stderr) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);\n\n pipedStdout = stdout;\n pipedStderr = stderr;\n\n stdout.pipe(writableStdout);\n stderr.pipe(writableStderr);\n },\n (worker) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} end`);\n pipedStdout.unpipe(writableStdout);\n pipedStderr.unpipe(writableStderr);\n }\n );\n\n const globalInputs = target.environmentGlob\n ? glob(target.environmentGlob, { cwd: root, gitignore: true })\n : config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n const inputs = (getInputFiles(target, dependencyMap, packageTree) ?? []).concat(globalInputs);\n\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n hash: \"\",\n inputs,\n outputs: getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree),\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n };\n } catch (e) {\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n hash: \"\",\n inputs: [],\n outputs: [],\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n };\n }\n },\n };\n}\n"],"names":["createLageService","findAllTasks","pipeline","tasks","Set","key","Object","keys","includes","startsWith","endsWith","task","getPackageAndTask","add","Array","from","initializedPromise","initialize","cwd","logger","serverControls","nodeArg","taskArgs","maxWorkers","createInitializedPromise","info","config","getConfig","root","getWorkspaceRoot","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","pool","WorkerPool","script","require","resolve","workerOptions","stderr","stdout","workerData","runners","runnerPickerOptions","npmClient","abortController","signal","addEventListener","close","on","countdownToShutdown","ping","pong","runTarget","request","clearCountdown","nodeOptions","id","getTargetId","packageName","targets","has","exitCode","target","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","exec","worker","threadId","pipe","unpipe","globalInputs","environmentGlob","glob","gitignore","inputs","getInputFiles","concat","hash","getOutputFiles","toString","e","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/server/lageService.ts"],"sourcesContent":["import { type ConfigOptions, getConfig, getConcurrency, getMaxWorkersPerTask } from \"@lage-run/config\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { ILageService } from \"@lage-run/rpc\";\nimport { getTargetId, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { type Readable } from \"stream\";\nimport { type Pool, AggregatedPool } from \"@lage-run/worker-threads-pool\";\nimport { getInputFiles, PackageTree } from \"@lage-run/hasher\";\nimport { createDependencyMap } from \"workspace-tools\";\nimport { getOutputFiles } from \"./getOutputFiles.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { MemoryStream } from \"./MemoryStream.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { filterPipelineDefinitions } from \"../run/filterPipelineDefinitions.js\";\nimport type { TargetRun } from \"@lage-run/scheduler-types\";\nimport { formatDuration, hrToSeconds, hrtimeDiff } from \"@lage-run/format-hrtime\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n}\n\nlet initializedPromise: Promise<LageServiceContext> | undefined;\ninterface ServiceControls {\n abortController: AbortController;\n countdownToShutdown: () => void;\n clearCountdown: () => void;\n}\ninterface InitializeOptions {\n cwd: string;\n logger: Logger;\n serverControls: ServiceControls;\n concurrency?: number;\n nodeArg?: string;\n taskArgs: string[];\n tasks: string[];\n}\n\nfunction formatBytes(bytes: number) {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\n/**\n * Initializes the lageService: the extra \"initializePromise\" ensures only one initialization is done at a time across threads\n * @param cwd\n * @param logger\n * @returns\n */\nasync function initialize({\n cwd,\n logger,\n serverControls,\n nodeArg,\n taskArgs,\n concurrency,\n tasks,\n}: InitializeOptions): Promise<LageServiceContext> {\n async function createInitializedPromise() {\n if (initializedPromise) {\n return initializedPromise;\n }\n\n const config = await getConfig(cwd);\n const root = getWorkspaceRoot(cwd)!;\n const maxWorkers = getConcurrency(concurrency, config.concurrency);\n\n logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(\", \")}`);\n\n const { pipeline } = config;\n\n const packageInfos = getPackageInfos(root);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: false,\n dependents: false,\n ignore: [],\n pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: undefined,\n since: undefined,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n });\n\n const dependencyMap = createDependencyMap(packageInfos, { withDevDependencies: true, withPeerDependencies: false });\n const packageTree = new PackageTree({\n root,\n packageInfos,\n includeUntracked: true,\n });\n\n logger.info(\"Initializing Package Tree\");\n await packageTree.initialize();\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n const pool = new AggregatedPool({\n logger,\n maxWorkersByGroup: new Map([...getMaxWorkersPerTask(filteredPipeline, maxWorkers)]),\n groupBy: ({ target }) => target.task,\n maxWorkers,\n script: require.resolve(\"./singleTargetWorker.js\"),\n workerOptions: {\n stdout: true,\n stderr: true,\n workerData: {\n runners: {\n ...runnerPickerOptions(nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n shouldCache: false,\n shouldResetCache: false,\n },\n },\n },\n });\n\n serverControls.abortController.signal.addEventListener(\"abort\", () => {\n pool?.close();\n });\n\n pool?.on(\"freedWorker\", () => {\n logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);\n });\n\n pool?.on(\"idle\", () => {\n logger.info(\"All workers are idle, shutting down after timeout\");\n serverControls.countdownToShutdown();\n });\n\n return { config, targetGraph, packageTree, dependencyMap, root, pool };\n }\n\n initializedPromise = createInitializedPromise();\n\n return await initializedPromise;\n}\n\ninterface CreateLageServiceOptions {\n cwd: string;\n serverControls: ServiceControls;\n logger: Logger;\n concurrency?: number;\n tasks: string[];\n}\n\nexport async function createLageService({\n cwd,\n serverControls,\n logger,\n concurrency,\n tasks,\n}: CreateLageServiceOptions): Promise<ILageService> {\n return {\n async ping() {\n return { pong: true };\n },\n\n async runTarget(request) {\n serverControls.clearCountdown();\n\n // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call\n // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same\n // `lage info` call\n const { config, targetGraph, dependencyMap, packageTree, root, pool } = await initialize({\n cwd,\n logger,\n nodeArg: request.nodeOptions,\n taskArgs: request.taskArgs,\n serverControls,\n concurrency,\n tasks,\n });\n\n const runners = runnerPickerOptions(request.nodeOptions, config.npmClient, request.taskArgs);\n\n const id = getTargetId(request.packageName, request.task);\n\n if (!targetGraph.targets.has(id)) {\n logger.info(`Target not found: ${request.packageName}#${request.task}`);\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n };\n }\n\n const target = targetGraph.targets.get(id)!;\n const task = {\n target,\n runners,\n };\n\n const writableStdout = new MemoryStream();\n const writableStderr = new MemoryStream();\n let pipedStdout: Readable;\n let pipedStderr: Readable;\n\n const targetRun: TargetRun = {\n queueTime: process.hrtime(),\n target,\n duration: [0, 0],\n startTime: [0, 0],\n status: \"queued\",\n threadId: 0,\n };\n\n try {\n await pool.exec(\n task,\n 0,\n (worker, stdout, stderr) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);\n\n pipedStdout = stdout;\n pipedStderr = stderr;\n\n stdout.pipe(writableStdout);\n stderr.pipe(writableStderr);\n\n targetRun.threadId = worker.threadId;\n targetRun.status = \"running\";\n targetRun.startTime = process.hrtime();\n },\n (worker) => {\n targetRun.status = \"success\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n logger.info(\n `[${worker.threadId}] ${request.packageName}#${request.task} end: ${formatDuration(hrToSeconds(targetRun.duration))}`\n );\n pipedStdout.unpipe(writableStdout);\n pipedStderr.unpipe(writableStderr);\n }\n );\n\n const globalInputs = target.environmentGlob\n ? glob(target.environmentGlob, { cwd: root, gitignore: true })\n : config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n const inputs = (getInputFiles(target, dependencyMap, packageTree) ?? []).concat(globalInputs);\n\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n hash: \"\",\n inputs,\n outputs: getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree),\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n };\n } catch (e) {\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n hash: \"\",\n inputs: [],\n outputs: [],\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n };\n }\n },\n };\n}\n"],"names":["createLageService","initializedPromise","formatBytes","bytes","toFixed","initialize","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","createInitializedPromise","config","getConfig","root","getWorkspaceRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","filteredPipeline","filterPipelineDefinitions","targets","values","pool","AggregatedPool","maxWorkersByGroup","Map","getMaxWorkersPerTask","groupBy","target","task","script","require","resolve","workerOptions","stdout","stderr","workerData","runners","runnerPickerOptions","npmClient","shouldCache","shouldResetCache","abortController","signal","addEventListener","close","on","silly","stats","maxWorkerMemoryUsage","countdownToShutdown","ping","pong","runTarget","request","clearCountdown","nodeOptions","id","getTargetId","packageName","has","exitCode","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","targetRun","queueTime","process","hrtime","duration","startTime","status","threadId","exec","worker","pipe","hrtimeDiff","formatDuration","hrToSeconds","unpipe","globalInputs","environmentGlob","glob","gitignore","inputs","getInputFiles","concat","hash","getOutputFiles","toString","e","Error"],"mappings":";;;;+BAyJsBA;;;eAAAA;;;wBAzJ8D;6BAGtC;gCACwB;mCACpC;mCAEQ;wBACC;gCAEZ;wBACV;8BACQ;qCACO;2CACM;8BAEc;AAWxD,IAAIC;AAgBJ,SAASC,YAAYC,KAAa;IAChC,OAAO,GAAG,AAACA,CAAAA,QAAQ,OAAO,IAAG,EAAGC,OAAO,CAAC,GAAG,GAAG,CAAC;AACjD;AAEA;;;;;CAKC,GACD,eAAeC,WAAW,EACxBC,GAAG,EACHC,MAAM,EACNC,cAAc,EACdC,OAAO,EACPC,QAAQ,EACRC,WAAW,EACXC,KAAK,EACa;IAClB,eAAeC;QACb,IAAIZ,oBAAoB;YACtB,OAAOA;QACT;QAEA,MAAMa,SAAS,MAAMC,IAAAA,iBAAS,EAACT;QAC/B,MAAMU,OAAOC,IAAAA,gCAAgB,EAACX;QAC9B,MAAMY,aAAaC,IAAAA,sBAAc,EAACR,aAAaG,OAAOH,WAAW;QAEjEJ,OAAOa,IAAI,CAAC,CAAC,kBAAkB,EAAEF,WAAW,iBAAiB,EAAEN,MAAMS,IAAI,CAAC,OAAO;QAEjF,MAAM,EAAEC,QAAQ,EAAE,GAAGR;QAErB,MAAMS,eAAeC,IAAAA,+BAAe,EAACR;QAErC,MAAMS,cAAc,MAAMC,IAAAA,oCAAiB,EAAC;YAC1CnB;YACAS;YACAW,cAAc;YACdC,YAAY;YACZC,QAAQ,EAAE;YACVP;YACAQ,iBAAiBhB,OAAOgB,eAAe;YACvCC,OAAOC;YACPC,OAAOD;YACPE,SAASpB,OAAOqB,YAAY,CAACC,UAAU;YACvCxB;YACAW;QACF;QAEA,MAAMc,gBAAgBC,IAAAA,mCAAmB,EAACf,cAAc;YAAEgB,qBAAqB;YAAMC,sBAAsB;QAAM;QACjH,MAAMC,cAAc,IAAIC,mBAAW,CAAC;YAClC1B;YACAO;YACAoB,kBAAkB;QACpB;QAEApC,OAAOa,IAAI,CAAC;QACZ,MAAMqB,YAAYpC,UAAU;QAE5B,MAAMuC,mBAAmBC,IAAAA,oDAAyB,EAACpB,YAAYqB,OAAO,CAACC,MAAM,IAAIjC,OAAOQ,QAAQ;QAEhG,MAAM0B,OAAO,IAAIC,iCAAc,CAAC;YAC9B1C;YACA2C,mBAAmB,IAAIC,IAAI;mBAAIC,IAAAA,4BAAoB,EAACR,kBAAkB1B;aAAY;YAClFmC,SAAS,CAAC,EAAEC,MAAM,EAAE,GAAKA,OAAOC,IAAI;YACpCrC;YACAsC,QAAQC,QAAQC,OAAO,CAAC;YACxBC,eAAe;gBACbC,QAAQ;gBACRC,QAAQ;gBACRC,YAAY;oBACVC,SAAS;wBACP,GAAGC,IAAAA,wCAAmB,EAACvD,SAASK,OAAOmD,SAAS,EAAEvD,SAAS;wBAC3D,GAAGI,OAAOiD,OAAO;wBACjBG,aAAa;wBACbC,kBAAkB;oBACpB;gBACF;YACF;QACF;QAEA3D,eAAe4D,eAAe,CAACC,MAAM,CAACC,gBAAgB,CAAC,SAAS;YAC9DtB,MAAMuB;QACR;QAEAvB,MAAMwB,GAAG,eAAe;YACtBjE,OAAOkE,KAAK,CAAC,CAAC,yBAAyB,EAAEvE,YAAY8C,MAAM0B,QAAQC,uBAAuB;QAC5F;QAEA3B,MAAMwB,GAAG,QAAQ;YACfjE,OAAOa,IAAI,CAAC;YACZZ,eAAeoE,mBAAmB;QACpC;QAEA,OAAO;YAAE9D;YAAQW;YAAagB;YAAaJ;YAAerB;YAAMgC;QAAK;IACvE;IAEA/C,qBAAqBY;IAErB,OAAO,MAAMZ;AACf;AAUO,eAAeD,kBAAkB,EACtCM,GAAG,EACHE,cAAc,EACdD,MAAM,EACNI,WAAW,EACXC,KAAK,EACoB;IACzB,OAAO;QACL,MAAMiE;YACJ,OAAO;gBAAEC,MAAM;YAAK;QACtB;QAEA,MAAMC,WAAUC,OAAO;YACrBxE,eAAeyE,cAAc;YAE7B,2FAA2F;YAC3F,qIAAqI;YACrI,mBAAmB;YACnB,MAAM,EAAEnE,MAAM,EAAEW,WAAW,EAAEY,aAAa,EAAEI,WAAW,EAAEzB,IAAI,EAAEgC,IAAI,EAAE,GAAG,MAAM3C,WAAW;gBACvFC;gBACAC;gBACAE,SAASuE,QAAQE,WAAW;gBAC5BxE,UAAUsE,QAAQtE,QAAQ;gBAC1BF;gBACAG;gBACAC;YACF;YAEA,MAAMmD,UAAUC,IAAAA,wCAAmB,EAACgB,QAAQE,WAAW,EAAEpE,OAAOmD,SAAS,EAAEe,QAAQtE,QAAQ;YAE3F,MAAMyE,KAAKC,IAAAA,wBAAW,EAACJ,QAAQK,WAAW,EAAEL,QAAQzB,IAAI;YAExD,IAAI,CAAC9B,YAAYqB,OAAO,CAACwC,GAAG,CAACH,KAAK;gBAChC5E,OAAOa,IAAI,CAAC,CAAC,kBAAkB,EAAE4D,QAAQK,WAAW,CAAC,CAAC,EAAEL,QAAQzB,IAAI,EAAE;gBACtE,OAAO;oBACL8B,aAAaL,QAAQK,WAAW;oBAChC9B,MAAMyB,QAAQzB,IAAI;oBAClBgC,UAAU;gBACZ;YACF;YAEA,MAAMjC,SAAS7B,YAAYqB,OAAO,CAAC0C,GAAG,CAACL;YACvC,MAAM5B,OAAO;gBACXD;gBACAS;YACF;YAEA,MAAM0B,iBAAiB,IAAIC,0BAAY;YACvC,MAAMC,iBAAiB,IAAID,0BAAY;YACvC,IAAIE;YACJ,IAAIC;YAEJ,MAAMC,YAAuB;gBAC3BC,WAAWC,QAAQC,MAAM;gBACzB3C;gBACA4C,UAAU;oBAAC;oBAAG;iBAAE;gBAChBC,WAAW;oBAAC;oBAAG;iBAAE;gBACjBC,QAAQ;gBACRC,UAAU;YACZ;YAEA,IAAI;gBACF,MAAMrD,KAAKsD,IAAI,CACb/C,MACA,GACA,CAACgD,QAAQ3C,QAAQC;oBACftD,OAAOa,IAAI,CAAC,CAAC,CAAC,EAAEmF,OAAOF,QAAQ,CAAC,EAAE,EAAErB,QAAQK,WAAW,CAAC,CAAC,EAAEL,QAAQzB,IAAI,CAAC,MAAM,CAAC;oBAE/EqC,cAAchC;oBACdiC,cAAchC;oBAEdD,OAAO4C,IAAI,CAACf;oBACZ5B,OAAO2C,IAAI,CAACb;oBAEZG,UAAUO,QAAQ,GAAGE,OAAOF,QAAQ;oBACpCP,UAAUM,MAAM,GAAG;oBACnBN,UAAUK,SAAS,GAAGH,QAAQC,MAAM;gBACtC,GACA,CAACM;oBACCT,UAAUM,MAAM,GAAG;oBACnBN,UAAUI,QAAQ,GAAGO,IAAAA,wBAAU,EAACX,UAAUK,SAAS,EAAEH,QAAQC,MAAM;oBAEnE1F,OAAOa,IAAI,CACT,CAAC,CAAC,EAAEmF,OAAOF,QAAQ,CAAC,EAAE,EAAErB,QAAQK,WAAW,CAAC,CAAC,EAAEL,QAAQzB,IAAI,CAAC,MAAM,EAAEmD,IAAAA,4BAAc,EAACC,IAAAA,yBAAW,EAACb,UAAUI,QAAQ,IAAI;oBAEvHN,YAAYgB,MAAM,CAACnB;oBACnBI,YAAYe,MAAM,CAACjB;gBACrB;gBAGF,MAAMkB,eAAevD,OAAOwD,eAAe,GACvCC,IAAAA,YAAI,EAACzD,OAAOwD,eAAe,EAAE;oBAAExG,KAAKU;oBAAMgG,WAAW;gBAAK,KAC1DlG,OAAOqB,YAAY,EAAE2E,kBACrBC,IAAAA,YAAI,EAACjG,OAAOqB,YAAY,EAAE2E,iBAAiB;oBAAExG,KAAKU;oBAAMgG,WAAW;gBAAK,KACxE;oBAAC;iBAAiB;gBACtB,MAAMC,SAAS,AAACC,CAAAA,IAAAA,qBAAa,EAAC5D,QAAQjB,eAAeI,gBAAgB,EAAE,AAAD,EAAG0E,MAAM,CAACN;gBAEhF,OAAO;oBACLxB,aAAaL,QAAQK,WAAW;oBAChC9B,MAAMyB,QAAQzB,IAAI;oBAClBgC,UAAU;oBACV6B,MAAM;oBACNH;oBACA/E,SAASmF,IAAAA,8BAAc,EAACrG,MAAMsC,QAAQxC,OAAOqB,YAAY,EAAEC,YAAYK;oBACvEmB,QAAQ6B,eAAe6B,QAAQ;oBAC/BzD,QAAQ8B,eAAe2B,QAAQ;oBAC/BnC;gBACF;YACF,EAAE,OAAOoC,GAAG;gBACV,OAAO;oBACLlC,aAAaL,QAAQK,WAAW;oBAChC9B,MAAMyB,QAAQzB,IAAI;oBAClBgC,UAAU;oBACV6B,MAAM;oBACNH,QAAQ,EAAE;oBACV/E,SAAS,EAAE;oBACX0B,QAAQ;oBACRC,QAAQ0D,aAAaC,QAAQD,EAAED,QAAQ,KAAK;oBAC5CnC;gBACF;YACF;QACF;IACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lage-run/cli",
3
- "version": "0.24.4",
3
+ "version": "0.24.5",
4
4
  "description": "Command Line Interface for Lage",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,16 +23,17 @@
23
23
  "dependencies": {
24
24
  "@lage-run/cache": "^1.3.10",
25
25
  "@lage-run/config": "^0.4.11",
26
+ "@lage-run/format-hrtime": "^0.1.6",
26
27
  "@lage-run/globby": "^14.2.0",
27
28
  "@lage-run/hasher": "^1.6.7",
28
29
  "@lage-run/logger": "^1.3.1",
29
30
  "@lage-run/reporters": "^1.2.18",
30
31
  "@lage-run/rpc": "^1.2.3",
31
32
  "@lage-run/runners": "^1.2.0",
32
- "@lage-run/scheduler": "^1.4.0",
33
+ "@lage-run/scheduler": "^1.4.1",
33
34
  "@lage-run/scheduler-types": "^0.3.22",
34
35
  "@lage-run/target-graph": "^0.11.0",
35
- "@lage-run/worker-threads-pool": "^0.8.4",
36
+ "@lage-run/worker-threads-pool": "^0.8.5",
36
37
  "chokidar": "3.5.3",
37
38
  "commander": "9.5.0",
38
39
  "execa": "5.1.1",