@lage-run/cli 0.24.5 → 0.24.6

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": "Wed, 04 Dec 2024 23:49:59 GMT",
5
+ "date": "Sun, 08 Dec 2024 00:07:13 GMT",
6
+ "version": "0.24.6",
7
+ "tag": "@lage-run/cli_v0.24.6",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "kchau@microsoft.com",
12
+ "package": "@lage-run/cli",
13
+ "commit": "e6eaba8d27f25d746caed332198519a7dc4a218e",
14
+ "comment": "adds the ability to do workerIdleMemoryLimit"
15
+ },
16
+ {
17
+ "author": "beachball",
18
+ "package": "@lage-run/cli",
19
+ "comment": "Bump @lage-run/scheduler to v1.4.2",
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.6",
26
+ "commit": "not available"
27
+ }
28
+ ]
29
+ }
30
+ },
31
+ {
32
+ "date": "Wed, 04 Dec 2024 23:50:15 GMT",
6
33
  "version": "0.24.5",
7
34
  "tag": "@lage-run/cli_v0.24.5",
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 Wed, 04 Dec 2024 23:49:59 GMT and should not be manually modified. -->
3
+ <!-- This log was last generated on Sun, 08 Dec 2024 00:07:13 GMT and should not be manually modified. -->
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 0.24.6
8
+
9
+ Sun, 08 Dec 2024 00:07:13 GMT
10
+
11
+ ### Patches
12
+
13
+ - adds the ability to do workerIdleMemoryLimit (kchau@microsoft.com)
14
+ - Bump @lage-run/scheduler to v1.4.2
15
+ - Bump @lage-run/worker-threads-pool to v0.8.6
16
+
7
17
  ## 0.24.5
8
18
 
9
- Wed, 04 Dec 2024 23:49:59 GMT
19
+ Wed, 04 Dec 2024 23:50:15 GMT
10
20
 
11
21
  ### Patches
12
22
 
@@ -5,6 +5,7 @@ interface ExecRemotelyOptions extends ReporterInitOptions {
5
5
  server?: string | boolean;
6
6
  timeout?: number;
7
7
  tasks: string[];
8
+ nodeArg?: string;
8
9
  }
9
10
  export declare function executeRemotely(options: ExecRemotelyOptions, command: Command): Promise<void>;
10
11
  export {};
@@ -14,8 +14,6 @@ const _rpc = require("@lage-run/rpc");
14
14
  const _filterArgsForTasks = require("../run/filterArgsForTasks.js");
15
15
  const _simulateFileAccess = require("./simulateFileAccess.js");
16
16
  const _parseServerOption = require("../parseServerOption.js");
17
- const _path = /*#__PURE__*/ _interop_require_default(require("path"));
18
- const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
19
17
  const _workspacetools = require("workspace-tools");
20
18
  const _launchServerInBackground = require("../launchServerInBackground.js");
21
19
  function _interop_require_default(obj) {
@@ -86,32 +84,10 @@ async function executeOnServer(args, client, logger) {
86
84
  }
87
85
  }
88
86
  }
89
- function isAlive(pid) {
90
- try {
91
- return process.kill(pid, 0);
92
- } catch {
93
- return false;
94
- }
95
- }
96
- function ensurePidFile(lockfilePath) {
97
- if (!_fs.default.existsSync(_path.default.dirname(lockfilePath))) {
98
- _fs.default.mkdirSync(_path.default.dirname(lockfilePath), {
99
- recursive: true
100
- });
101
- }
102
- if (!_fs.default.existsSync(lockfilePath)) {
103
- try {
104
- const fd = _fs.default.openSync(lockfilePath, "w");
105
- _fs.default.closeSync(fd);
106
- } catch {
107
- // ignore
108
- }
109
- }
110
- }
111
87
  async function executeRemotely(options, command) {
112
88
  // launch a 'lage-server.js' process, detached if it is not already running
113
89
  // send the command to the server process
114
- const { server, tasks } = options;
90
+ const { server, tasks, nodeArg } = options;
115
91
  const timeout = options.timeout ?? 5 * 60;
116
92
  const { host, port } = (0, _parseServerOption.parseServerOption)(server);
117
93
  const logger = (0, _logger.default)();
@@ -130,7 +106,8 @@ async function executeRemotely(options, command) {
130
106
  args,
131
107
  timeout,
132
108
  logger,
133
- root
109
+ root,
110
+ nodeArg
134
111
  });
135
112
  logger.info("Creating a client to connect to the background services");
136
113
  client = await tryCreateClientWithRetries(host, port, logger);
@@ -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\";\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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"}
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 { parseServerOption } from \"../parseServerOption.js\";\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 nodeArg?: 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\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, nodeArg } = 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 nodeArg,\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","options","command","server","tasks","nodeArg","timeout","parseServerOption","createLogger","logLevel","reporter","initializeReporters","root","getWorkspaceRoot","cwd","process","join","launchServerInBackground","stdout","write","stderr","simulateFileAccess","inputs","outputs"],"mappings":"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"}
@@ -18,6 +18,7 @@ function _interop_require_default(obj) {
18
18
  };
19
19
  }
20
20
  const execCommand = new _commander.Command("exec");
21
+ execCommand.option("-n|--node-arg <arg>", "node argument to pass to worker, just a single string to be passed into node like a NODE_OPTIONS setting");
21
22
  execCommand.option("-c|--concurrency <number>", "max jobs to run at a time", (v)=>parseInt(v), _os.default.cpus().length - 1);
22
23
  execCommand.option("-s|--server [host:port]", "lage server host");
23
24
  execCommand.option("-t|--timeout <seconds>", "lage server autoshutoff timeout", (v)=>parseInt(v), 5 * 60);
@@ -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), 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"}
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(\n \"-n|--node-arg <arg>\",\n \"node argument to pass to worker, just a single string to be passed into node like a NODE_OPTIONS setting\"\n);\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":";;;;+BAeSA;;;eAAAA;;;2BAfe;wBACG;kCACM;2DAClB;;;;;;AAEf,MAAMA,cAAc,IAAIC,kBAAO,CAAC;AAChCD,YAAYE,MAAM,CAChB,uBACA;AAEFF,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"}
@@ -7,5 +7,6 @@ export interface launchServerInBackgroundOptions {
7
7
  tasks: string[];
8
8
  timeout: number;
9
9
  args: string[];
10
+ nodeArg?: string;
10
11
  }
11
- export declare function launchServerInBackground({ logger, root, host, port, tasks, timeout, args }: launchServerInBackgroundOptions): Promise<void>;
12
+ export declare function launchServerInBackground({ logger, root, host, port, tasks, timeout, args, nodeArg, }: launchServerInBackgroundOptions): Promise<void>;
@@ -18,7 +18,7 @@ function _interop_require_default(obj) {
18
18
  default: obj
19
19
  };
20
20
  }
21
- async function launchServerInBackground({ logger, root, host, port, tasks, timeout, args }) {
21
+ async function launchServerInBackground({ logger, root, host, port, tasks, timeout, args, nodeArg }) {
22
22
  const lockfilePath = _path.default.join(root, `node_modules/.cache/lage/.lage-server-${host}-${port}.pid`);
23
23
  logger.info(`Starting server on http://${host}:${port}`);
24
24
  logger.info(`acquiring lock: ${lockfilePath}`);
@@ -44,9 +44,14 @@ async function launchServerInBackground({ logger, root, host, port, tasks, timeo
44
44
  pid
45
45
  });
46
46
  } else {
47
- const binPaths = (0, _getBinPaths.getBinPaths)();
48
- const lageServerBinPath = binPaths["lage-server"];
47
+ const binScripts = (0, _getBinPaths.getBinScripts)();
48
+ const lageServerBinPath = binScripts["lage-server"];
49
49
  const lageServerArgs = [
50
+ ...nodeArg ? [
51
+ "--node-arg",
52
+ nodeArg
53
+ ] : [],
54
+ lageServerBinPath,
50
55
  "--tasks",
51
56
  ...tasks,
52
57
  "--host",
@@ -58,7 +63,7 @@ async function launchServerInBackground({ logger, root, host, port, tasks, timeo
58
63
  ...args
59
64
  ];
60
65
  logger.info(`Launching lage-server with these parameters: ${lageServerArgs.join(" ")}`);
61
- const child = (0, _execa.default)(lageServerBinPath, lageServerArgs, {
66
+ const child = (0, _execa.default)("node", lageServerArgs, {
62
67
  cwd: root,
63
68
  detached: true,
64
69
  stdio: "ignore",
@@ -1 +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"}
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, getBinScripts } 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 nodeArg?: string;\n}\n\nexport async function launchServerInBackground({\n logger,\n root,\n host,\n port,\n tasks,\n timeout,\n args,\n nodeArg,\n}: 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 binScripts = getBinScripts();\n\n const lageServerBinPath = binScripts[\"lage-server\"];\n const lageServerArgs = [\n ...(nodeArg ? [\"--node-arg\", nodeArg] : []),\n lageServerBinPath,\n \"--tasks\",\n ...tasks,\n \"--host\",\n host,\n \"--port\",\n `${port}`,\n \"--timeout\",\n `${timeout}`,\n ...args,\n ];\n\n logger.info(`Launching lage-server with these parameters: ${lageServerArgs.join(\" \")}`);\n const child = execa(\"node\", 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","nodeArg","lockfilePath","path","join","info","ensurePidFile","releaseLock","lockfile","lock","stale","retries","factor","minTimeout","maxTimeout","randomize","pid","parseInt","fs","readFileSync","isServerRunning","isAlive","binScripts","getBinScripts","lageServerBinPath","lageServerArgs","child","execa","cwd","detached","stdio","maxBuffer","writeFileSync","toString","unref","existsSync","dirname","mkdirSync","recursive","fd","openSync","closeSync","process","kill"],"mappings":";;;;+BAkBsBA;;;eAAAA;;;2DAjBP;6DACE;uEACI;8DACH;6BACyB;;;;;;AAapC,eAAeA,yBAAyB,EAC7CC,MAAM,EACNC,IAAI,EACJC,IAAI,EACJC,IAAI,EACJC,KAAK,EACLC,OAAO,EACPC,IAAI,EACJC,OAAO,EACyB;IAChC,MAAMC,eAAeC,aAAI,CAACC,IAAI,CAACT,MAAM,CAAC,sCAAsC,EAAEC,KAAK,CAAC,EAAEC,KAAK,IAAI,CAAC;IAEhGH,OAAOW,IAAI,CAAC,CAAC,0BAA0B,EAAET,KAAK,CAAC,EAAEC,MAAM;IACvDH,OAAOW,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;IACvCtB,OAAOW,IAAI,CAAC,yCAAyC;QAAEW;QAAKI;IAAgB;IAC5E,IAAIJ,OAAOI,iBAAiB;QAC1B1B,OAAOW,IAAI,CAAC,0BAA0B;YAAEW;QAAI;IAC9C,OAAO;QACL,MAAMM,aAAaC,IAAAA,0BAAa;QAEhC,MAAMC,oBAAoBF,UAAU,CAAC,cAAc;QACnD,MAAMG,iBAAiB;eACjBxB,UAAU;gBAAC;gBAAcA;aAAQ,GAAG,EAAE;YAC1CuB;YACA;eACG1B;YACH;YACAF;YACA;YACA,GAAGC,MAAM;YACT;YACA,GAAGE,SAAS;eACTC;SACJ;QAEDN,OAAOW,IAAI,CAAC,CAAC,6CAA6C,EAAEoB,eAAerB,IAAI,CAAC,MAAM;QACtF,MAAMsB,QAAQC,IAAAA,cAAK,EAAC,QAAQF,gBAAgB;YAC1CG,KAAKjC;YACLkC,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;QACXxC,OAAOW,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"}
@@ -12,6 +12,7 @@ const _commander = require("commander");
12
12
  const _action = require("./action.js");
13
13
  const _addLoggerOptions = require("../addLoggerOptions.js");
14
14
  const serverCommand = new _commander.Command("server");
15
+ serverCommand.option("-n|--node-arg <arg>", "node argument to pass to worker, just a single string to be passed into node like a NODE_OPTIONS setting");
15
16
  serverCommand.option("-c|--concurrency <number>", "max jobs to run at a time", (v)=>parseInt(v));
16
17
  serverCommand.option("-h|--host <host>", "lage server host", "localhost");
17
18
  serverCommand.option("-p|--port <port>", "lage worker server port", (v)=>parseInt(v), 5332);
@@ -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));\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"}
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(\n \"-n|--node-arg <arg>\",\n \"node argument to pass to worker, just a single string to be passed into node like a NODE_OPTIONS setting\"\n);\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":";;;;+BAkBSA;;;eAAAA;;;2BAjBe;wBACK;kCACI;AAEjC,MAAMA,gBAAgB,IAAIC,kBAAO,CAAC;AAClCD,cAAcE,MAAM,CAClB,uBACA;AAEFF,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"}
@@ -14,8 +14,6 @@ const _workspacetools = require("workspace-tools");
14
14
  const _createTargetGraph = require("../run/createTargetGraph.js");
15
15
  const _workerthreadspool = require("@lage-run/worker-threads-pool");
16
16
  const _hasher = require("@lage-run/hasher");
17
- const _getOutputFiles = require("./getOutputFiles.js");
18
- const _globby = require("@lage-run/globby");
19
17
  const _MemoryStream = require("./MemoryStream.js");
20
18
  const _runnerPickerOptions = require("../../runnerPickerOptions.js");
21
19
  const _filterPipelineDefinitions = require("../run/filterPipelineDefinitions.js");
@@ -24,90 +22,91 @@ let initializedPromise;
24
22
  function formatBytes(bytes) {
25
23
  return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
26
24
  }
25
+ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }) {
26
+ if (initializedPromise) {
27
+ return initializedPromise;
28
+ }
29
+ const config = await (0, _config.getConfig)(cwd);
30
+ const root = (0, _workspacetools.getWorkspaceRoot)(cwd);
31
+ const maxWorkers = (0, _config.getConcurrency)(concurrency, config.concurrency);
32
+ logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(", ")}`);
33
+ const { pipeline } = config;
34
+ const packageInfos = (0, _workspacetools.getPackageInfos)(root);
35
+ const targetGraph = await (0, _createTargetGraph.createTargetGraph)({
36
+ logger,
37
+ root,
38
+ dependencies: false,
39
+ dependents: false,
40
+ ignore: [],
41
+ pipeline,
42
+ repoWideChanges: config.repoWideChanges,
43
+ scope: undefined,
44
+ since: undefined,
45
+ outputs: config.cacheOptions.outputGlob,
46
+ tasks,
47
+ packageInfos
48
+ });
49
+ const dependencyMap = (0, _workspacetools.createDependencyMap)(packageInfos, {
50
+ withDevDependencies: true,
51
+ withPeerDependencies: false
52
+ });
53
+ const packageTree = new _hasher.PackageTree({
54
+ root,
55
+ packageInfos,
56
+ includeUntracked: true
57
+ });
58
+ logger.info("Initializing Package Tree");
59
+ await packageTree.initialize();
60
+ const filteredPipeline = (0, _filterPipelineDefinitions.filterPipelineDefinitions)(targetGraph.targets.values(), config.pipeline);
61
+ const pool = new _workerthreadspool.AggregatedPool({
62
+ logger,
63
+ maxWorkersByGroup: new Map([
64
+ ...(0, _config.getMaxWorkersPerTask)(filteredPipeline, maxWorkers)
65
+ ]),
66
+ groupBy: ({ target })=>target.task,
67
+ maxWorkers,
68
+ script: require.resolve("./singleTargetWorker.js"),
69
+ workerOptions: {
70
+ stdout: true,
71
+ stderr: true,
72
+ workerData: {
73
+ runners: {
74
+ ...(0, _runnerPickerOptions.runnerPickerOptions)(nodeArg, config.npmClient, taskArgs),
75
+ ...config.runners,
76
+ shouldCache: false,
77
+ shouldResetCache: false
78
+ }
79
+ }
80
+ },
81
+ workerIdleMemoryLimit: config.workerIdleMemoryLimit
82
+ });
83
+ serverControls.abortController.signal.addEventListener("abort", ()=>{
84
+ pool?.close();
85
+ });
86
+ pool?.on("freedWorker", ()=>{
87
+ logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);
88
+ });
89
+ pool?.on("idle", ()=>{
90
+ logger.info("All workers are idle, shutting down after timeout");
91
+ serverControls.countdownToShutdown();
92
+ });
93
+ return {
94
+ config,
95
+ targetGraph,
96
+ packageTree,
97
+ dependencyMap,
98
+ root,
99
+ pool
100
+ };
101
+ }
27
102
  /**
28
103
  * Initializes the lageService: the extra "initializePromise" ensures only one initialization is done at a time across threads
29
104
  * @param cwd
30
105
  * @param logger
31
106
  * @returns
32
- */ async function initialize({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }) {
33
- async function createInitializedPromise() {
34
- if (initializedPromise) {
35
- return initializedPromise;
36
- }
37
- const config = await (0, _config.getConfig)(cwd);
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(", ")}`);
41
- const { pipeline } = config;
42
- const packageInfos = (0, _workspacetools.getPackageInfos)(root);
43
- const targetGraph = await (0, _createTargetGraph.createTargetGraph)({
44
- logger,
45
- root,
46
- dependencies: false,
47
- dependents: false,
48
- ignore: [],
49
- pipeline,
50
- repoWideChanges: config.repoWideChanges,
51
- scope: undefined,
52
- since: undefined,
53
- outputs: config.cacheOptions.outputGlob,
54
- tasks,
55
- packageInfos
56
- });
57
- const dependencyMap = (0, _workspacetools.createDependencyMap)(packageInfos, {
58
- withDevDependencies: true,
59
- withPeerDependencies: false
60
- });
61
- const packageTree = new _hasher.PackageTree({
62
- root,
63
- packageInfos,
64
- includeUntracked: true
65
- });
66
- logger.info("Initializing Package Tree");
67
- await packageTree.initialize();
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,
75
- maxWorkers,
76
- script: require.resolve("./singleTargetWorker.js"),
77
- workerOptions: {
78
- stdout: true,
79
- stderr: true,
80
- workerData: {
81
- runners: {
82
- ...(0, _runnerPickerOptions.runnerPickerOptions)(nodeArg, config.npmClient, taskArgs),
83
- ...config.runners,
84
- shouldCache: false,
85
- shouldResetCache: false
86
- }
87
- }
88
- }
89
- });
90
- serverControls.abortController.signal.addEventListener("abort", ()=>{
91
- pool?.close();
92
- });
93
- pool?.on("freedWorker", ()=>{
94
- logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);
95
- });
96
- pool?.on("idle", ()=>{
97
- logger.info("All workers are idle, shutting down after timeout");
98
- serverControls.countdownToShutdown();
99
- });
100
- return {
101
- config,
102
- targetGraph,
103
- packageTree,
104
- dependencyMap,
105
- root,
106
- pool
107
- };
108
- }
109
- initializedPromise = createInitializedPromise();
110
- return await initializedPromise;
107
+ */ async function initialize(options) {
108
+ initializedPromise = createInitializedPromise(options);
109
+ return initializedPromise;
111
110
  }
112
111
  async function createLageService({ cwd, serverControls, logger, concurrency, tasks }) {
113
112
  return {
@@ -117,6 +116,9 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
117
116
  };
118
117
  },
119
118
  async runTarget (request) {
119
+ if (global.gc) {
120
+ global.gc();
121
+ }
120
122
  serverControls.clearCountdown();
121
123
  // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call
122
124
  // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same
@@ -174,31 +176,35 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
174
176
  targetRun.status = "running";
175
177
  targetRun.startTime = process.hrtime();
176
178
  }, (worker)=>{
179
+ logger.info(`Max Worker Memory Usage: ${formatBytes(pool.stats().maxWorkerMemoryUsage)}`);
180
+ // logger.info the main process memory usage
181
+ const memoryUsage = process.memoryUsage();
182
+ logger.info(`Main Process Memory Usage: RSS: ${formatBytes(memoryUsage.rss)} Heap Total: ${formatBytes(memoryUsage.heapTotal)} Heap Used: ${formatBytes(memoryUsage.heapUsed)}`);
177
183
  targetRun.status = "success";
178
184
  targetRun.duration = (0, _formathrtime.hrtimeDiff)(targetRun.startTime, process.hrtime());
179
185
  logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} end: ${(0, _formathrtime.formatDuration)((0, _formathrtime.hrToSeconds)(targetRun.duration))}`);
180
186
  pipedStdout.unpipe(writableStdout);
181
187
  pipedStderr.unpipe(writableStderr);
182
188
  });
183
- const globalInputs = target.environmentGlob ? (0, _globby.glob)(target.environmentGlob, {
184
- cwd: root,
185
- gitignore: true
186
- }) : config.cacheOptions?.environmentGlob ? (0, _globby.glob)(config.cacheOptions?.environmentGlob, {
187
- cwd: root,
188
- gitignore: true
189
- }) : [
190
- "lage.config.js"
191
- ];
192
- const inputs = ((0, _hasher.getInputFiles)(target, dependencyMap, packageTree) ?? []).concat(globalInputs);
189
+ // const globalInputs = target.environmentGlob
190
+ // ? glob(target.environmentGlob, { cwd: root, gitignore: true })
191
+ // : config.cacheOptions?.environmentGlob
192
+ // ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })
193
+ // : ["lage.config.js"];
194
+ // const inputs = (getInputFiles(target, dependencyMap, packageTree) ?? []).concat(globalInputs);
193
195
  return {
194
196
  packageName: request.packageName,
195
197
  task: request.task,
196
198
  exitCode: 0,
197
199
  hash: "",
198
- inputs,
199
- outputs: (0, _getOutputFiles.getOutputFiles)(root, target, config.cacheOptions?.outputGlob, packageTree),
200
- stdout: writableStdout.toString(),
201
- stderr: writableStderr.toString(),
200
+ // inputs,
201
+ // outputs: getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree),
202
+ // stdout: writableStdout.toString(),
203
+ // stderr: writableStderr.toString(),
204
+ inputs: [],
205
+ outputs: [],
206
+ stdout: "",
207
+ stderr: "",
202
208
  id
203
209
  };
204
210
  } catch (e) {
@@ -1 +1 @@
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":"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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\nasync function createInitializedPromise({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }: InitializeOptions) {\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 workerIdleMemoryLimit: config.workerIdleMemoryLimit,\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/**\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(options: InitializeOptions): Promise<LageServiceContext> {\n initializedPromise = createInitializedPromise(options);\n return 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 if (global.gc) {\n global.gc();\n }\n\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 logger.info(`Max Worker Memory Usage: ${formatBytes(pool.stats().maxWorkerMemoryUsage)}`);\n\n // logger.info the main process memory usage\n const memoryUsage = process.memoryUsage();\n logger.info(\n `Main Process Memory Usage: RSS: ${formatBytes(memoryUsage.rss)} Heap Total: ${formatBytes(\n memoryUsage.heapTotal\n )} Heap Used: ${formatBytes(memoryUsage.heapUsed)}`\n );\n\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 inputs: [],\n outputs: [],\n stdout: \"\",\n stderr: \"\",\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","createInitializedPromise","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","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","initialize","filteredPipeline","filterPipelineDefinitions","targets","values","pool","AggregatedPool","maxWorkersByGroup","Map","getMaxWorkersPerTask","groupBy","target","task","script","require","resolve","workerOptions","stdout","stderr","workerData","runners","runnerPickerOptions","npmClient","shouldCache","shouldResetCache","workerIdleMemoryLimit","abortController","signal","addEventListener","close","on","silly","stats","maxWorkerMemoryUsage","countdownToShutdown","options","ping","pong","runTarget","request","global","gc","clearCountdown","nodeOptions","id","getTargetId","packageName","has","exitCode","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","targetRun","queueTime","process","hrtime","duration","startTime","status","threadId","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","hash","inputs","e","Error","toString"],"mappings":"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"}
@@ -2,3 +2,7 @@ export declare function getBinPaths(): {
2
2
  lage: string;
3
3
  "lage-server": string;
4
4
  };
5
+ export declare function getBinScripts(): {
6
+ lage: string;
7
+ "lage-server": string;
8
+ };
@@ -2,10 +2,18 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "getBinPaths", {
6
- enumerable: true,
7
- get: function() {
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ getBinPaths: function() {
8
13
  return getBinPaths;
14
+ },
15
+ getBinScripts: function() {
16
+ return getBinScripts;
9
17
  }
10
18
  });
11
19
  const _path = /*#__PURE__*/ _interop_require_default(require("path"));
@@ -44,3 +52,23 @@ function getBinPaths() {
44
52
  "lage-server": binPaths[1]
45
53
  };
46
54
  }
55
+ function getBinScripts() {
56
+ const thisPackageJsonPath = findUp("package.json", __dirname);
57
+ if (!thisPackageJsonPath) {
58
+ throw new Error("Could not find package.json of this packageF");
59
+ }
60
+ const thisPackagePath = _path.default.dirname(thisPackageJsonPath);
61
+ if (_fs.default.existsSync(_path.default.join(thisPackagePath, "dist", "lage.js"))) {
62
+ // the case for CLI package after build
63
+ return {
64
+ lage: _path.default.join(thisPackagePath, "dist", "lage.js"),
65
+ "lage-server": _path.default.join(thisPackagePath, "dist", "lage-server.js")
66
+ };
67
+ } else {
68
+ // the case for CLI package during development
69
+ return {
70
+ lage: _path.default.join(thisPackagePath, "bin", "lage.js"),
71
+ "lage-server": _path.default.join(thisPackagePath, "bin", "lage-server.js")
72
+ };
73
+ }
74
+ }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/getBinPaths.ts"],"sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport os from \"os\";\n\nfunction findUp(name: string, dir: string) {\n let currentDir = dir;\n while (currentDir !== \"/\") {\n const fullPath = path.join(currentDir, name);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n currentDir = path.dirname(currentDir);\n }\n return undefined;\n}\n\nexport function getBinPaths() {\n const bins = os.platform() === \"win32\" ? [\"lage.cmd\", \"lage-server.cmd\"] : [\"lage\", \"lage-server\"];\n const binPaths = bins.map((bin) => findUp(\"node_modules/.bin/\" + bin, __dirname));\n\n if (binPaths.some((binPath) => binPath === undefined)) {\n throw new Error(\"Could not find bin paths for lage or lage-server\");\n }\n\n return { lage: binPaths[0]!, \"lage-server\": binPaths[1]! };\n}\n"],"names":["getBinPaths","findUp","name","dir","currentDir","fullPath","path","join","fs","existsSync","dirname","undefined","bins","os","platform","binPaths","map","bin","__dirname","some","binPath","Error","lage"],"mappings":";;;;+BAgBgBA;;;eAAAA;;;6DAhBC;2DACF;2DACA;;;;;;AAEf,SAASC,OAAOC,IAAY,EAAEC,GAAW;IACvC,IAAIC,aAAaD;IACjB,MAAOC,eAAe,IAAK;QACzB,MAAMC,WAAWC,aAAI,CAACC,IAAI,CAACH,YAAYF;QACvC,IAAIM,WAAE,CAACC,UAAU,CAACJ,WAAW;YAC3B,OAAOA;QACT;QACAD,aAAaE,aAAI,CAACI,OAAO,CAACN;IAC5B;IACA,OAAOO;AACT;AAEO,SAASX;IACd,MAAMY,OAAOC,WAAE,CAACC,QAAQ,OAAO,UAAU;QAAC;QAAY;KAAkB,GAAG;QAAC;QAAQ;KAAc;IAClG,MAAMC,WAAWH,KAAKI,GAAG,CAAC,CAACC,MAAQhB,OAAO,uBAAuBgB,KAAKC;IAEtE,IAAIH,SAASI,IAAI,CAAC,CAACC,UAAYA,YAAYT,YAAY;QACrD,MAAM,IAAIU,MAAM;IAClB;IAEA,OAAO;QAAEC,MAAMP,QAAQ,CAAC,EAAE;QAAG,eAAeA,QAAQ,CAAC,EAAE;IAAE;AAC3D"}
1
+ {"version":3,"sources":["../src/getBinPaths.ts"],"sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport os from \"os\";\n\nfunction findUp(name: string, dir: string) {\n let currentDir = dir;\n while (currentDir !== \"/\") {\n const fullPath = path.join(currentDir, name);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n currentDir = path.dirname(currentDir);\n }\n return undefined;\n}\n\nexport function getBinPaths() {\n const bins = os.platform() === \"win32\" ? [\"lage.cmd\", \"lage-server.cmd\"] : [\"lage\", \"lage-server\"];\n const binPaths = bins.map((bin) => findUp(\"node_modules/.bin/\" + bin, __dirname));\n\n if (binPaths.some((binPath) => binPath === undefined)) {\n throw new Error(\"Could not find bin paths for lage or lage-server\");\n }\n\n return { lage: binPaths[0]!, \"lage-server\": binPaths[1]! };\n}\n\nexport function getBinScripts() {\n const thisPackageJsonPath = findUp(\"package.json\", __dirname);\n\n if (!thisPackageJsonPath) {\n throw new Error(\"Could not find package.json of this packageF\");\n }\n\n const thisPackagePath = path.dirname(thisPackageJsonPath);\n\n if (fs.existsSync(path.join(thisPackagePath, \"dist\", \"lage.js\"))) {\n // the case for CLI package after build\n return {\n lage: path.join(thisPackagePath, \"dist\", \"lage.js\"),\n \"lage-server\": path.join(thisPackagePath, \"dist\", \"lage-server.js\"),\n };\n } else {\n // the case for CLI package during development\n return {\n lage: path.join(thisPackagePath, \"bin\", \"lage.js\"),\n \"lage-server\": path.join(thisPackagePath, \"bin\", \"lage-server.js\"),\n };\n }\n}\n"],"names":["getBinPaths","getBinScripts","findUp","name","dir","currentDir","fullPath","path","join","fs","existsSync","dirname","undefined","bins","os","platform","binPaths","map","bin","__dirname","some","binPath","Error","lage","thisPackageJsonPath","thisPackagePath"],"mappings":";;;;;;;;;;;IAgBgBA,WAAW;eAAXA;;IAWAC,aAAa;eAAbA;;;6DA3BC;2DACF;2DACA;;;;;;AAEf,SAASC,OAAOC,IAAY,EAAEC,GAAW;IACvC,IAAIC,aAAaD;IACjB,MAAOC,eAAe,IAAK;QACzB,MAAMC,WAAWC,aAAI,CAACC,IAAI,CAACH,YAAYF;QACvC,IAAIM,WAAE,CAACC,UAAU,CAACJ,WAAW;YAC3B,OAAOA;QACT;QACAD,aAAaE,aAAI,CAACI,OAAO,CAACN;IAC5B;IACA,OAAOO;AACT;AAEO,SAASZ;IACd,MAAMa,OAAOC,WAAE,CAACC,QAAQ,OAAO,UAAU;QAAC;QAAY;KAAkB,GAAG;QAAC;QAAQ;KAAc;IAClG,MAAMC,WAAWH,KAAKI,GAAG,CAAC,CAACC,MAAQhB,OAAO,uBAAuBgB,KAAKC;IAEtE,IAAIH,SAASI,IAAI,CAAC,CAACC,UAAYA,YAAYT,YAAY;QACrD,MAAM,IAAIU,MAAM;IAClB;IAEA,OAAO;QAAEC,MAAMP,QAAQ,CAAC,EAAE;QAAG,eAAeA,QAAQ,CAAC,EAAE;IAAE;AAC3D;AAEO,SAASf;IACd,MAAMuB,sBAAsBtB,OAAO,gBAAgBiB;IAEnD,IAAI,CAACK,qBAAqB;QACxB,MAAM,IAAIF,MAAM;IAClB;IAEA,MAAMG,kBAAkBlB,aAAI,CAACI,OAAO,CAACa;IAErC,IAAIf,WAAE,CAACC,UAAU,CAACH,aAAI,CAACC,IAAI,CAACiB,iBAAiB,QAAQ,aAAa;QAChE,uCAAuC;QACvC,OAAO;YACLF,MAAMhB,aAAI,CAACC,IAAI,CAACiB,iBAAiB,QAAQ;YACzC,eAAelB,aAAI,CAACC,IAAI,CAACiB,iBAAiB,QAAQ;QACpD;IACF,OAAO;QACL,8CAA8C;QAC9C,OAAO;YACLF,MAAMhB,aAAI,CAACC,IAAI,CAACiB,iBAAiB,OAAO;YACxC,eAAelB,aAAI,CAACC,IAAI,CAACiB,iBAAiB,OAAO;QACnD;IACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lage-run/cli",
3
- "version": "0.24.5",
3
+ "version": "0.24.6",
4
4
  "description": "Command Line Interface for Lage",
5
5
  "repository": {
6
6
  "type": "git",
@@ -30,10 +30,10 @@
30
30
  "@lage-run/reporters": "^1.2.18",
31
31
  "@lage-run/rpc": "^1.2.3",
32
32
  "@lage-run/runners": "^1.2.0",
33
- "@lage-run/scheduler": "^1.4.1",
33
+ "@lage-run/scheduler": "^1.4.2",
34
34
  "@lage-run/scheduler-types": "^0.3.22",
35
35
  "@lage-run/target-graph": "^0.11.0",
36
- "@lage-run/worker-threads-pool": "^0.8.5",
36
+ "@lage-run/worker-threads-pool": "^0.8.6",
37
37
  "chokidar": "3.5.3",
38
38
  "commander": "9.5.0",
39
39
  "execa": "5.1.1",