@lage-run/cli 0.25.3 → 0.25.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,21 +2,27 @@
2
2
  "name": "@lage-run/cli",
3
3
  "entries": [
4
4
  {
5
- "date": "Fri, 07 Feb 2025 19:44:21 GMT",
6
- "version": "0.25.3",
7
- "tag": "@lage-run/cli_v0.25.3",
5
+ "date": "Mon, 10 Feb 2025 00:22:13 GMT",
6
+ "version": "0.25.5",
7
+ "tag": "@lage-run/cli_v0.25.5",
8
8
  "comments": {
9
9
  "patch": [
10
10
  {
11
11
  "author": "kchau@microsoft.com",
12
12
  "package": "@lage-run/cli",
13
- "commit": "0f5a0dc74f6515366af3b53113f893b9c5ca98e0",
13
+ "commit": "8a6b737e047d90594e524bcce458d2ed3cac74e4",
14
14
  "comment": "tracks the transitive inputs rather just one level deep"
15
15
  },
16
+ {
17
+ "author": "kchau@microsoft.com",
18
+ "package": "@lage-run/cli",
19
+ "commit": "8a6b737e047d90594e524bcce458d2ed3cac74e4",
20
+ "comment": "simulate transitives by doing our own hashing"
21
+ },
16
22
  {
17
23
  "author": "beachball",
18
24
  "package": "@lage-run/cli",
19
- "comment": "Bump @lage-run/rpc to v1.2.4",
25
+ "comment": "Bump @lage-run/rpc to v1.2.6",
20
26
  "commit": "not available"
21
27
  }
22
28
  ]
package/CHANGELOG.md CHANGED
@@ -1,17 +1,18 @@
1
1
  # Change Log - @lage-run/cli
2
2
 
3
- <!-- This log was last generated on Fri, 07 Feb 2025 19:44:21 GMT and should not be manually modified. -->
3
+ <!-- This log was last generated on Mon, 10 Feb 2025 00:22:13 GMT and should not be manually modified. -->
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
- ## 0.25.3
7
+ ## 0.25.5
8
8
 
9
- Fri, 07 Feb 2025 19:44:21 GMT
9
+ Mon, 10 Feb 2025 00:22:13 GMT
10
10
 
11
11
  ### Patches
12
12
 
13
13
  - tracks the transitive inputs rather just one level deep (kchau@microsoft.com)
14
- - Bump @lage-run/rpc to v1.2.4
14
+ - simulate transitives by doing our own hashing (kchau@microsoft.com)
15
+ - Bump @lage-run/rpc to v1.2.6
15
16
 
16
17
  ## 0.25.2
17
18
 
@@ -23,13 +23,21 @@ async function simulateFileAccess(logger, inputs, outputs) {
23
23
  // probe input files
24
24
  let fd;
25
25
  for (const input of inputs){
26
- fd = _fs.default.openSync(_path.default.join(root, input), "r");
27
- _fs.default.closeSync(fd);
26
+ try {
27
+ fd = _fs.default.openSync(_path.default.join(root, input), "r");
28
+ _fs.default.closeSync(fd);
29
+ } catch (e) {
30
+ // ignore
31
+ }
28
32
  inputDirectories.add(_path.default.dirname(input));
29
33
  }
30
34
  for (const directory of inputDirectories){
31
- fd = _fs.default.openSync(_path.default.join(root, directory), "r");
32
- _fs.default.closeSync(fd);
35
+ try {
36
+ fd = _fs.default.openSync(_path.default.join(root, directory), "r");
37
+ _fs.default.closeSync(fd);
38
+ } catch (e) {
39
+ // ignore
40
+ }
33
41
  }
34
42
  // touch output files
35
43
  const time = new Date();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/exec/simulateFileAccess.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { getWorkspaceRoot } from \"workspace-tools\";\n\nexport async function simulateFileAccess(logger: Logger, inputs: string[], outputs: string[]) {\n const root = getWorkspaceRoot(process.cwd())!;\n logger.silly(\"Now probing and touching inputs and outputs\");\n\n const inputDirectories = new Set<string>();\n\n // probe input files\n let fd: number;\n for (const input of inputs) {\n fd = fs.openSync(path.join(root, input), \"r\");\n fs.closeSync(fd);\n\n inputDirectories.add(path.dirname(input));\n }\n\n for (const directory of inputDirectories) {\n fd = fs.openSync(path.join(root, directory), \"r\");\n fs.closeSync(fd);\n }\n\n // touch output files\n const time = new Date();\n const outputDirectories = new Set<string>();\n for (const output of outputs) {\n outputDirectories.add(path.dirname(output));\n\n try {\n fs.utimesSync(path.join(root, output), time, time);\n } catch (e) {\n // ignore\n }\n }\n\n for (const directory of outputDirectories) {\n try {\n fs.utimesSync(path.join(root, directory), time, time);\n } catch (e) {\n // ignore\n }\n }\n}\n"],"names":["simulateFileAccess","logger","inputs","outputs","root","getWorkspaceRoot","process","cwd","silly","inputDirectories","Set","fd","input","fs","openSync","path","join","closeSync","add","dirname","directory","time","Date","outputDirectories","output","utimesSync","e"],"mappings":";;;;+BAKsBA;;;eAAAA;;;6DAJL;2DACF;gCACkB;;;;;;AAE1B,eAAeA,mBAAmBC,MAAc,EAAEC,MAAgB,EAAEC,OAAiB;IAC1F,MAAMC,OAAOC,IAAAA,gCAAgB,EAACC,QAAQC,GAAG;IACzCN,OAAOO,KAAK,CAAC;IAEb,MAAMC,mBAAmB,IAAIC;IAE7B,oBAAoB;IACpB,IAAIC;IACJ,KAAK,MAAMC,SAASV,OAAQ;QAC1BS,KAAKE,WAAE,CAACC,QAAQ,CAACC,aAAI,CAACC,IAAI,CAACZ,MAAMQ,QAAQ;QACzCC,WAAE,CAACI,SAAS,CAACN;QAEbF,iBAAiBS,GAAG,CAACH,aAAI,CAACI,OAAO,CAACP;IACpC;IAEA,KAAK,MAAMQ,aAAaX,iBAAkB;QACxCE,KAAKE,WAAE,CAACC,QAAQ,CAACC,aAAI,CAACC,IAAI,CAACZ,MAAMgB,YAAY;QAC7CP,WAAE,CAACI,SAAS,CAACN;IACf;IAEA,qBAAqB;IACrB,MAAMU,OAAO,IAAIC;IACjB,MAAMC,oBAAoB,IAAIb;IAC9B,KAAK,MAAMc,UAAUrB,QAAS;QAC5BoB,kBAAkBL,GAAG,CAACH,aAAI,CAACI,OAAO,CAACK;QAEnC,IAAI;YACFX,WAAE,CAACY,UAAU,CAACV,aAAI,CAACC,IAAI,CAACZ,MAAMoB,SAASH,MAAMA;QAC/C,EAAE,OAAOK,GAAG;QACV,SAAS;QACX;IACF;IAEA,KAAK,MAAMN,aAAaG,kBAAmB;QACzC,IAAI;YACFV,WAAE,CAACY,UAAU,CAACV,aAAI,CAACC,IAAI,CAACZ,MAAMgB,YAAYC,MAAMA;QAClD,EAAE,OAAOK,GAAG;QACV,SAAS;QACX;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/exec/simulateFileAccess.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { getWorkspaceRoot } from \"workspace-tools\";\n\nexport async function simulateFileAccess(logger: Logger, inputs: string[], outputs: string[]) {\n const root = getWorkspaceRoot(process.cwd())!;\n logger.silly(\"Now probing and touching inputs and outputs\");\n\n const inputDirectories = new Set<string>();\n\n // probe input files\n let fd: number;\n for (const input of inputs) {\n try {\n fd = fs.openSync(path.join(root, input), \"r\");\n fs.closeSync(fd);\n } catch (e) {\n // ignore\n }\n\n inputDirectories.add(path.dirname(input));\n }\n\n for (const directory of inputDirectories) {\n try {\n fd = fs.openSync(path.join(root, directory), \"r\");\n fs.closeSync(fd);\n } catch (e) {\n // ignore\n }\n }\n\n // touch output files\n const time = new Date();\n const outputDirectories = new Set<string>();\n for (const output of outputs) {\n outputDirectories.add(path.dirname(output));\n\n try {\n fs.utimesSync(path.join(root, output), time, time);\n } catch (e) {\n // ignore\n }\n }\n\n for (const directory of outputDirectories) {\n try {\n fs.utimesSync(path.join(root, directory), time, time);\n } catch (e) {\n // ignore\n }\n }\n}\n"],"names":["simulateFileAccess","logger","inputs","outputs","root","getWorkspaceRoot","process","cwd","silly","inputDirectories","Set","fd","input","fs","openSync","path","join","closeSync","e","add","dirname","directory","time","Date","outputDirectories","output","utimesSync"],"mappings":";;;;+BAKsBA;;;eAAAA;;;6DAJL;2DACF;gCACkB;;;;;;AAE1B,eAAeA,mBAAmBC,MAAc,EAAEC,MAAgB,EAAEC,OAAiB;IAC1F,MAAMC,OAAOC,IAAAA,gCAAgB,EAACC,QAAQC,GAAG;IACzCN,OAAOO,KAAK,CAAC;IAEb,MAAMC,mBAAmB,IAAIC;IAE7B,oBAAoB;IACpB,IAAIC;IACJ,KAAK,MAAMC,SAASV,OAAQ;QAC1B,IAAI;YACFS,KAAKE,WAAE,CAACC,QAAQ,CAACC,aAAI,CAACC,IAAI,CAACZ,MAAMQ,QAAQ;YACzCC,WAAE,CAACI,SAAS,CAACN;QACf,EAAE,OAAOO,GAAG;QACV,SAAS;QACX;QAEAT,iBAAiBU,GAAG,CAACJ,aAAI,CAACK,OAAO,CAACR;IACpC;IAEA,KAAK,MAAMS,aAAaZ,iBAAkB;QACxC,IAAI;YACFE,KAAKE,WAAE,CAACC,QAAQ,CAACC,aAAI,CAACC,IAAI,CAACZ,MAAMiB,YAAY;YAC7CR,WAAE,CAACI,SAAS,CAACN;QACf,EAAE,OAAOO,GAAG;QACV,SAAS;QACX;IACF;IAEA,qBAAqB;IACrB,MAAMI,OAAO,IAAIC;IACjB,MAAMC,oBAAoB,IAAId;IAC9B,KAAK,MAAMe,UAAUtB,QAAS;QAC5BqB,kBAAkBL,GAAG,CAACJ,aAAI,CAACK,OAAO,CAACK;QAEnC,IAAI;YACFZ,WAAE,CAACa,UAAU,CAACX,aAAI,CAACC,IAAI,CAACZ,MAAMqB,SAASH,MAAMA;QAC/C,EAAE,OAAOJ,GAAG;QACV,SAAS;QACX;IACF;IAEA,KAAK,MAAMG,aAAaG,kBAAmB;QACzC,IAAI;YACFX,WAAE,CAACa,UAAU,CAACX,aAAI,CAACC,IAAI,CAACZ,MAAMiB,YAAYC,MAAMA;QAClD,EAAE,OAAOJ,GAAG;QACV,SAAS;QACX;IACF;AACF"}
@@ -32,7 +32,7 @@ async function serverAction(options) {
32
32
  cwd: process.cwd(),
33
33
  serverControls: {
34
34
  abortController,
35
- countdownToShutdown: ()=>resetTimer(logger, timeout, abortController, server),
35
+ countdownToShutdown: ()=>resetTimer(logger, timeout, abortController, lageServer),
36
36
  clearCountdown: clearTimer
37
37
  },
38
38
  logger,
@@ -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\";\nimport { parseServerOption } from \"../parseServerOption.js\";\n\ninterface WorkerOptions extends ReporterInitOptions {\n nodeArg?: string[];\n server?: string;\n timeout?: number;\n shutdown: boolean;\n tasks: string[];\n}\n\nexport async function serverAction(options: WorkerOptions) {\n const { server = \"localhost:5332\", timeout = 1, tasks } = options;\n\n const { host, port } = parseServerOption(server);\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 lageServer = await createServer(lageService, abortController);\n\n await lageServer.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","server","timeout","tasks","host","port","parseServerOption","logger","createLogger","logLevel","logFile","reporter","initializeReporters","info","abortController","AbortController","lageService","createLageService","cwd","process","serverControls","countdownToShutdown","resetTimer","clearCountdown","clearTimer","concurrency","lageServer","createServer","listen","timeoutHandle","globalThis","setTimeout","abort","close","clearTimeout"],"mappings":";;;;+BAesBA;;;eAAAA;;;+DAfoB;qCAEN;6BACF;qBACL;mCACK;;;;;;AAU3B,eAAeA,aAAaC,OAAsB;IACvD,MAAM,EAAEC,SAAS,gBAAgB,EAAEC,UAAU,CAAC,EAAEC,KAAK,EAAE,GAAGH;IAE1D,MAAM,EAAEI,IAAI,EAAEC,IAAI,EAAE,GAAGC,IAAAA,oCAAiB,EAACL;IAEzC,MAAMM,SAASC,IAAAA,eAAY;IAC3BR,QAAQS,QAAQ,GAAGT,QAAQS,QAAQ,IAAI;IACvCT,QAAQU,OAAO,GAAGV,QAAQU,OAAO,IAAI;IACrCV,QAAQW,QAAQ,GAAGX,QAAQW,QAAQ,IAAI;IACvCC,IAAAA,wCAAmB,EAACL,QAAQP;IAE5BO,OAAOM,IAAI,CAAC,CAAC,0BAA0B,EAAET,KAAK,CAAC,EAAEC,MAAM;IAEvD,MAAMS,kBAAkB,IAAIC;IAE5B,MAAMC,cAAc,MAAMC,IAAAA,8BAAiB,EAAC;QAC1CC,KAAKC,QAAQD,GAAG;QAChBE,gBAAgB;YACdN;YACAO,qBAAqB,IAAMC,WAAWf,QAAQL,SAASY,iBAAiBb;YACxEsB,gBAAgBC;QAClB;QACAjB;QACAkB,aAAazB,QAAQyB,WAAW;QAChCtB;IACF;IACA,MAAMuB,aAAa,MAAMC,IAAAA,iBAAY,EAACX,aAAaF;IAEnD,MAAMY,WAAWE,MAAM,CAAC;QAAExB;QAAMC;IAAK;IACrCE,OAAOM,IAAI,CAAC,CAAC,2BAA2B,EAAET,KAAK,CAAC,EAAEC,KAAK,aAAa,EAAEH,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAI2B;AACJ,SAASP,WAAWf,MAAc,EAAEL,OAAe,EAAEY,eAAgC,EAAEb,MAAW;IAChGuB;IAEAK,gBAAgBC,WAAWC,UAAU,CAAC;QACpCxB,OAAOM,IAAI,CAAC,CAAC,uBAAuB,EAAEX,QAAQ,QAAQ,CAAC;QACvDY,gBAAgBkB,KAAK;QACrB/B,OAAOgC,KAAK;IACd,GAAG/B,UAAU;AACf;AAEA,SAASsB;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\";\nimport { parseServerOption } from \"../parseServerOption.js\";\n\ninterface WorkerOptions extends ReporterInitOptions {\n nodeArg?: string[];\n server?: string;\n timeout?: number;\n shutdown: boolean;\n tasks: string[];\n}\n\nexport async function serverAction(options: WorkerOptions) {\n const { server = \"localhost:5332\", timeout = 1, tasks } = options;\n\n const { host, port } = parseServerOption(server);\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, lageServer),\n clearCountdown: clearTimer,\n },\n logger,\n concurrency: options.concurrency,\n tasks,\n });\n const lageServer = await createServer(lageService, abortController);\n\n await lageServer.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","server","timeout","tasks","host","port","parseServerOption","logger","createLogger","logLevel","logFile","reporter","initializeReporters","info","abortController","AbortController","lageService","createLageService","cwd","process","serverControls","countdownToShutdown","resetTimer","lageServer","clearCountdown","clearTimer","concurrency","createServer","listen","timeoutHandle","globalThis","setTimeout","abort","close","clearTimeout"],"mappings":";;;;+BAesBA;;;eAAAA;;;+DAfoB;qCAEN;6BACF;qBACL;mCACK;;;;;;AAU3B,eAAeA,aAAaC,OAAsB;IACvD,MAAM,EAAEC,SAAS,gBAAgB,EAAEC,UAAU,CAAC,EAAEC,KAAK,EAAE,GAAGH;IAE1D,MAAM,EAAEI,IAAI,EAAEC,IAAI,EAAE,GAAGC,IAAAA,oCAAiB,EAACL;IAEzC,MAAMM,SAASC,IAAAA,eAAY;IAC3BR,QAAQS,QAAQ,GAAGT,QAAQS,QAAQ,IAAI;IACvCT,QAAQU,OAAO,GAAGV,QAAQU,OAAO,IAAI;IACrCV,QAAQW,QAAQ,GAAGX,QAAQW,QAAQ,IAAI;IACvCC,IAAAA,wCAAmB,EAACL,QAAQP;IAE5BO,OAAOM,IAAI,CAAC,CAAC,0BAA0B,EAAET,KAAK,CAAC,EAAEC,MAAM;IAEvD,MAAMS,kBAAkB,IAAIC;IAE5B,MAAMC,cAAc,MAAMC,IAAAA,8BAAiB,EAAC;QAC1CC,KAAKC,QAAQD,GAAG;QAChBE,gBAAgB;YACdN;YACAO,qBAAqB,IAAMC,WAAWf,QAAQL,SAASY,iBAAiBS;YACxEC,gBAAgBC;QAClB;QACAlB;QACAmB,aAAa1B,QAAQ0B,WAAW;QAChCvB;IACF;IACA,MAAMoB,aAAa,MAAMI,IAAAA,iBAAY,EAACX,aAAaF;IAEnD,MAAMS,WAAWK,MAAM,CAAC;QAAExB;QAAMC;IAAK;IACrCE,OAAOM,IAAI,CAAC,CAAC,2BAA2B,EAAET,KAAK,CAAC,EAAEC,KAAK,aAAa,EAAEH,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAI2B;AACJ,SAASP,WAAWf,MAAc,EAAEL,OAAe,EAAEY,eAAgC,EAAEb,MAAW;IAChGwB;IAEAI,gBAAgBC,WAAWC,UAAU,CAAC;QACpCxB,OAAOM,IAAI,CAAC,CAAC,uBAAuB,EAAEX,QAAQ,QAAQ,CAAC;QACvDY,gBAAgBkB,KAAK;QACrB/B,OAAOgC,KAAK;IACd,GAAG/B,UAAU;AACf;AAEA,SAASuB;IACP,IAAII,eAAe;QACjBC,WAAWI,YAAY,CAACL;IAC1B;AACF"}
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import type { Logger } from "@lage-run/logger";
3
- import type { ILageService } from "@lage-run/rpc";
3
+ import { type ILageService } from "@lage-run/rpc";
4
4
  interface ServiceControls {
5
5
  abortController: AbortController;
6
6
  countdownToShutdown: () => void;
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "createLageService", {
9
9
  }
10
10
  });
11
11
  const _config = require("@lage-run/config");
12
+ const _rpc = require("@lage-run/rpc");
12
13
  const _targetgraph = require("@lage-run/target-graph");
13
14
  const _workspacetools = require("workspace-tools");
14
15
  const _createTargetGraph = require("../run/createTargetGraph.js");
@@ -20,7 +21,13 @@ const _MemoryStream = require("./MemoryStream.js");
20
21
  const _runnerPickerOptions = require("../../runnerPickerOptions.js");
21
22
  const _filterPipelineDefinitions = require("../run/filterPipelineDefinitions.js");
22
23
  const _formathrtime = require("@lage-run/format-hrtime");
23
- const _getTransitiveTargetInputs = require("./getTransitiveTargetInputs.js");
24
+ const _path = /*#__PURE__*/ _interop_require_default(require("path"));
25
+ const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
26
+ function _interop_require_default(obj) {
27
+ return obj && obj.__esModule ? obj : {
28
+ default: obj
29
+ };
30
+ }
24
31
  let initializedPromise;
25
32
  function formatBytes(bytes) {
26
33
  return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
@@ -35,6 +42,7 @@ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg,
35
42
  logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(", ")}`);
36
43
  const { pipeline } = config;
37
44
  const packageInfos = (0, _workspacetools.getPackageInfos)(root);
45
+ logger.info("Initializing target graph");
38
46
  const targetGraph = await (0, _createTargetGraph.createTargetGraph)({
39
47
  logger,
40
48
  root,
@@ -50,17 +58,18 @@ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg,
50
58
  packageInfos,
51
59
  priorities: config.priorities
52
60
  });
53
- const dependencyMap = (0, _workspacetools.createDependencyMap)(packageInfos, {
54
- withDevDependencies: true,
55
- withPeerDependencies: false
56
- });
57
- const packageTree = new _hasher.PackageTree({
61
+ const targetHasher = new _hasher.TargetHasher({
58
62
  root,
59
- packageInfos,
60
- includeUntracked: true
63
+ environmentGlob: config.cacheOptions?.environmentGlob ?? [],
64
+ logger,
65
+ cacheKey: config.cacheOptions?.cacheKey,
66
+ cliArgs: taskArgs
61
67
  });
62
- logger.info("Initializing Package Tree");
63
- await packageTree.initialize();
68
+ logger.info("Initializing hasher");
69
+ await targetHasher.initialize();
70
+ logger.info("Initializing dependency map");
71
+ const packageTree = targetHasher.packageTree;
72
+ const dependencyMap = targetHasher.dependencyMap;
64
73
  const filteredPipeline = (0, _filterPipelineDefinitions.filterPipelineDefinitions)(targetGraph.targets.values(), config.pipeline);
65
74
  logger.info("Initializing Pool");
66
75
  const pool = new _workerthreadspool.AggregatedPool({
@@ -110,7 +119,8 @@ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg,
110
119
  dependencyMap,
111
120
  root,
112
121
  pool,
113
- globalInputs
122
+ globalInputs,
123
+ targetHasher
114
124
  };
115
125
  }
116
126
  /**
@@ -122,6 +132,9 @@ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg,
122
132
  initializedPromise = createInitializedPromise(options);
123
133
  return initializedPromise;
124
134
  }
135
+ function getHashFilePath(target) {
136
+ return _path.default.join(`node_modules/.lage/hash_${target.task}`);
137
+ }
125
138
  async function createLageService({ cwd, serverControls, logger, concurrency, tasks }) {
126
139
  return {
127
140
  async ping () {
@@ -137,7 +150,7 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
137
150
  // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call
138
151
  // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same
139
152
  // `lage info` call
140
- const { config, targetGraph, dependencyMap, packageTree, root, pool, globalInputs } = await initialize({
153
+ const { config, targetGraph, dependencyMap, packageTree, root, pool, globalInputs, targetHasher } = await initialize({
141
154
  cwd,
142
155
  logger,
143
156
  nodeArg: request.nodeOptions,
@@ -156,6 +169,7 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
156
169
  exitCode: 1
157
170
  };
158
171
  }
172
+ logger.info(`Running target: ${request.packageName}#${request.task}`);
159
173
  const target = targetGraph.targets.get(id);
160
174
  const task = {
161
175
  target,
@@ -183,8 +197,27 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
183
197
  cwd: root,
184
198
  gitignore: true
185
199
  }) : globalInputs;
186
- const inputs = (0, _getTransitiveTargetInputs.getTransitiveTargetInputs)(target, targetGraph, dependencyMap, packageTree);
187
200
  let results;
201
+ const inputs = (0, _hasher.getInputFiles)(target, dependencyMap, packageTree);
202
+ for (const dep of target.dependencies){
203
+ if (dep === (0, _targetgraph.getStartTargetId)()) {
204
+ continue;
205
+ }
206
+ const depTarget = targetGraph.targets.get(dep);
207
+ inputs.push(_path.default.join(_path.default.relative(root, depTarget.cwd), getHashFilePath(depTarget)).replace(/\\/g, "/"));
208
+ }
209
+ const targetHashFile = getHashFilePath(target);
210
+ const targetHashFullPath = _path.default.join(target.cwd, targetHashFile);
211
+ try {
212
+ if (!_fs.default.existsSync(_path.default.dirname(targetHashFullPath))) {
213
+ _fs.default.mkdirSync(_path.default.dirname(targetHashFullPath), {
214
+ recursive: true
215
+ });
216
+ }
217
+ _fs.default.writeFileSync(targetHashFullPath, await targetHasher.hash(target));
218
+ } catch (e) {
219
+ throw new _rpc.ConnectError(`Error writing target hash file: ${targetHashFullPath}`, _rpc.Code.Internal);
220
+ }
188
221
  try {
189
222
  await pool.exec(task, 0, (worker, stdout, stderr)=>{
190
223
  logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);
@@ -207,6 +240,7 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
207
240
  pipedStderr.unpipe(writableStderr);
208
241
  });
209
242
  const outputs = (0, _getOutputFiles.getOutputFiles)(root, target, config.cacheOptions?.outputGlob, packageTree);
243
+ outputs.push(targetHashFile);
210
244
  results = {
211
245
  packageName: request.packageName,
212
246
  task: request.task,
@@ -220,6 +254,9 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
220
254
  };
221
255
  } catch (e) {
222
256
  const outputs = (0, _getOutputFiles.getOutputFiles)(root, target, config.cacheOptions?.outputGlob, packageTree);
257
+ outputs.push(targetHashFile);
258
+ targetRun.status = "failed";
259
+ targetRun.duration = (0, _formathrtime.hrtimeDiff)(targetRun.startTime, process.hrtime());
223
260
  results = {
224
261
  packageName: request.packageName,
225
262
  task: request.task,
@@ -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 { getStartTargetId, getTargetId, type Target, 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\";\nimport { getTransitiveTargetInputs } from \"./getTransitiveTargetInputs.js\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n globalInputs: string[];\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 priorities: config.priorities,\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 logger.info(\"Initializing Pool\");\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 const globalInputs = config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n\n logger.info(`Environment glob inputs: \\n${JSON.stringify(globalInputs)}\\n-------`);\n\n logger.info(\"done initializing\");\n return { config, targetGraph, packageTree, dependencyMap, root, pool, globalInputs };\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, globalInputs } = 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 const targetGlobalInputs = target.environmentGlob ? glob(target.environmentGlob, { cwd: root, gitignore: true }) : globalInputs;\n\n const inputs = getTransitiveTargetInputs(target, targetGraph, dependencyMap, packageTree);\n\n let results: {\n packageName?: string;\n task: string;\n exitCode: number;\n inputs: string[];\n outputs: string[];\n stdout: string;\n stderr: string;\n id: string;\n globalInputs: string[];\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 outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n globalInputs: targetGlobalInputs,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n globalInputs: targetGlobalInputs,\n };\n }\n\n logger.info(\n `${request.packageName}#${request.task} results: \\n${JSON.stringify(\n {\n packageName: results.packageName,\n task: results.task,\n exitCode: results.exitCode,\n inputs: results.inputs,\n outputs: results.outputs,\n id: results.id,\n globalInputs: `(${target.environmentGlob ? \"custom target env glob used\" : \"general global inputs used\"}): ${\n results.globalInputs.length\n } files`,\n },\n null,\n 2\n )}\\n------`,\n results\n );\n\n return results;\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","priorities","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","globalInputs","environmentGlob","glob","gitignore","JSON","stringify","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","targetGlobalInputs","inputs","getTransitiveTargetInputs","results","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","toString","e","Error","length"],"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 { ConnectError, Code, type ILageService } from \"@lage-run/rpc\";\nimport { getStartTargetId, getTargetId, type Target, 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, type PackageTree, TargetHasher } from \"@lage-run/hasher\";\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\";\nimport path from \"path\";\nimport fs from \"fs\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n globalInputs: string[];\n targetHasher: TargetHasher;\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 logger.info(\"Initializing target graph\");\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 priorities: config.priorities,\n });\n\n const targetHasher = new TargetHasher({\n root,\n environmentGlob: config.cacheOptions?.environmentGlob ?? [],\n logger,\n cacheKey: config.cacheOptions?.cacheKey,\n cliArgs: taskArgs,\n });\n\n logger.info(\"Initializing hasher\");\n await targetHasher.initialize();\n\n logger.info(\"Initializing dependency map\");\n\n const packageTree = targetHasher.packageTree!;\n const dependencyMap = targetHasher.dependencyMap;\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n logger.info(\"Initializing Pool\");\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 const globalInputs = config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n\n logger.info(`Environment glob inputs: \\n${JSON.stringify(globalInputs)}\\n-------`);\n\n logger.info(\"done initializing\");\n return { config, targetGraph, packageTree, dependencyMap, root, pool, globalInputs, targetHasher };\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\nfunction getHashFilePath(target: Target) {\n return path.join(`node_modules/.lage/hash_${target.task}`);\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, globalInputs, targetHasher } = 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 logger.info(`Running target: ${request.packageName}#${request.task}`);\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 const targetGlobalInputs = target.environmentGlob ? glob(target.environmentGlob, { cwd: root, gitignore: true }) : globalInputs;\n\n let results: {\n packageName?: string;\n task: string;\n exitCode: number;\n inputs: string[];\n outputs: string[];\n stdout: string;\n stderr: string;\n id: string;\n globalInputs: string[];\n };\n\n const inputs = getInputFiles(target, dependencyMap, packageTree);\n\n for (const dep of target.dependencies) {\n if (dep === getStartTargetId()) {\n continue;\n }\n\n const depTarget = targetGraph.targets.get(dep)!;\n inputs.push(path.join(path.relative(root, depTarget.cwd), getHashFilePath(depTarget)).replace(/\\\\/g, \"/\"));\n }\n\n const targetHashFile = getHashFilePath(target);\n const targetHashFullPath = path.join(target.cwd, targetHashFile);\n\n try {\n if (!fs.existsSync(path.dirname(targetHashFullPath))) {\n fs.mkdirSync(path.dirname(targetHashFullPath), { recursive: true });\n }\n\n fs.writeFileSync(targetHashFullPath, await targetHasher.hash(target));\n } catch (e) {\n throw new ConnectError(`Error writing target hash file: ${targetHashFullPath}`, Code.Internal);\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 outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n outputs.push(targetHashFile);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n globalInputs: targetGlobalInputs,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n outputs.push(targetHashFile);\n\n targetRun.status = \"failed\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n globalInputs: targetGlobalInputs,\n };\n }\n\n logger.info(\n `${request.packageName}#${request.task} results: \\n${JSON.stringify(\n {\n packageName: results.packageName,\n task: results.task,\n exitCode: results.exitCode,\n inputs: results.inputs,\n outputs: results.outputs,\n id: results.id,\n globalInputs: `(${target.environmentGlob ? \"custom target env glob used\" : \"general global inputs used\"}): ${\n results.globalInputs.length\n } files`,\n },\n null,\n 2\n )}\\n------`,\n results\n );\n\n return results;\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","priorities","targetHasher","TargetHasher","environmentGlob","cacheKey","cliArgs","initialize","packageTree","dependencyMap","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","globalInputs","glob","gitignore","JSON","stringify","options","getHashFilePath","path","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","targetGlobalInputs","results","inputs","getInputFiles","dep","getStartTargetId","depTarget","push","relative","replace","targetHashFile","targetHashFullPath","fs","existsSync","dirname","mkdirSync","recursive","writeFileSync","hash","e","ConnectError","Code","Internal","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","toString","Error","length"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lage-run/cli",
3
- "version": "0.25.3",
3
+ "version": "0.25.5",
4
4
  "description": "Command Line Interface for Lage",
5
5
  "repository": {
6
6
  "type": "git",
@@ -28,7 +28,7 @@
28
28
  "@lage-run/hasher": "^1.6.9",
29
29
  "@lage-run/logger": "^1.3.1",
30
30
  "@lage-run/reporters": "^1.2.19",
31
- "@lage-run/rpc": "^1.2.4",
31
+ "@lage-run/rpc": "^1.2.6",
32
32
  "@lage-run/runners": "^1.2.1",
33
33
  "@lage-run/scheduler": "^1.5.1",
34
34
  "@lage-run/scheduler-types": "^0.3.23",
@@ -1,4 +0,0 @@
1
- import { type PackageTree } from "@lage-run/hasher";
2
- import { type Target, type TargetGraph } from "@lage-run/target-graph";
3
- import type { DependencyMap } from "workspace-tools";
4
- export declare function getTransitiveTargetInputs(target: Target, targetGraph: TargetGraph, dependencyMap: DependencyMap, packageTree: PackageTree): string[];
@@ -1,38 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "getTransitiveTargetInputs", {
6
- enumerable: true,
7
- get: function() {
8
- return getTransitiveTargetInputs;
9
- }
10
- });
11
- const _hasher = require("@lage-run/hasher");
12
- const _targetgraph = require("@lage-run/target-graph");
13
- function getTransitiveTargetInputs(target, targetGraph, dependencyMap, packageTree) {
14
- const inputsSet = new Set((0, _hasher.getInputFiles)(target, dependencyMap, packageTree) ?? []);
15
- // iteratively add all transitive dependencies in a breath-first manner using a queue
16
- const queue = target.dependencies.slice();
17
- const visited = new Set();
18
- while(queue.length > 0){
19
- const dependency = queue.shift();
20
- if (dependency === (0, _targetgraph.getStartTargetId)()) {
21
- continue;
22
- }
23
- // skip if already visited
24
- if (visited.has(dependency)) {
25
- continue;
26
- }
27
- visited.add(dependency);
28
- // now add the inputs of the dependency
29
- const depTarget = targetGraph.targets.get(dependency);
30
- const depInputs = (0, _hasher.getInputFiles)(depTarget, dependencyMap, packageTree);
31
- if (depInputs) {
32
- depInputs.forEach((file)=>inputsSet.add(file));
33
- }
34
- // add the dependencies of the dependency to the queue
35
- queue.push(...depTarget.dependencies);
36
- }
37
- return Array.from(inputsSet);
38
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/commands/server/getTransitiveTargetInputs.ts"],"sourcesContent":["import { type PackageTree, getInputFiles } from \"@lage-run/hasher\";\nimport { type Target, type TargetGraph, getStartTargetId } from \"@lage-run/target-graph\";\nimport type { DependencyMap } from \"workspace-tools\";\n\nexport function getTransitiveTargetInputs(\n target: Target,\n targetGraph: TargetGraph,\n dependencyMap: DependencyMap,\n packageTree: PackageTree\n) {\n const inputsSet = new Set<string>(getInputFiles(target, dependencyMap, packageTree) ?? []);\n\n // iteratively add all transitive dependencies in a breath-first manner using a queue\n const queue = target.dependencies.slice();\n const visited = new Set<string>();\n while (queue.length > 0) {\n const dependency = queue.shift()!;\n if (dependency === getStartTargetId()) {\n continue;\n }\n\n // skip if already visited\n if (visited.has(dependency)) {\n continue;\n }\n visited.add(dependency);\n\n // now add the inputs of the dependency\n const depTarget = targetGraph.targets.get(dependency)!;\n const depInputs = getInputFiles(depTarget, dependencyMap, packageTree);\n if (depInputs) {\n depInputs.forEach((file) => inputsSet.add(file));\n }\n\n // add the dependencies of the dependency to the queue\n queue.push(...depTarget.dependencies);\n }\n\n return Array.from(inputsSet);\n}\n"],"names":["getTransitiveTargetInputs","target","targetGraph","dependencyMap","packageTree","inputsSet","Set","getInputFiles","queue","dependencies","slice","visited","length","dependency","shift","getStartTargetId","has","add","depTarget","targets","get","depInputs","forEach","file","push","Array","from"],"mappings":";;;;+BAIgBA;;;eAAAA;;;wBAJgC;6BACgB;AAGzD,SAASA,0BACdC,MAAc,EACdC,WAAwB,EACxBC,aAA4B,EAC5BC,WAAwB;IAExB,MAAMC,YAAY,IAAIC,IAAYC,IAAAA,qBAAa,EAACN,QAAQE,eAAeC,gBAAgB,EAAE;IAEzF,qFAAqF;IACrF,MAAMI,QAAQP,OAAOQ,YAAY,CAACC,KAAK;IACvC,MAAMC,UAAU,IAAIL;IACpB,MAAOE,MAAMI,MAAM,GAAG,EAAG;QACvB,MAAMC,aAAaL,MAAMM,KAAK;QAC9B,IAAID,eAAeE,IAAAA,6BAAgB,KAAI;YACrC;QACF;QAEA,0BAA0B;QAC1B,IAAIJ,QAAQK,GAAG,CAACH,aAAa;YAC3B;QACF;QACAF,QAAQM,GAAG,CAACJ;QAEZ,uCAAuC;QACvC,MAAMK,YAAYhB,YAAYiB,OAAO,CAACC,GAAG,CAACP;QAC1C,MAAMQ,YAAYd,IAAAA,qBAAa,EAACW,WAAWf,eAAeC;QAC1D,IAAIiB,WAAW;YACbA,UAAUC,OAAO,CAAC,CAACC,OAASlB,UAAUY,GAAG,CAACM;QAC5C;QAEA,sDAAsD;QACtDf,MAAMgB,IAAI,IAAIN,UAAUT,YAAY;IACtC;IAEA,OAAOgB,MAAMC,IAAI,CAACrB;AACpB"}