@lage-run/cli 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/lib/commands/createReporter.d.ts +23 -1
  2. package/lib/commands/createReporter.js +51 -27
  3. package/lib/commands/createReporter.js.map +1 -1
  4. package/lib/commands/exec/action.js +6 -1
  5. package/lib/commands/exec/action.js.map +1 -1
  6. package/lib/commands/exec/executeRemotely.js +6 -3
  7. package/lib/commands/exec/executeRemotely.js.map +1 -1
  8. package/lib/commands/exec/simulateFileAccess.d.ts +1 -1
  9. package/lib/commands/exec/simulateFileAccess.js +1 -1
  10. package/lib/commands/exec/simulateFileAccess.js.map +1 -1
  11. package/lib/commands/info/action.d.ts +7 -1
  12. package/lib/commands/info/action.js +13 -9
  13. package/lib/commands/info/action.js.map +1 -1
  14. package/lib/commands/initializeReporters.d.ts +2 -1
  15. package/lib/commands/initializeReporters.js +3 -3
  16. package/lib/commands/initializeReporters.js.map +1 -1
  17. package/lib/commands/launchServerInBackground.js +1 -1
  18. package/lib/commands/launchServerInBackground.js.map +1 -1
  19. package/lib/commands/run/createTargetGraph.d.ts +2 -2
  20. package/lib/commands/run/createTargetGraph.js +28 -10
  21. package/lib/commands/run/createTargetGraph.js.map +1 -1
  22. package/lib/commands/run/index.js +2 -2
  23. package/lib/commands/run/index.js.map +1 -1
  24. package/lib/commands/run/runAction.js +5 -2
  25. package/lib/commands/run/runAction.js.map +1 -1
  26. package/lib/commands/run/watchAction.js +6 -4
  27. package/lib/commands/run/watchAction.js.map +1 -1
  28. package/lib/commands/server/action.js +8 -3
  29. package/lib/commands/server/action.js.map +1 -1
  30. package/lib/commands/server/getOutputFiles.js +2 -1
  31. package/lib/commands/server/getOutputFiles.js.map +1 -1
  32. package/lib/commands/server/lageService.d.ts +1 -1
  33. package/lib/commands/server/lageService.js +2 -1
  34. package/lib/commands/server/lageService.js.map +1 -1
  35. package/lib/commands/server/singleTargetWorker.js +17 -19
  36. package/lib/commands/server/singleTargetWorker.js.map +1 -1
  37. package/lib/filter/getFilteredPackages.js +11 -2
  38. package/lib/filter/getFilteredPackages.js.map +1 -1
  39. package/lib/filter/hasRepoChanged.d.ts +13 -1
  40. package/lib/filter/hasRepoChanged.js +14 -12
  41. package/lib/filter/hasRepoChanged.js.map +1 -1
  42. package/lib/index.d.ts +4 -2
  43. package/lib/internal.d.ts +1 -0
  44. package/lib/internal.js +4 -0
  45. package/lib/internal.js.map +1 -0
  46. package/lib/optimizeTargetGraph.js +1 -1
  47. package/lib/optimizeTargetGraph.js.map +1 -1
  48. package/lib/types/ReporterInitOptions.d.ts +4 -0
  49. package/lib/types/ReporterInitOptions.js.map +1 -1
  50. package/package.json +14 -14
  51. package/lib/cache/isRunningFromCI.d.ts +0 -1
  52. package/lib/cache/isRunningFromCI.js +0 -11
  53. package/lib/cache/isRunningFromCI.js.map +0 -1
  54. package/lib/commands/isRunningFromCI.d.ts +0 -1
  55. package/lib/commands/isRunningFromCI.js +0 -11
  56. package/lib/commands/isRunningFromCI.js.map +0 -1
@@ -67,7 +67,7 @@ async function launchServerInBackground({ logger, root, host, port, tasks, timeo
67
67
  stdio: "ignore",
68
68
  maxBuffer: 1024 * 1024 * 100
69
69
  });
70
- if (child && child.pid) {
70
+ if (child.pid) {
71
71
  _fs.default.writeFileSync(lockfilePath, child.pid.toString());
72
72
  }
73
73
  child.unref();
@@ -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 { 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): Promise<void> {\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 \"--server\",\n `${host}:${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;6BACY;;;;;;AAavB,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;YACA,GAAGF,KAAK,CAAC,EAAEC,MAAM;YACjB;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"}
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 { 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): Promise<void> {\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 \"--server\",\n `${host}:${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.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;6BACY;;;;;;AAavB,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;YACA,GAAGF,KAAK,CAAC,EAAEC,MAAM;YACjB;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,MAAMV,GAAG,EAAE;YACbE,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"}
@@ -1,7 +1,7 @@
1
1
  import type { Logger } from "@lage-run/logger";
2
- import { type TargetGraph } from "@lage-run/target-graph";
2
+ import { type Priority, type TargetGraph } from "@lage-run/target-graph";
3
3
  import type { PackageInfos } from "workspace-tools";
4
- import type { PipelineDefinition, Priority } from "@lage-run/config";
4
+ import type { PipelineDefinition } from "@lage-run/config";
5
5
  interface CreateTargetGraphOptions {
6
6
  logger: Logger;
7
7
  root: string;
@@ -16,19 +16,32 @@ function getChangedFiles(since, cwd) {
16
16
  const targetBranch = since || (0, _workspacetools.getDefaultRemoteBranch)({
17
17
  cwd
18
18
  });
19
- const changes = [
19
+ return [
20
20
  ...new Set([
21
- ...(0, _workspacetools.getUntrackedChanges)(cwd) || [],
22
- ...(0, _workspacetools.getUnstagedChanges)(cwd) || [],
23
- ...(0, _workspacetools.getBranchChanges)(targetBranch, cwd) || [],
24
- ...(0, _workspacetools.getStagedChanges)(cwd) || []
21
+ ...(0, _workspacetools.getUntrackedChanges)({
22
+ cwd
23
+ }) || [],
24
+ ...(0, _workspacetools.getUnstagedChanges)({
25
+ cwd
26
+ }) || [],
27
+ ...(0, _workspacetools.getBranchChanges)({
28
+ branch: targetBranch,
29
+ cwd
30
+ }) || [],
31
+ ...(0, _workspacetools.getStagedChanges)({
32
+ cwd
33
+ }) || []
25
34
  ])
26
35
  ];
27
- return changes;
28
36
  }
29
37
  async function createTargetGraph(options) {
30
38
  const { logger, root, dependencies, dependents, enableTargetConfigMerging, enablePhantomTargetOptimization, since, scope, repoWideChanges, ignore, pipeline, outputs, tasks, packageInfos, priorities } = options;
31
- const builder = new _targetgraph.WorkspaceTargetGraphBuilder(root, packageInfos, enableTargetConfigMerging, enablePhantomTargetOptimization);
39
+ const builder = new _targetgraph.WorkspaceTargetGraphBuilder({
40
+ root,
41
+ packageInfos,
42
+ enableTargetConfigMerging,
43
+ enablePhantomTargetOptimization
44
+ });
32
45
  const packages = (0, _getFilteredPackages.getFilteredPackages)({
33
46
  root,
34
47
  logger,
@@ -44,7 +57,12 @@ async function createTargetGraph(options) {
44
57
  // TODO: enhancement would be for workspace-tools to implement a "getChangedPackageFromChangedFiles()" type function
45
58
  // TODO: optimize this so that we don't double up the work to determine if repo has changed
46
59
  if (since) {
47
- if (!(0, _hasRepoChanged.hasRepoChanged)(since, root, repoWideChanges, logger)) {
60
+ if (!(0, _hasRepoChanged.hasRepoChanged)({
61
+ since,
62
+ root,
63
+ environmentGlob: repoWideChanges,
64
+ logger
65
+ })) {
48
66
  changedFiles = getChangedFiles(since, root);
49
67
  }
50
68
  }
@@ -71,14 +89,14 @@ async function createTargetGraph(options) {
71
89
  }
72
90
  for (const [id, definition] of pipelineEntries){
73
91
  if (Array.isArray(definition)) {
74
- await builder.addTargetConfig(id, {
92
+ builder.addTargetConfig(id, {
75
93
  cache: true,
76
94
  dependsOn: definition,
77
95
  options: {},
78
96
  outputs
79
97
  }, changedFiles);
80
98
  } else {
81
- await builder.addTargetConfig(id, definition, changedFiles);
99
+ builder.addTargetConfig(id, definition, changedFiles);
82
100
  }
83
101
  }
84
102
  return await builder.build(tasks, packages, priorities);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/run/createTargetGraph.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport { type TargetGraph, WorkspaceTargetGraphBuilder } from \"@lage-run/target-graph\";\nimport type { PackageInfos } from \"workspace-tools\";\nimport { getBranchChanges, getDefaultRemoteBranch, getStagedChanges, getUnstagedChanges, getUntrackedChanges } from \"workspace-tools\";\nimport { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport type { PipelineDefinition, Priority } from \"@lage-run/config\";\nimport { hasRepoChanged } from \"../../filter/hasRepoChanged.js\";\n\ninterface CreateTargetGraphOptions {\n logger: Logger;\n root: string;\n dependencies: boolean;\n dependents: boolean;\n since?: string;\n scope?: string[];\n ignore: string[];\n repoWideChanges: string[];\n pipeline: PipelineDefinition;\n outputs: string[];\n tasks: string[];\n packageInfos: PackageInfos;\n priorities: Priority[];\n enableTargetConfigMerging: boolean;\n enablePhantomTargetOptimization: boolean;\n}\n\nfunction getChangedFiles(since: string, cwd: string) {\n const targetBranch = since || getDefaultRemoteBranch({ cwd });\n\n const changes = [\n ...new Set([\n ...(getUntrackedChanges(cwd) || []),\n ...(getUnstagedChanges(cwd) || []),\n ...(getBranchChanges(targetBranch, cwd) || []),\n ...(getStagedChanges(cwd) || []),\n ]),\n ];\n\n return changes;\n}\n\nexport async function createTargetGraph(options: CreateTargetGraphOptions): Promise<TargetGraph> {\n const {\n logger,\n root,\n dependencies,\n dependents,\n enableTargetConfigMerging,\n enablePhantomTargetOptimization,\n since,\n scope,\n repoWideChanges,\n ignore,\n pipeline,\n outputs,\n tasks,\n packageInfos,\n priorities,\n } = options;\n\n const builder = new WorkspaceTargetGraphBuilder(root, packageInfos, enableTargetConfigMerging, enablePhantomTargetOptimization);\n\n const packages = getFilteredPackages({\n root,\n logger,\n packageInfos,\n includeDependencies: dependencies,\n includeDependents: dependents,\n since,\n scope,\n repoWideChanges,\n sinceIgnoreGlobs: ignore,\n });\n\n let changedFiles: string[] = [];\n\n // TODO: enhancement would be for workspace-tools to implement a \"getChangedPackageFromChangedFiles()\" type function\n // TODO: optimize this so that we don't double up the work to determine if repo has changed\n if (since) {\n if (!hasRepoChanged(since, root, repoWideChanges, logger)) {\n changedFiles = getChangedFiles(since, root);\n }\n }\n\n const pipelineEntries = Object.entries(pipeline);\n\n // Add lage pipeline configuration in the package.json files.\n // They are configured in the lage field, but without the package id.\n // i.e. having this package.json\n // { \"name\": \"@lage-run/globby\", \"lage\": { \"transpile\": { type: \"npmScript\" } }}\n // is equivalent to having the following in lage.config.js\n // { pipeline: { \"@lage-run/globby#transpile\": { type: \"npmScript\" } }\n // We conciously add these 'after' the ones in lage.config.js\n // to indicate that the more specific package.json definition takes\n // precedence over the global lage.config.js.\n for (const [packageId, packageInfo] of Object.entries(packageInfos)) {\n const packageLageDefinition = packageInfo.lage as PipelineDefinition;\n if (packageLageDefinition) {\n for (const [id, definition] of Object.entries(packageLageDefinition)) {\n pipelineEntries.push([packageId + \"#\" + id, definition]);\n }\n }\n }\n\n for (const [id, definition] of pipelineEntries) {\n if (Array.isArray(definition)) {\n await builder.addTargetConfig(\n id,\n {\n cache: true,\n dependsOn: definition,\n options: {},\n outputs,\n },\n changedFiles\n );\n } else {\n await builder.addTargetConfig(id, definition, changedFiles);\n }\n }\n\n return await builder.build(tasks, packages, priorities);\n}\n"],"names":["createTargetGraph","getChangedFiles","since","cwd","targetBranch","getDefaultRemoteBranch","changes","Set","getUntrackedChanges","getUnstagedChanges","getBranchChanges","getStagedChanges","options","logger","root","dependencies","dependents","enableTargetConfigMerging","enablePhantomTargetOptimization","scope","repoWideChanges","ignore","pipeline","outputs","tasks","packageInfos","priorities","builder","WorkspaceTargetGraphBuilder","packages","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","changedFiles","hasRepoChanged","pipelineEntries","Object","entries","packageId","packageInfo","packageLageDefinition","lage","id","definition","push","Array","isArray","addTargetConfig","cache","dependsOn","build"],"mappings":";;;;+BAyCsBA;;;eAAAA;;;6BAxCwC;gCAEsD;qCAChF;gCAEL;AAoB/B,SAASC,gBAAgBC,KAAa,EAAEC,GAAW;IACjD,MAAMC,eAAeF,SAASG,IAAAA,sCAAsB,EAAC;QAAEF;IAAI;IAE3D,MAAMG,UAAU;WACX,IAAIC,IAAI;eACLC,IAAAA,mCAAmB,EAACL,QAAQ,EAAE;eAC9BM,IAAAA,kCAAkB,EAACN,QAAQ,EAAE;eAC7BO,IAAAA,gCAAgB,EAACN,cAAcD,QAAQ,EAAE;eACzCQ,IAAAA,gCAAgB,EAACR,QAAQ,EAAE;SAChC;KACF;IAED,OAAOG;AACT;AAEO,eAAeN,kBAAkBY,OAAiC;IACvE,MAAM,EACJC,MAAM,EACNC,IAAI,EACJC,YAAY,EACZC,UAAU,EACVC,yBAAyB,EACzBC,+BAA+B,EAC/BhB,KAAK,EACLiB,KAAK,EACLC,eAAe,EACfC,MAAM,EACNC,QAAQ,EACRC,OAAO,EACPC,KAAK,EACLC,YAAY,EACZC,UAAU,EACX,GAAGd;IAEJ,MAAMe,UAAU,IAAIC,wCAA2B,CAACd,MAAMW,cAAcR,2BAA2BC;IAE/F,MAAMW,WAAWC,IAAAA,wCAAmB,EAAC;QACnChB;QACAD;QACAY;QACAM,qBAAqBhB;QACrBiB,mBAAmBhB;QACnBd;QACAiB;QACAC;QACAa,kBAAkBZ;IACpB;IAEA,IAAIa,eAAyB,EAAE;IAE/B,oHAAoH;IACpH,2FAA2F;IAC3F,IAAIhC,OAAO;QACT,IAAI,CAACiC,IAAAA,8BAAc,EAACjC,OAAOY,MAAMM,iBAAiBP,SAAS;YACzDqB,eAAejC,gBAAgBC,OAAOY;QACxC;IACF;IAEA,MAAMsB,kBAAkBC,OAAOC,OAAO,CAAChB;IAEvC,6DAA6D;IAC7D,qEAAqE;IACrE,gCAAgC;IAChC,mFAAmF;IACnF,0DAA0D;IAC1D,sEAAsE;IACtE,6DAA6D;IAC7D,mEAAmE;IACnE,8CAA8C;IAC9C,KAAK,MAAM,CAACiB,WAAWC,YAAY,IAAIH,OAAOC,OAAO,CAACb,cAAe;QACnE,MAAMgB,wBAAwBD,YAAYE,IAAI;QAC9C,IAAID,uBAAuB;YACzB,KAAK,MAAM,CAACE,IAAIC,WAAW,IAAIP,OAAOC,OAAO,CAACG,uBAAwB;gBACpEL,gBAAgBS,IAAI,CAAC;oBAACN,YAAY,MAAMI;oBAAIC;iBAAW;YACzD;QACF;IACF;IAEA,KAAK,MAAM,CAACD,IAAIC,WAAW,IAAIR,gBAAiB;QAC9C,IAAIU,MAAMC,OAAO,CAACH,aAAa;YAC7B,MAAMjB,QAAQqB,eAAe,CAC3BL,IACA;gBACEM,OAAO;gBACPC,WAAWN;gBACXhC,SAAS,CAAC;gBACVW;YACF,GACAW;QAEJ,OAAO;YACL,MAAMP,QAAQqB,eAAe,CAACL,IAAIC,YAAYV;QAChD;IACF;IAEA,OAAO,MAAMP,QAAQwB,KAAK,CAAC3B,OAAOK,UAAUH;AAC9C"}
1
+ {"version":3,"sources":["../../../src/commands/run/createTargetGraph.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport { type Priority, type TargetGraph, WorkspaceTargetGraphBuilder } from \"@lage-run/target-graph\";\nimport type { PackageInfos } from \"workspace-tools\";\nimport { getBranchChanges, getDefaultRemoteBranch, getStagedChanges, getUnstagedChanges, getUntrackedChanges } from \"workspace-tools\";\nimport { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport type { PipelineDefinition } from \"@lage-run/config\";\nimport { hasRepoChanged } from \"../../filter/hasRepoChanged.js\";\n\ninterface CreateTargetGraphOptions {\n logger: Logger;\n root: string;\n dependencies: boolean;\n dependents: boolean;\n since?: string;\n scope?: string[];\n ignore: string[];\n repoWideChanges: string[];\n pipeline: PipelineDefinition;\n outputs: string[];\n tasks: string[];\n packageInfos: PackageInfos;\n priorities: Priority[];\n enableTargetConfigMerging: boolean;\n enablePhantomTargetOptimization: boolean;\n}\n\nfunction getChangedFiles(since: string, cwd: string) {\n const targetBranch = since || getDefaultRemoteBranch({ cwd });\n\n return [\n ...new Set([\n ...(getUntrackedChanges({ cwd }) || []),\n ...(getUnstagedChanges({ cwd }) || []),\n ...(getBranchChanges({ branch: targetBranch, cwd }) || []),\n ...(getStagedChanges({ cwd }) || []),\n ]),\n ];\n}\n\nexport async function createTargetGraph(options: CreateTargetGraphOptions): Promise<TargetGraph> {\n const {\n logger,\n root,\n dependencies,\n dependents,\n enableTargetConfigMerging,\n enablePhantomTargetOptimization,\n since,\n scope,\n repoWideChanges,\n ignore,\n pipeline,\n outputs,\n tasks,\n packageInfos,\n priorities,\n } = options;\n\n const builder = new WorkspaceTargetGraphBuilder({ root, packageInfos, enableTargetConfigMerging, enablePhantomTargetOptimization });\n\n const packages = getFilteredPackages({\n root,\n logger,\n packageInfos,\n includeDependencies: dependencies,\n includeDependents: dependents,\n since,\n scope,\n repoWideChanges,\n sinceIgnoreGlobs: ignore,\n });\n\n let changedFiles: string[] = [];\n\n // TODO: enhancement would be for workspace-tools to implement a \"getChangedPackageFromChangedFiles()\" type function\n // TODO: optimize this so that we don't double up the work to determine if repo has changed\n if (since) {\n if (!hasRepoChanged({ since, root, environmentGlob: repoWideChanges, logger })) {\n changedFiles = getChangedFiles(since, root);\n }\n }\n\n const pipelineEntries = Object.entries(pipeline);\n\n // Add lage pipeline configuration in the package.json files.\n // They are configured in the lage field, but without the package id.\n // i.e. having this package.json\n // { \"name\": \"@lage-run/globby\", \"lage\": { \"transpile\": { type: \"npmScript\" } }}\n // is equivalent to having the following in lage.config.js\n // { pipeline: { \"@lage-run/globby#transpile\": { type: \"npmScript\" } }\n // We conciously add these 'after' the ones in lage.config.js\n // to indicate that the more specific package.json definition takes\n // precedence over the global lage.config.js.\n for (const [packageId, packageInfo] of Object.entries(packageInfos)) {\n const packageLageDefinition = packageInfo.lage as PipelineDefinition;\n if (packageLageDefinition) {\n for (const [id, definition] of Object.entries(packageLageDefinition)) {\n pipelineEntries.push([packageId + \"#\" + id, definition]);\n }\n }\n }\n\n for (const [id, definition] of pipelineEntries) {\n if (Array.isArray(definition)) {\n builder.addTargetConfig(\n id,\n {\n cache: true,\n dependsOn: definition,\n options: {},\n outputs,\n },\n changedFiles\n );\n } else {\n builder.addTargetConfig(id, definition, changedFiles);\n }\n }\n\n return await builder.build(tasks, packages, priorities);\n}\n"],"names":["createTargetGraph","getChangedFiles","since","cwd","targetBranch","getDefaultRemoteBranch","Set","getUntrackedChanges","getUnstagedChanges","getBranchChanges","branch","getStagedChanges","options","logger","root","dependencies","dependents","enableTargetConfigMerging","enablePhantomTargetOptimization","scope","repoWideChanges","ignore","pipeline","outputs","tasks","packageInfos","priorities","builder","WorkspaceTargetGraphBuilder","packages","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","changedFiles","hasRepoChanged","environmentGlob","pipelineEntries","Object","entries","packageId","packageInfo","packageLageDefinition","lage","id","definition","push","Array","isArray","addTargetConfig","cache","dependsOn","build"],"mappings":";;;;+BAuCsBA;;;eAAAA;;;6BAtCuD;gCAEuC;qCAChF;gCAEL;AAoB/B,SAASC,gBAAgBC,KAAa,EAAEC,GAAW;IACjD,MAAMC,eAAeF,SAASG,IAAAA,sCAAsB,EAAC;QAAEF;IAAI;IAE3D,OAAO;WACF,IAAIG,IAAI;eACLC,IAAAA,mCAAmB,EAAC;gBAAEJ;YAAI,MAAM,EAAE;eAClCK,IAAAA,kCAAkB,EAAC;gBAAEL;YAAI,MAAM,EAAE;eACjCM,IAAAA,gCAAgB,EAAC;gBAAEC,QAAQN;gBAAcD;YAAI,MAAM,EAAE;eACrDQ,IAAAA,gCAAgB,EAAC;gBAAER;YAAI,MAAM,EAAE;SACpC;KACF;AACH;AAEO,eAAeH,kBAAkBY,OAAiC;IACvE,MAAM,EACJC,MAAM,EACNC,IAAI,EACJC,YAAY,EACZC,UAAU,EACVC,yBAAyB,EACzBC,+BAA+B,EAC/BhB,KAAK,EACLiB,KAAK,EACLC,eAAe,EACfC,MAAM,EACNC,QAAQ,EACRC,OAAO,EACPC,KAAK,EACLC,YAAY,EACZC,UAAU,EACX,GAAGd;IAEJ,MAAMe,UAAU,IAAIC,wCAA2B,CAAC;QAAEd;QAAMW;QAAcR;QAA2BC;IAAgC;IAEjI,MAAMW,WAAWC,IAAAA,wCAAmB,EAAC;QACnChB;QACAD;QACAY;QACAM,qBAAqBhB;QACrBiB,mBAAmBhB;QACnBd;QACAiB;QACAC;QACAa,kBAAkBZ;IACpB;IAEA,IAAIa,eAAyB,EAAE;IAE/B,oHAAoH;IACpH,2FAA2F;IAC3F,IAAIhC,OAAO;QACT,IAAI,CAACiC,IAAAA,8BAAc,EAAC;YAAEjC;YAAOY;YAAMsB,iBAAiBhB;YAAiBP;QAAO,IAAI;YAC9EqB,eAAejC,gBAAgBC,OAAOY;QACxC;IACF;IAEA,MAAMuB,kBAAkBC,OAAOC,OAAO,CAACjB;IAEvC,6DAA6D;IAC7D,qEAAqE;IACrE,gCAAgC;IAChC,mFAAmF;IACnF,0DAA0D;IAC1D,sEAAsE;IACtE,6DAA6D;IAC7D,mEAAmE;IACnE,8CAA8C;IAC9C,KAAK,MAAM,CAACkB,WAAWC,YAAY,IAAIH,OAAOC,OAAO,CAACd,cAAe;QACnE,MAAMiB,wBAAwBD,YAAYE,IAAI;QAC9C,IAAID,uBAAuB;YACzB,KAAK,MAAM,CAACE,IAAIC,WAAW,IAAIP,OAAOC,OAAO,CAACG,uBAAwB;gBACpEL,gBAAgBS,IAAI,CAAC;oBAACN,YAAY,MAAMI;oBAAIC;iBAAW;YACzD;QACF;IACF;IAEA,KAAK,MAAM,CAACD,IAAIC,WAAW,IAAIR,gBAAiB;QAC9C,IAAIU,MAAMC,OAAO,CAACH,aAAa;YAC7BlB,QAAQsB,eAAe,CACrBL,IACA;gBACEM,OAAO;gBACPC,WAAWN;gBACXjC,SAAS,CAAC;gBACVW;YACF,GACAW;QAEJ,OAAO;YACLP,QAAQsB,eAAe,CAACL,IAAIC,YAAYX;QAC1C;IACF;IAEA,OAAO,MAAMP,QAAQyB,KAAK,CAAC5B,OAAOK,UAAUH;AAC9C"}
@@ -43,7 +43,7 @@ Scoped to "package-a" and "package-b" only:
43
43
 
44
44
  Scoped to packages that have changed in the current branch against a target merge branch:
45
45
 
46
- $ lage build test lint --since origin/master
46
+ $ lage build test lint --since origin/main
47
47
 
48
48
  ### Providing node.js arguments for each command
49
49
 
@@ -77,6 +77,6 @@ Or combine multiple reporters (e.g. Azure DepOps with VerboseFileLog)
77
77
 
78
78
  Ignoring files when calculating the scope with --since in addition to files specified in lage.config:
79
79
 
80
- $ lage build test lint --since origin/master --ignore "package.json" "yarn.lock" "**/.azure-pipelines/**"
80
+ $ lage build test lint --since origin/main --ignore "package.json" "yarn.lock" "**/.azure-pipelines/**"
81
81
 
82
82
  `);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/run/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { action } from \"./action.js\";\nimport { addOptions } from \"../addOptions.js\";\n\nconst command: Command = new Command(\"run\");\n\naddOptions(\"filter\", command);\naddOptions(\"logger\", command);\naddOptions(\"pool\", command);\naddOptions(\"runner\", command);\naddOptions(\"run\", command);\n\ncommand\n .action(action)\n .allowUnknownOption(true)\n .addHelpCommand(\"[run] command1 [command2...commandN] [options]\", \"run commands\")\n .addHelpText(\n \"after\",\n `\nRuns a set of commands in a target graph. The targets are defined by packages and their scripts as defined the package.json files.\n\nExamples\n========\n\n### Basic case, running \"build\", \"test\", and \"lint\" against all packages\n\n $ lage build test lint\n\n### Concurrency\n\n $ lage build test lint --concurrency=4\n\n### Filtering by certain packages\n\nScoped to \"package-a\" and \"package-b\" and their dependencies and dependents:\n\n $ lage build test lint --scope package-a package-b\n\nScoped to \"package-a\" and \"package-b\" only:\n\n $ lage build test lint --scope package-a package-b --no-deps\n\nScoped to packages that have changed in the current branch against a target merge branch:\n\n $ lage build test lint --since origin/master\n\n### Providing node.js arguments for each command\n\n $ lage build test lint --nodearg=--max_old_space_size=1234 --nodearg=--heap-prof\n\n### Continue running even after encountering an error for one of the targets\n\n $ lage build test lint --continue\n\n### Controlling logged outputs\n\nShow verbose output for each target:\n\n $ lage build test lint --verbose\n\nShow only errors for each target:\n\n $ lage build test lint --log-level=error\n\nShow logs as grouped by each target:\n\n $ lage build test lint --grouped --verbose\n\nChoosing a different reporter while logging (e.g. nice outputs for Azure DevOps):\n\n $ lage build test lint --reporter=azureDevops\n\nOr combine multiple reporters (e.g. Azure DepOps with VerboseFileLog)\n\n $ lage build test lint --reporter azureDevops --reporter vfl --log-file /my/verbose/log.file\n\nIgnoring files when calculating the scope with --since in addition to files specified in lage.config:\n\n $ lage build test lint --since origin/master --ignore \"package.json\" \"yarn.lock\" \"**/.azure-pipelines/**\"\n\n`\n );\n\nexport { command as runCommand };\n"],"names":["runCommand","command","Command","addOptions","action","allowUnknownOption","addHelpCommand","addHelpText"],"mappings":";;;;+BAmFoBA;;;eAAXC;;;2BAnFe;wBACD;4BACI;AAE3B,MAAMA,UAAmB,IAAIC,kBAAO,CAAC;AAErCC,IAAAA,sBAAU,EAAC,UAAUF;AACrBE,IAAAA,sBAAU,EAAC,UAAUF;AACrBE,IAAAA,sBAAU,EAAC,QAAQF;AACnBE,IAAAA,sBAAU,EAAC,UAAUF;AACrBE,IAAAA,sBAAU,EAAC,OAAOF;AAElBA,QACGG,MAAM,CAACA,cAAM,EACbC,kBAAkB,CAAC,MACnBC,cAAc,CAAC,kDAAkD,gBACjEC,WAAW,CACV,SACA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DL,CAAC"}
1
+ {"version":3,"sources":["../../../src/commands/run/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { action } from \"./action.js\";\nimport { addOptions } from \"../addOptions.js\";\n\nconst command: Command = new Command(\"run\");\n\naddOptions(\"filter\", command);\naddOptions(\"logger\", command);\naddOptions(\"pool\", command);\naddOptions(\"runner\", command);\naddOptions(\"run\", command);\n\ncommand\n .action(action)\n .allowUnknownOption(true)\n .addHelpCommand(\"[run] command1 [command2...commandN] [options]\", \"run commands\")\n .addHelpText(\n \"after\",\n `\nRuns a set of commands in a target graph. The targets are defined by packages and their scripts as defined the package.json files.\n\nExamples\n========\n\n### Basic case, running \"build\", \"test\", and \"lint\" against all packages\n\n $ lage build test lint\n\n### Concurrency\n\n $ lage build test lint --concurrency=4\n\n### Filtering by certain packages\n\nScoped to \"package-a\" and \"package-b\" and their dependencies and dependents:\n\n $ lage build test lint --scope package-a package-b\n\nScoped to \"package-a\" and \"package-b\" only:\n\n $ lage build test lint --scope package-a package-b --no-deps\n\nScoped to packages that have changed in the current branch against a target merge branch:\n\n $ lage build test lint --since origin/main\n\n### Providing node.js arguments for each command\n\n $ lage build test lint --nodearg=--max_old_space_size=1234 --nodearg=--heap-prof\n\n### Continue running even after encountering an error for one of the targets\n\n $ lage build test lint --continue\n\n### Controlling logged outputs\n\nShow verbose output for each target:\n\n $ lage build test lint --verbose\n\nShow only errors for each target:\n\n $ lage build test lint --log-level=error\n\nShow logs as grouped by each target:\n\n $ lage build test lint --grouped --verbose\n\nChoosing a different reporter while logging (e.g. nice outputs for Azure DevOps):\n\n $ lage build test lint --reporter=azureDevops\n\nOr combine multiple reporters (e.g. Azure DepOps with VerboseFileLog)\n\n $ lage build test lint --reporter azureDevops --reporter vfl --log-file /my/verbose/log.file\n\nIgnoring files when calculating the scope with --since in addition to files specified in lage.config:\n\n $ lage build test lint --since origin/main --ignore \"package.json\" \"yarn.lock\" \"**/.azure-pipelines/**\"\n\n`\n );\n\nexport { command as runCommand };\n"],"names":["runCommand","command","Command","addOptions","action","allowUnknownOption","addHelpCommand","addHelpText"],"mappings":";;;;+BAmFoBA;;;eAAXC;;;2BAnFe;wBACD;4BACI;AAE3B,MAAMA,UAAmB,IAAIC,kBAAO,CAAC;AAErCC,IAAAA,sBAAU,EAAC,UAAUF;AACrBE,IAAAA,sBAAU,EAAC,UAAUF;AACrBE,IAAAA,sBAAU,EAAC,QAAQF;AACnBE,IAAAA,sBAAU,EAAC,UAAUF;AACrBE,IAAAA,sBAAU,EAAC,OAAOF;AAElBA,QACGG,MAAM,CAACA,cAAM,EACbC,kBAAkB,CAAC,MACnBC,cAAc,CAAC,kDAAkD,gBACjEC,WAAW,CACV,SACA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DL,CAAC"}
@@ -33,12 +33,15 @@ async function runAction(options, command) {
33
33
  const allowNoTargetRuns = options.allowNoTargetRuns || config.allowNoTargetRuns;
34
34
  // Configure logger
35
35
  const logger = (0, _logger.default)();
36
+ const root = (0, _workspacetools.getWorkspaceManagerRoot)(cwd) ?? cwd;
36
37
  const reporters = await (0, _initializeReporters.initializeReporters)(logger, {
37
38
  ...options,
38
39
  concurrency
39
- }, config.reporters);
40
+ }, {
41
+ customReporters: config.reporters,
42
+ root
43
+ });
40
44
  // Build Target Graph
41
- const root = (0, _workspacetools.getWorkspaceManagerRoot)(process.cwd());
42
45
  const packageInfos = (0, _workspacetools.getPackageInfos)(root);
43
46
  const { tasks, taskArgs } = (0, _filterArgsForTasks.filterArgsForTasks)(command.args);
44
47
  const targetGraph = await (0, _createTargetGraph.createTargetGraph)({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/run/runAction.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"./createTargetGraph.js\";\nimport { filterArgsForTasks } from \"./filterArgsForTasks.js\";\nimport { filterPipelineDefinitions } from \"./filterPipelineDefinitions.js\";\nimport { getConfig, getMaxWorkersPerTask, getMaxWorkersPerTaskFromOptions, getConcurrency } from \"@lage-run/config\";\nimport { getPackageInfos, getWorkspaceManagerRoot } from \"workspace-tools\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { SimpleScheduler } from \"@lage-run/scheduler\";\n\nimport type { Reporter } from \"@lage-run/logger\";\nimport createLogger from \"@lage-run/logger\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { FilterOptions } from \"../../types/FilterOptions.js\";\nimport type { SchedulerRunSummary } from \"@lage-run/scheduler-types\";\nimport type { TargetGraph } from \"@lage-run/target-graph\";\nimport { NoTargetFoundError } from \"../../types/errors.js\";\nimport { createCache } from \"../../cache/createCacheProvider.js\";\nimport { getBuiltInRunners } from \"../../getBuiltInRunners.js\";\nimport { optimizeTargetGraph } from \"../../optimizeTargetGraph.js\";\n\ninterface RunOptions extends ReporterInitOptions, FilterOptions {\n concurrency: number;\n maxWorkersPerTask: string[];\n profile: string | boolean | undefined;\n skipLocalCache: boolean;\n continue: boolean;\n cache: boolean;\n resetCache: boolean;\n nodeArg: string;\n allowNoTargetRuns: boolean;\n}\n\nexport async function runAction(options: RunOptions, command: Command): Promise<void> {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n\n // Merged options\n const concurrency = getConcurrency(options.concurrency, config.concurrency);\n const allowNoTargetRuns = options.allowNoTargetRuns || config.allowNoTargetRuns;\n\n // Configure logger\n const logger = createLogger();\n\n const reporters = await initializeReporters(logger, { ...options, concurrency }, config.reporters);\n\n // Build Target Graph\n const root = getWorkspaceManagerRoot(process.cwd())!;\n const packageInfos = getPackageInfos(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n enableTargetConfigMerging: config.enableTargetConfigMerging,\n enablePhantomTargetOptimization: config.enablePhantomTargetOptimization,\n });\n\n validateTargetGraph(targetGraph, allowNoTargetRuns);\n\n logger.verbose(`Running with ${concurrency} workers`);\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n const maxWorkersPerTaskMap = getMaxWorkersPerTaskFromOptions(options.maxWorkersPerTask);\n\n const { hasher } = await createCache({\n root,\n logger,\n cacheOptions: config.cacheOptions,\n cliArgs: taskArgs,\n skipLocalCache: options.skipLocalCache,\n });\n\n const scheduler = new SimpleScheduler({\n logger,\n concurrency,\n continueOnError: options.continue,\n shouldCache: options.cache,\n shouldResetCache: options.resetCache,\n workerData: {\n root,\n taskArgs,\n skipLocalCache: options.skipLocalCache,\n cacheOptions: config.cacheOptions,\n runners: {\n ...getBuiltInRunners({ nodeArg: options.nodeArg, npmCmd: config.npmClient, taskArgs }),\n ...config.runners,\n },\n },\n maxWorkersPerTask: new Map([...getMaxWorkersPerTask(filteredPipeline, concurrency), ...maxWorkersPerTaskMap]),\n hasher,\n workerIdleMemoryLimit: config.workerIdleMemoryLimit, // in bytes\n });\n\n const optimizedTargets = await optimizeTargetGraph(targetGraph, scheduler.runnerPicker, false);\n const optimizedGraph: TargetGraph = {\n targets: new Map(optimizedTargets.map((target) => [target.id, target])),\n };\n\n const summary = await scheduler.run(root, optimizedGraph);\n await scheduler.cleanup();\n\n displaySummaryAndExit(summary, logger.reporters);\n\n for (const reporter of reporters) {\n reporter.cleanup?.();\n }\n}\n\nfunction displaySummaryAndExit(summary: SchedulerRunSummary, reporters: Reporter[]) {\n if (summary.results !== \"success\") {\n process.exitCode = 1;\n }\n\n for (const reporter of reporters) {\n reporter.summarize(summary);\n }\n}\n\nfunction validateTargetGraph(targetGraph: TargetGraph, allowNoTargetRuns: boolean) {\n const visibleTargets = Array.from(targetGraph.targets.values()).filter((target) => !target.hidden);\n if (visibleTargets.length === 0 && !allowNoTargetRuns) {\n throw NoTargetFoundError;\n }\n}\n"],"names":["runAction","options","command","cwd","process","config","getConfig","concurrency","getConcurrency","allowNoTargetRuns","logger","createLogger","reporters","initializeReporters","root","getWorkspaceManagerRoot","packageInfos","getPackageInfos","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","enablePhantomTargetOptimization","validateTargetGraph","verbose","filteredPipeline","filterPipelineDefinitions","targets","values","maxWorkersPerTaskMap","getMaxWorkersPerTaskFromOptions","maxWorkersPerTask","hasher","createCache","cliArgs","skipLocalCache","scheduler","SimpleScheduler","continueOnError","continue","shouldCache","cache","shouldResetCache","resetCache","workerData","runners","getBuiltInRunners","nodeArg","npmCmd","npmClient","Map","getMaxWorkersPerTask","workerIdleMemoryLimit","optimizedTargets","optimizeTargetGraph","runnerPicker","optimizedGraph","map","target","id","summary","run","cleanup","displaySummaryAndExit","reporter","results","exitCode","summarize","visibleTargets","Array","from","filter","hidden","length","NoTargetFoundError"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/run/runAction.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"./createTargetGraph.js\";\nimport { filterArgsForTasks } from \"./filterArgsForTasks.js\";\nimport { filterPipelineDefinitions } from \"./filterPipelineDefinitions.js\";\nimport { getConfig, getMaxWorkersPerTask, getMaxWorkersPerTaskFromOptions, getConcurrency } from \"@lage-run/config\";\nimport { getPackageInfos, getWorkspaceManagerRoot } from \"workspace-tools\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { SimpleScheduler } from \"@lage-run/scheduler\";\n\nimport type { Reporter } from \"@lage-run/logger\";\nimport createLogger from \"@lage-run/logger\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { FilterOptions } from \"../../types/FilterOptions.js\";\nimport type { SchedulerRunSummary } from \"@lage-run/scheduler-types\";\nimport type { TargetGraph } from \"@lage-run/target-graph\";\nimport { NoTargetFoundError } from \"../../types/errors.js\";\nimport { createCache } from \"../../cache/createCacheProvider.js\";\nimport { getBuiltInRunners } from \"../../getBuiltInRunners.js\";\nimport { optimizeTargetGraph } from \"../../optimizeTargetGraph.js\";\n\ninterface RunOptions extends ReporterInitOptions, FilterOptions {\n concurrency: number;\n maxWorkersPerTask: string[];\n profile: string | boolean | undefined;\n skipLocalCache: boolean;\n continue: boolean;\n cache: boolean;\n resetCache: boolean;\n nodeArg: string;\n allowNoTargetRuns: boolean;\n}\n\nexport async function runAction(options: RunOptions, command: Command): Promise<void> {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n\n // Merged options\n const concurrency = getConcurrency(options.concurrency, config.concurrency);\n const allowNoTargetRuns = options.allowNoTargetRuns || config.allowNoTargetRuns;\n\n // Configure logger\n const logger = createLogger();\n\n const root = getWorkspaceManagerRoot(cwd) ?? cwd;\n const reporters = await initializeReporters(logger, { ...options, concurrency }, { customReporters: config.reporters, root });\n\n // Build Target Graph\n const packageInfos = getPackageInfos(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n enableTargetConfigMerging: config.enableTargetConfigMerging,\n enablePhantomTargetOptimization: config.enablePhantomTargetOptimization,\n });\n\n validateTargetGraph(targetGraph, allowNoTargetRuns);\n\n logger.verbose(`Running with ${concurrency} workers`);\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n const maxWorkersPerTaskMap = getMaxWorkersPerTaskFromOptions(options.maxWorkersPerTask);\n\n const { hasher } = await createCache({\n root,\n logger,\n cacheOptions: config.cacheOptions,\n cliArgs: taskArgs,\n skipLocalCache: options.skipLocalCache,\n });\n\n const scheduler = new SimpleScheduler({\n logger,\n concurrency,\n continueOnError: options.continue,\n shouldCache: options.cache,\n shouldResetCache: options.resetCache,\n workerData: {\n root,\n taskArgs,\n skipLocalCache: options.skipLocalCache,\n cacheOptions: config.cacheOptions,\n runners: {\n ...getBuiltInRunners({ nodeArg: options.nodeArg, npmCmd: config.npmClient, taskArgs }),\n ...config.runners,\n },\n },\n maxWorkersPerTask: new Map([...getMaxWorkersPerTask(filteredPipeline, concurrency), ...maxWorkersPerTaskMap]),\n hasher,\n workerIdleMemoryLimit: config.workerIdleMemoryLimit, // in bytes\n });\n\n const optimizedTargets = await optimizeTargetGraph(targetGraph, scheduler.runnerPicker, false);\n const optimizedGraph: TargetGraph = {\n targets: new Map(optimizedTargets.map((target) => [target.id, target])),\n };\n\n const summary = await scheduler.run(root, optimizedGraph);\n await scheduler.cleanup();\n\n displaySummaryAndExit(summary, logger.reporters);\n\n for (const reporter of reporters) {\n reporter.cleanup?.();\n }\n}\n\nfunction displaySummaryAndExit(summary: SchedulerRunSummary, reporters: Reporter[]) {\n if (summary.results !== \"success\") {\n process.exitCode = 1;\n }\n\n for (const reporter of reporters) {\n reporter.summarize(summary);\n }\n}\n\nfunction validateTargetGraph(targetGraph: TargetGraph, allowNoTargetRuns: boolean) {\n const visibleTargets = Array.from(targetGraph.targets.values()).filter((target) => !target.hidden);\n if (visibleTargets.length === 0 && !allowNoTargetRuns) {\n throw NoTargetFoundError;\n }\n}\n"],"names":["runAction","options","command","cwd","process","config","getConfig","concurrency","getConcurrency","allowNoTargetRuns","logger","createLogger","root","getWorkspaceManagerRoot","reporters","initializeReporters","customReporters","packageInfos","getPackageInfos","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","enablePhantomTargetOptimization","validateTargetGraph","verbose","filteredPipeline","filterPipelineDefinitions","targets","values","maxWorkersPerTaskMap","getMaxWorkersPerTaskFromOptions","maxWorkersPerTask","hasher","createCache","cliArgs","skipLocalCache","scheduler","SimpleScheduler","continueOnError","continue","shouldCache","cache","shouldResetCache","resetCache","workerData","runners","getBuiltInRunners","nodeArg","npmCmd","npmClient","Map","getMaxWorkersPerTask","workerIdleMemoryLimit","optimizedTargets","optimizeTargetGraph","runnerPicker","optimizedGraph","map","target","id","summary","run","cleanup","displaySummaryAndExit","reporter","results","exitCode","summarize","visibleTargets","Array","from","filter","hidden","length","NoTargetFoundError"],"mappings":"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"}
@@ -139,8 +139,8 @@ async function watchAction(options, command) {
139
139
  targetRun.options.shouldCache = false;
140
140
  }
141
141
  // When initial run is done, disable fetching of caches on all targets, keep writing to the cache
142
- const watcher = await (0, _watcher.watch)(root, packageInfos);
143
- watcher.on("change", async (packageName)=>{
142
+ const watcher = (0, _watcher.watch)(root, packageInfos);
143
+ watcher.on("change", (packageName)=>{
144
144
  reporter.resetLogEntries();
145
145
  const targets = new Map();
146
146
  for (const target of targetGraph.targets.values()){
@@ -151,8 +151,10 @@ async function watchAction(options, command) {
151
151
  const deltaGraph = {
152
152
  targets
153
153
  };
154
- const summary = await scheduler.run(root, deltaGraph, true);
155
- displaySummary(summary, logger.reporters);
154
+ void (async ()=>{
155
+ const deltaSummary = await scheduler.run(root, deltaGraph, true);
156
+ displaySummary(deltaSummary, logger.reporters);
157
+ })().catch(()=>{});
156
158
  });
157
159
  }
158
160
  function displaySummary(summary, reporters) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/run/watchAction.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"./createTargetGraph.js\";\nimport { filterArgsForTasks } from \"./filterArgsForTasks.js\";\nimport { getConfig, getMaxWorkersPerTask, getMaxWorkersPerTaskFromOptions, getConcurrency } from \"@lage-run/config\";\nimport { getPackageInfosAsync, getWorkspaceManagerRoot } from \"workspace-tools\";\nimport { filterPipelineDefinitions } from \"./filterPipelineDefinitions.js\";\nimport { LogReporter } from \"@lage-run/reporters\";\nimport { SimpleScheduler } from \"@lage-run/scheduler\";\nimport { watch } from \"./watcher.js\";\n\nimport type { Reporter } from \"@lage-run/logger\";\nimport createLogger, { LogLevel } from \"@lage-run/logger\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { SchedulerRunSummary } from \"@lage-run/scheduler-types\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport type { FilterOptions } from \"../../types/FilterOptions.js\";\nimport { createCache } from \"../../cache/createCacheProvider.js\";\nimport { getBuiltInRunners } from \"../../getBuiltInRunners.js\";\n\ninterface RunOptions extends ReporterInitOptions, FilterOptions {\n concurrency: number;\n maxWorkersPerTask: string[];\n profile: string | boolean | undefined;\n skipLocalCache: boolean;\n continue: boolean;\n cache: boolean;\n resetCache: boolean;\n nodeArg: string;\n allowNoTargetRuns: boolean;\n}\n\nexport async function watchAction(options: RunOptions, command: Command): Promise<void> {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n const concurrency = getConcurrency(options.concurrency, config.concurrency);\n\n // Configure logger\n const logger = createLogger();\n const reporter = new LogReporter({\n logLevel: LogLevel[options.logLevel],\n });\n logger.addReporter(reporter);\n\n // Build Target Graph\n const root = getWorkspaceManagerRoot(process.cwd())!;\n const packageInfos = await getPackageInfosAsync(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n enableTargetConfigMerging: config.enableTargetConfigMerging,\n enablePhantomTargetOptimization: config.enablePhantomTargetOptimization,\n });\n\n // Make sure we do not attempt writeRemoteCache in watch mode\n config.cacheOptions.writeRemoteCache = false;\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n const maxWorkersPerTaskMap = getMaxWorkersPerTaskFromOptions(options.maxWorkersPerTask);\n\n const { hasher } = await createCache({\n root,\n logger,\n cacheOptions: config.cacheOptions,\n cliArgs: taskArgs,\n skipLocalCache: options.skipLocalCache,\n });\n\n const scheduler = new SimpleScheduler({\n logger,\n concurrency,\n continueOnError: true,\n workerData: {\n root,\n taskArgs,\n skipLocalCache: options.skipLocalCache,\n cacheOptions: config.cacheOptions,\n runners: {\n ...getBuiltInRunners({ nodeArg: options.nodeArg, npmCmd: config.npmClient, taskArgs }),\n ...config.runners,\n },\n },\n shouldCache: options.cache,\n shouldResetCache: options.resetCache,\n maxWorkersPerTask: new Map([...getMaxWorkersPerTask(filteredPipeline, concurrency), ...maxWorkersPerTaskMap]),\n hasher,\n workerIdleMemoryLimit: config.workerIdleMemoryLimit, // in bytes\n });\n\n // Initial run\n const summary = await scheduler.run(root, targetGraph);\n displaySummary(summary, logger.reporters);\n\n logger.info(\"Running scheduler in watch mode\");\n\n // Disables cache for subsequent runs\n // TODO: support updating hasher + write-only local cacheProvider for subsequent runs\n for (const targetRun of scheduler.targetRuns.values()) {\n targetRun.options.shouldCache = false;\n }\n\n // When initial run is done, disable fetching of caches on all targets, keep writing to the cache\n const watcher = await watch(root, packageInfos);\n watcher.on(\"change\", async (packageName) => {\n reporter.resetLogEntries();\n const targets = new Map<string, Target>();\n for (const target of targetGraph.targets.values()) {\n if (target.packageName === packageName) {\n targets.set(target.id, target);\n }\n }\n\n const deltaGraph = { targets };\n\n const summary = await scheduler.run(root, deltaGraph, true);\n displaySummary(summary, logger.reporters);\n });\n}\n\nfunction displaySummary(summary: SchedulerRunSummary, reporters: Reporter[]) {\n for (const reporter of reporters) {\n reporter.summarize(summary);\n reporter.cleanup?.();\n }\n}\n"],"names":["watchAction","options","command","cwd","process","config","getConfig","concurrency","getConcurrency","logger","createLogger","reporter","LogReporter","logLevel","LogLevel","addReporter","root","getWorkspaceManagerRoot","packageInfos","getPackageInfosAsync","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","enablePhantomTargetOptimization","writeRemoteCache","filteredPipeline","filterPipelineDefinitions","targets","values","maxWorkersPerTaskMap","getMaxWorkersPerTaskFromOptions","maxWorkersPerTask","hasher","createCache","cliArgs","skipLocalCache","scheduler","SimpleScheduler","continueOnError","workerData","runners","getBuiltInRunners","nodeArg","npmCmd","npmClient","shouldCache","cache","shouldResetCache","resetCache","Map","getMaxWorkersPerTask","workerIdleMemoryLimit","summary","run","displaySummary","reporters","info","targetRun","targetRuns","watcher","watch","on","packageName","resetLogEntries","target","set","id","deltaGraph","summarize","cleanup"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/run/watchAction.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"./createTargetGraph.js\";\nimport { filterArgsForTasks } from \"./filterArgsForTasks.js\";\nimport { getConfig, getMaxWorkersPerTask, getMaxWorkersPerTaskFromOptions, getConcurrency } from \"@lage-run/config\";\nimport { getPackageInfosAsync, getWorkspaceManagerRoot } from \"workspace-tools\";\nimport { filterPipelineDefinitions } from \"./filterPipelineDefinitions.js\";\nimport { LogReporter } from \"@lage-run/reporters\";\nimport { SimpleScheduler } from \"@lage-run/scheduler\";\nimport { watch } from \"./watcher.js\";\n\nimport type { Reporter } from \"@lage-run/logger\";\nimport createLogger, { LogLevel } from \"@lage-run/logger\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { SchedulerRunSummary } from \"@lage-run/scheduler-types\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport type { FilterOptions } from \"../../types/FilterOptions.js\";\nimport { createCache } from \"../../cache/createCacheProvider.js\";\nimport { getBuiltInRunners } from \"../../getBuiltInRunners.js\";\n\ninterface RunOptions extends ReporterInitOptions, FilterOptions {\n concurrency: number;\n maxWorkersPerTask: string[];\n profile: string | boolean | undefined;\n skipLocalCache: boolean;\n continue: boolean;\n cache: boolean;\n resetCache: boolean;\n nodeArg: string;\n allowNoTargetRuns: boolean;\n}\n\nexport async function watchAction(options: RunOptions, command: Command): Promise<void> {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n const concurrency = getConcurrency(options.concurrency, config.concurrency);\n\n // Configure logger\n const logger = createLogger();\n const reporter = new LogReporter({\n logLevel: LogLevel[options.logLevel],\n });\n logger.addReporter(reporter);\n\n // Build Target Graph\n const root = getWorkspaceManagerRoot(process.cwd())!;\n const packageInfos = await getPackageInfosAsync(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n enableTargetConfigMerging: config.enableTargetConfigMerging,\n enablePhantomTargetOptimization: config.enablePhantomTargetOptimization,\n });\n\n // Make sure we do not attempt writeRemoteCache in watch mode\n config.cacheOptions.writeRemoteCache = false;\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n const maxWorkersPerTaskMap = getMaxWorkersPerTaskFromOptions(options.maxWorkersPerTask);\n\n const { hasher } = await createCache({\n root,\n logger,\n cacheOptions: config.cacheOptions,\n cliArgs: taskArgs,\n skipLocalCache: options.skipLocalCache,\n });\n\n const scheduler = new SimpleScheduler({\n logger,\n concurrency,\n continueOnError: true,\n workerData: {\n root,\n taskArgs,\n skipLocalCache: options.skipLocalCache,\n cacheOptions: config.cacheOptions,\n runners: {\n ...getBuiltInRunners({ nodeArg: options.nodeArg, npmCmd: config.npmClient, taskArgs }),\n ...config.runners,\n },\n },\n shouldCache: options.cache,\n shouldResetCache: options.resetCache,\n maxWorkersPerTask: new Map([...getMaxWorkersPerTask(filteredPipeline, concurrency), ...maxWorkersPerTaskMap]),\n hasher,\n workerIdleMemoryLimit: config.workerIdleMemoryLimit, // in bytes\n });\n\n // Initial run\n const summary = await scheduler.run(root, targetGraph);\n displaySummary(summary, logger.reporters);\n\n logger.info(\"Running scheduler in watch mode\");\n\n // Disables cache for subsequent runs\n // TODO: support updating hasher + write-only local cacheProvider for subsequent runs\n for (const targetRun of scheduler.targetRuns.values()) {\n targetRun.options.shouldCache = false;\n }\n\n // When initial run is done, disable fetching of caches on all targets, keep writing to the cache\n const watcher = watch(root, packageInfos);\n watcher.on(\"change\", (packageName) => {\n reporter.resetLogEntries();\n const targets = new Map<string, Target>();\n for (const target of targetGraph.targets.values()) {\n if (target.packageName === packageName) {\n targets.set(target.id, target);\n }\n }\n\n const deltaGraph = { targets };\n\n void (async () => {\n const deltaSummary = await scheduler.run(root, deltaGraph, true);\n displaySummary(deltaSummary, logger.reporters);\n })().catch(() => {});\n });\n}\n\nfunction displaySummary(summary: SchedulerRunSummary, reporters: Reporter[]) {\n for (const reporter of reporters) {\n reporter.summarize(summary);\n reporter.cleanup?.();\n }\n}\n"],"names":["watchAction","options","command","cwd","process","config","getConfig","concurrency","getConcurrency","logger","createLogger","reporter","LogReporter","logLevel","LogLevel","addReporter","root","getWorkspaceManagerRoot","packageInfos","getPackageInfosAsync","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","enablePhantomTargetOptimization","writeRemoteCache","filteredPipeline","filterPipelineDefinitions","targets","values","maxWorkersPerTaskMap","getMaxWorkersPerTaskFromOptions","maxWorkersPerTask","hasher","createCache","cliArgs","skipLocalCache","scheduler","SimpleScheduler","continueOnError","workerData","runners","getBuiltInRunners","nodeArg","npmCmd","npmClient","shouldCache","cache","shouldResetCache","resetCache","Map","getMaxWorkersPerTask","workerIdleMemoryLimit","summary","run","displaySummary","reporters","info","targetRun","targetRuns","watcher","watch","on","packageName","resetLogEntries","target","set","id","deltaGraph","deltaSummary","catch","summarize","cleanup"],"mappings":"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"}
@@ -14,6 +14,7 @@ const _lageService = require("./lageService.js");
14
14
  const _rpc = require("@lage-run/rpc");
15
15
  const _parseServerOption = require("../parseServerOption.js");
16
16
  const _config = require("@lage-run/config");
17
+ const _workspacetools = require("workspace-tools");
17
18
  function _interop_require_default(obj) {
18
19
  return obj && obj.__esModule ? obj : {
19
20
  default: obj
@@ -23,16 +24,20 @@ async function serverAction(options) {
23
24
  const { server = "localhost:5332", timeout = 1, tasks } = options;
24
25
  const { host, port } = (0, _parseServerOption.parseServerOption)(server);
25
26
  const cwd = process.cwd();
27
+ const root = (0, _workspacetools.getWorkspaceManagerRoot)(cwd) ?? cwd;
26
28
  const config = await (0, _config.getConfig)(cwd);
27
29
  const logger = (0, _logger.default)();
28
30
  options.logLevel = options.logLevel ?? "info";
29
31
  options.logFile = options.logFile ?? "node_modules/.cache/lage/server.log";
30
32
  options.reporter = options.reporter ?? "verboseFileLog";
31
- await (0, _initializeReporters.initializeReporters)(logger, options, config.reporters);
33
+ await (0, _initializeReporters.initializeReporters)(logger, options, {
34
+ customReporters: config.reporters,
35
+ root
36
+ });
32
37
  logger.info(`Starting server on http://${host}:${port}`);
33
38
  const abortController = new AbortController();
34
- const lageService = await (0, _lageService.createLageService)({
35
- cwd: process.cwd(),
39
+ const lageService = (0, _lageService.createLageService)({
40
+ cwd,
36
41
  serverControls: {
37
42
  abortController,
38
43
  countdownToShutdown: ()=>resetTimer(logger, timeout, abortController, lageServer),
@@ -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\";\nimport { getConfig } from \"@lage-run/config\";\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): Promise<void> {\n const { server = \"localhost:5332\", timeout = 1, tasks } = options;\n\n const { host, port } = parseServerOption(server);\n const cwd = process.cwd();\n const config = await getConfig(cwd);\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 await initializeReporters(logger, options, config.reporters);\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","cwd","process","config","getConfig","logger","createLogger","logLevel","logFile","reporter","initializeReporters","reporters","info","abortController","AbortController","lageService","createLageService","serverControls","countdownToShutdown","resetTimer","lageServer","clearCountdown","clearTimer","concurrency","createServer","listen","timeoutHandle","globalThis","setTimeout","abort","close","clearTimeout"],"mappings":";;;;+BAgBsBA;;;eAAAA;;;+DAhBoB;qCAEN;6BACF;qBACL;mCACK;wBACR;;;;;;AAUnB,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;IACzC,MAAMM,MAAMC,QAAQD,GAAG;IACvB,MAAME,SAAS,MAAMC,IAAAA,iBAAS,EAACH;IAE/B,MAAMI,SAASC,IAAAA,eAAY;IAC3BZ,QAAQa,QAAQ,GAAGb,QAAQa,QAAQ,IAAI;IACvCb,QAAQc,OAAO,GAAGd,QAAQc,OAAO,IAAI;IACrCd,QAAQe,QAAQ,GAAGf,QAAQe,QAAQ,IAAI;IACvC,MAAMC,IAAAA,wCAAmB,EAACL,QAAQX,SAASS,OAAOQ,SAAS;IAE3DN,OAAOO,IAAI,CAAC,CAAC,0BAA0B,EAAEd,KAAK,CAAC,EAAEC,MAAM;IAEvD,MAAMc,kBAAkB,IAAIC;IAE5B,MAAMC,cAAc,MAAMC,IAAAA,8BAAiB,EAAC;QAC1Cf,KAAKC,QAAQD,GAAG;QAChBgB,gBAAgB;YACdJ;YACAK,qBAAqB,IAAMC,WAAWd,QAAQT,SAASiB,iBAAiBO;YACxEC,gBAAgBC;QAClB;QACAjB;QACAkB,aAAa7B,QAAQ6B,WAAW;QAChC1B;IACF;IACA,MAAMuB,aAAa,MAAMI,IAAAA,iBAAY,EAACT,aAAaF;IAEnD,MAAMO,WAAWK,MAAM,CAAC;QAAE3B;QAAMC;IAAK;IACrCM,OAAOO,IAAI,CAAC,CAAC,2BAA2B,EAAEd,KAAK,CAAC,EAAEC,KAAK,aAAa,EAAEH,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAI8B;AACJ,SAASP,WAAWd,MAAc,EAAET,OAAe,EAAEiB,eAAgC,EAAElB,MAAW;IAChG2B;IAEAI,gBAAgBC,WAAWC,UAAU,CAAC;QACpCvB,OAAOO,IAAI,CAAC,CAAC,uBAAuB,EAAEhB,QAAQ,QAAQ,CAAC;QACvDiB,gBAAgBgB,KAAK;QACrBlC,OAAOmC,KAAK;IACd,GAAGlC,UAAU;AACf;AAEA,SAAS0B;IACP,IAAII,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\";\nimport { getConfig } from \"@lage-run/config\";\nimport { getWorkspaceManagerRoot } from \"workspace-tools\";\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): Promise<void> {\n const { server = \"localhost:5332\", timeout = 1, tasks } = options;\n\n const { host, port } = parseServerOption(server);\n const cwd = process.cwd();\n const root = getWorkspaceManagerRoot(cwd) ?? cwd;\n const config = await getConfig(cwd);\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 await initializeReporters(logger, options, { customReporters: config.reporters, root });\n\n logger.info(`Starting server on http://${host}:${port}`);\n\n const abortController = new AbortController();\n\n const lageService = createLageService({\n 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","cwd","process","root","getWorkspaceManagerRoot","config","getConfig","logger","createLogger","logLevel","logFile","reporter","initializeReporters","customReporters","reporters","info","abortController","AbortController","lageService","createLageService","serverControls","countdownToShutdown","resetTimer","lageServer","clearCountdown","clearTimer","concurrency","createServer","listen","timeoutHandle","globalThis","setTimeout","abort","close","clearTimeout"],"mappings":";;;;+BAiBsBA;;;eAAAA;;;+DAjBoB;qCAEN;6BACF;qBACL;mCACK;wBACR;gCACc;;;;;;AAUjC,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;IACzC,MAAMM,MAAMC,QAAQD,GAAG;IACvB,MAAME,OAAOC,IAAAA,uCAAuB,EAACH,QAAQA;IAC7C,MAAMI,SAAS,MAAMC,IAAAA,iBAAS,EAACL;IAE/B,MAAMM,SAASC,IAAAA,eAAY;IAC3Bd,QAAQe,QAAQ,GAAGf,QAAQe,QAAQ,IAAI;IACvCf,QAAQgB,OAAO,GAAGhB,QAAQgB,OAAO,IAAI;IACrChB,QAAQiB,QAAQ,GAAGjB,QAAQiB,QAAQ,IAAI;IACvC,MAAMC,IAAAA,wCAAmB,EAACL,QAAQb,SAAS;QAAEmB,iBAAiBR,OAAOS,SAAS;QAAEX;IAAK;IAErFI,OAAOQ,IAAI,CAAC,CAAC,0BAA0B,EAAEjB,KAAK,CAAC,EAAEC,MAAM;IAEvD,MAAMiB,kBAAkB,IAAIC;IAE5B,MAAMC,cAAcC,IAAAA,8BAAiB,EAAC;QACpClB;QACAmB,gBAAgB;YACdJ;YACAK,qBAAqB,IAAMC,WAAWf,QAAQX,SAASoB,iBAAiBO;YACxEC,gBAAgBC;QAClB;QACAlB;QACAmB,aAAahC,QAAQgC,WAAW;QAChC7B;IACF;IACA,MAAM0B,aAAa,MAAMI,IAAAA,iBAAY,EAACT,aAAaF;IAEnD,MAAMO,WAAWK,MAAM,CAAC;QAAE9B;QAAMC;IAAK;IACrCQ,OAAOQ,IAAI,CAAC,CAAC,2BAA2B,EAAEjB,KAAK,CAAC,EAAEC,KAAK,aAAa,EAAEH,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAIiC;AACJ,SAASP,WAAWf,MAAc,EAAEX,OAAe,EAAEoB,eAAgC,EAAErB,MAAW;IAChG8B;IAEAI,gBAAgBC,WAAWC,UAAU,CAAC;QACpCxB,OAAOQ,IAAI,CAAC,CAAC,uBAAuB,EAAEnB,QAAQ,QAAQ,CAAC;QACvDoB,gBAAgBgB,KAAK;QACrBrC,OAAOsC,KAAK;IACd,GAAGrC,UAAU;AACf;AAEA,SAAS6B;IACP,IAAII,eAAe;QACjBC,WAAWI,YAAY,CAACL;IAC1B;AACF"}
@@ -22,7 +22,8 @@ function getOutputFiles(root, target, outputGlob, packageTree) {
22
22
  const sourceControlledFiles = new Set(packageTree.getPackageFiles(target.packageName ?? "", patterns));
23
23
  const outputs = (0, _globby.glob)(patterns, {
24
24
  cwd: target.cwd,
25
- gitignore: false
25
+ gitignore: false,
26
+ dot: true
26
27
  }).map((file)=>_path.default.relative(root, _path.default.join(target.cwd, file))).filter((file)=>!sourceControlledFiles.has(file));
27
28
  return outputs;
28
29
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/server/getOutputFiles.ts"],"sourcesContent":["import type { CacheOptions } from \"@lage-run/config\";\nimport { glob } from \"@lage-run/globby\";\nimport type { PackageTree } from \"@lage-run/hasher\";\nimport type { Target } from \"@lage-run/target-graph\";\n\nimport path from \"path\";\n\nexport function getOutputFiles(root: string, target: Target, outputGlob: CacheOptions[\"outputGlob\"], packageTree: PackageTree): string[] {\n const patterns = target.outputs ?? outputGlob ?? [\"**/*\"];\n\n const sourceControlledFiles = new Set(packageTree.getPackageFiles(target.packageName ?? \"\", patterns));\n const outputs = glob(patterns, { cwd: target.cwd, gitignore: false })\n .map((file) => path.relative(root, path.join(target.cwd, file)))\n .filter((file) => !sourceControlledFiles.has(file));\n\n return outputs;\n}\n"],"names":["getOutputFiles","root","target","outputGlob","packageTree","patterns","outputs","sourceControlledFiles","Set","getPackageFiles","packageName","glob","cwd","gitignore","map","file","path","relative","join","filter","has"],"mappings":";;;;+BAOgBA;;;eAAAA;;;wBANK;6DAIJ;;;;;;AAEV,SAASA,eAAeC,IAAY,EAAEC,MAAc,EAAEC,UAAsC,EAAEC,WAAwB;IAC3H,MAAMC,WAAWH,OAAOI,OAAO,IAAIH,cAAc;QAAC;KAAO;IAEzD,MAAMI,wBAAwB,IAAIC,IAAIJ,YAAYK,eAAe,CAACP,OAAOQ,WAAW,IAAI,IAAIL;IAC5F,MAAMC,UAAUK,IAAAA,YAAI,EAACN,UAAU;QAAEO,KAAKV,OAAOU,GAAG;QAAEC,WAAW;IAAM,GAChEC,GAAG,CAAC,CAACC,OAASC,aAAI,CAACC,QAAQ,CAAChB,MAAMe,aAAI,CAACE,IAAI,CAAChB,OAAOU,GAAG,EAAEG,QACxDI,MAAM,CAAC,CAACJ,OAAS,CAACR,sBAAsBa,GAAG,CAACL;IAE/C,OAAOT;AACT"}
1
+ {"version":3,"sources":["../../../src/commands/server/getOutputFiles.ts"],"sourcesContent":["import type { CacheOptions } from \"@lage-run/config\";\nimport { glob } from \"@lage-run/globby\";\nimport type { PackageTree } from \"@lage-run/hasher\";\nimport type { Target } from \"@lage-run/target-graph\";\n\nimport path from \"path\";\n\nexport function getOutputFiles(root: string, target: Target, outputGlob: CacheOptions[\"outputGlob\"], packageTree: PackageTree): string[] {\n const patterns = target.outputs ?? outputGlob ?? [\"**/*\"];\n\n const sourceControlledFiles = new Set(packageTree.getPackageFiles(target.packageName ?? \"\", patterns));\n const outputs = glob(patterns, { cwd: target.cwd, gitignore: false, dot: true })\n .map((file) => path.relative(root, path.join(target.cwd, file)))\n .filter((file) => !sourceControlledFiles.has(file));\n\n return outputs;\n}\n"],"names":["getOutputFiles","root","target","outputGlob","packageTree","patterns","outputs","sourceControlledFiles","Set","getPackageFiles","packageName","glob","cwd","gitignore","dot","map","file","path","relative","join","filter","has"],"mappings":";;;;+BAOgBA;;;eAAAA;;;wBANK;6DAIJ;;;;;;AAEV,SAASA,eAAeC,IAAY,EAAEC,MAAc,EAAEC,UAAsC,EAAEC,WAAwB;IAC3H,MAAMC,WAAWH,OAAOI,OAAO,IAAIH,cAAc;QAAC;KAAO;IAEzD,MAAMI,wBAAwB,IAAIC,IAAIJ,YAAYK,eAAe,CAACP,OAAOQ,WAAW,IAAI,IAAIL;IAC5F,MAAMC,UAAUK,IAAAA,YAAI,EAACN,UAAU;QAAEO,KAAKV,OAAOU,GAAG;QAAEC,WAAW;QAAOC,KAAK;IAAK,GAC3EC,GAAG,CAAC,CAACC,OAASC,aAAI,CAACC,QAAQ,CAACjB,MAAMgB,aAAI,CAACE,IAAI,CAACjB,OAAOU,GAAG,EAAEI,QACxDI,MAAM,CAAC,CAACJ,OAAS,CAACT,sBAAsBc,GAAG,CAACL;IAE/C,OAAOV;AACT"}
@@ -12,5 +12,5 @@ interface CreateLageServiceOptions {
12
12
  concurrency?: number;
13
13
  tasks: string[];
14
14
  }
15
- export declare function createLageService({ cwd, serverControls, logger, concurrency, tasks, }: CreateLageServiceOptions): Promise<ILageService>;
15
+ export declare function createLageService({ cwd, serverControls, logger, concurrency, tasks }: CreateLageServiceOptions): ILageService;
16
16
  export {};
@@ -130,8 +130,9 @@ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg,
130
130
  initializedPromise = createInitializedPromise(options);
131
131
  return initializedPromise;
132
132
  }
133
- async function createLageService({ cwd, serverControls, logger, concurrency, tasks }) {
133
+ function createLageService({ cwd, serverControls, logger, concurrency, tasks }) {
134
134
  return {
135
+ // eslint-disable-next-line @typescript-eslint/require-await
135
136
  async ping () {
136
137
  return {
137
138
  pong: true
@@ -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 { ConnectError, Code, type ILageService } from \"@lage-run/rpc\";\nimport { getStartTargetId, getTargetId, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceManagerRoot } 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 { MemoryStream } from \"./MemoryStream.js\";\nimport { getBuiltInRunners } from \"../../getBuiltInRunners.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\";\nimport { getGlobalInputHashFilePath, getHashFilePath } from \"../targetHashFilePath.js\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\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 = getWorkspaceManagerRoot(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 enableTargetConfigMerging: config.enableTargetConfigMerging,\n enablePhantomTargetOptimization: config.enablePhantomTargetOptimization,\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 ...getBuiltInRunners({ nodeArg, npmCmd: 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 void 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 logger.info(\"done initializing\");\n return { config, targetGraph, packageTree, dependencyMap, root, pool, 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\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, 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 = getBuiltInRunners({ nodeArg: request.nodeOptions, npmCmd: config.npmClient, taskArgs: 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 let results: {\n packageName?: string;\n task: string;\n cwd: string;\n exitCode: number;\n inputs: string[];\n outputs: string[];\n stdout: string;\n stderr: string;\n id: string;\n globalInputHashFile: 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 // Write the target hash to a file for its dependants to use\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 const targetGlobalInputHashRelativePath = getGlobalInputHashFilePath(target);\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 const targetHashFileRelativePath = path.relative(root, targetHashFullPath).replace(/\\\\/g, \"/\");\n outputs.push(targetHashFileRelativePath);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n cwd: target.cwd,\n exitCode: 0,\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n const targetHashFileRelativePath = path.relative(root, targetHashFullPath).replace(/\\\\/g, \"/\");\n outputs.push(targetHashFileRelativePath);\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 cwd: target.cwd,\n exitCode: 1,\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\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 cwd: results.cwd,\n exitCode: results.exitCode,\n inputs: results.inputs,\n outputs: results.outputs,\n id: results.id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\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","getWorkspaceManagerRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","enablePhantomTargetOptimization","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","getBuiltInRunners","npmCmd","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","results","inputs","getInputFiles","dep","getStartTargetId","depTarget","push","path","relative","getHashFilePath","replace","targetHashFile","targetHashFullPath","fs","existsSync","dirname","mkdirSync","recursive","writeFileSync","hash","e","ConnectError","Code","Internal","targetGlobalInputHashRelativePath","getGlobalInputHashFilePath","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","targetHashFileRelativePath","toString","globalInputHashFile","Error","JSON","stringify"],"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 TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceManagerRoot } 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 { MemoryStream } from \"./MemoryStream.js\";\nimport { getBuiltInRunners } from \"../../getBuiltInRunners.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\";\nimport { getGlobalInputHashFilePath, getHashFilePath } from \"../targetHashFilePath.js\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\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 = getWorkspaceManagerRoot(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 enableTargetConfigMerging: config.enableTargetConfigMerging,\n enablePhantomTargetOptimization: config.enablePhantomTargetOptimization,\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 ...getBuiltInRunners({ nodeArg, npmCmd: 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 void 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 logger.info(\"done initializing\");\n return { config, targetGraph, packageTree, dependencyMap, root, pool, 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\nexport function createLageService({ cwd, serverControls, logger, concurrency, tasks }: CreateLageServiceOptions): ILageService {\n return {\n // eslint-disable-next-line @typescript-eslint/require-await\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, 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 = getBuiltInRunners({ nodeArg: request.nodeOptions, npmCmd: config.npmClient, taskArgs: 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 let results: {\n packageName?: string;\n task: string;\n cwd: string;\n exitCode: number;\n inputs: string[];\n outputs: string[];\n stdout: string;\n stderr: string;\n id: string;\n globalInputHashFile: 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 // Write the target hash to a file for its dependants to use\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 const targetGlobalInputHashRelativePath = getGlobalInputHashFilePath(target);\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 const targetHashFileRelativePath = path.relative(root, targetHashFullPath).replace(/\\\\/g, \"/\");\n outputs.push(targetHashFileRelativePath);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n cwd: target.cwd,\n exitCode: 0,\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n const targetHashFileRelativePath = path.relative(root, targetHashFullPath).replace(/\\\\/g, \"/\");\n outputs.push(targetHashFileRelativePath);\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 cwd: target.cwd,\n exitCode: 1,\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\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 cwd: results.cwd,\n exitCode: results.exitCode,\n inputs: results.inputs,\n outputs: results.outputs,\n id: results.id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\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","getWorkspaceManagerRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","enablePhantomTargetOptimization","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","getBuiltInRunners","npmCmd","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","results","inputs","getInputFiles","dep","getStartTargetId","depTarget","push","path","relative","getHashFilePath","replace","targetHashFile","targetHashFullPath","fs","existsSync","dirname","mkdirSync","recursive","writeFileSync","hash","e","ConnectError","Code","Internal","targetGlobalInputHashRelativePath","getGlobalInputHashFilePath","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","targetHashFileRelativePath","toString","globalInputHashFile","Error","JSON","stringify"],"mappings":"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"}