@lage-run/cli 0.34.0 → 0.34.1

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 (42) 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 +5 -2
  7. package/lib/commands/exec/executeRemotely.js.map +1 -1
  8. package/lib/commands/info/action.d.ts +7 -1
  9. package/lib/commands/info/action.js +13 -9
  10. package/lib/commands/info/action.js.map +1 -1
  11. package/lib/commands/initializeReporters.d.ts +2 -1
  12. package/lib/commands/initializeReporters.js +3 -3
  13. package/lib/commands/initializeReporters.js.map +1 -1
  14. package/lib/commands/run/createTargetGraph.d.ts +2 -2
  15. package/lib/commands/run/createTargetGraph.js +26 -8
  16. package/lib/commands/run/createTargetGraph.js.map +1 -1
  17. package/lib/commands/run/runAction.js +5 -2
  18. package/lib/commands/run/runAction.js.map +1 -1
  19. package/lib/commands/run/watchAction.js +2 -2
  20. package/lib/commands/run/watchAction.js.map +1 -1
  21. package/lib/commands/server/action.js +7 -2
  22. package/lib/commands/server/action.js.map +1 -1
  23. package/lib/filter/getFilteredPackages.js +11 -2
  24. package/lib/filter/getFilteredPackages.js.map +1 -1
  25. package/lib/filter/hasRepoChanged.d.ts +13 -1
  26. package/lib/filter/hasRepoChanged.js +14 -12
  27. package/lib/filter/hasRepoChanged.js.map +1 -1
  28. package/lib/index.d.ts +4 -2
  29. package/lib/internal.d.ts +1 -0
  30. package/lib/internal.js +4 -0
  31. package/lib/internal.js.map +1 -0
  32. package/lib/optimizeTargetGraph.js +1 -1
  33. package/lib/optimizeTargetGraph.js.map +1 -1
  34. package/lib/types/ReporterInitOptions.d.ts +4 -0
  35. package/lib/types/ReporterInitOptions.js.map +1 -1
  36. package/package.json +10 -10
  37. package/lib/cache/isRunningFromCI.d.ts +0 -1
  38. package/lib/cache/isRunningFromCI.js +0 -11
  39. package/lib/cache/isRunningFromCI.js.map +0 -1
  40. package/lib/commands/isRunningFromCI.d.ts +0 -1
  41. package/lib/commands/isRunningFromCI.js +0 -11
  42. package/lib/commands/isRunningFromCI.js.map +0 -1
@@ -1,3 +1,25 @@
1
1
  import type { ReporterInitOptions } from "../types/ReporterInitOptions.js";
2
2
  import type { Reporter } from "@lage-run/logger";
3
- export declare function createReporter(reporter: string, options: ReporterInitOptions, customReporters?: Record<string, string>): Promise<Reporter>;
3
+ export interface CustomReportersOptions {
4
+ customReporters: Record<string, string> | undefined;
5
+ /** Monorepo root for resolving custom reporters*/
6
+ root: string;
7
+ }
8
+ type MockImportReporter = (params: {
9
+ reporterName: string;
10
+ resolvedPath: string;
11
+ }) => unknown;
12
+ /**
13
+ * Mock the reporter importing for tests. We don't currently support ESM in Jest, and it's too much
14
+ * of a headache to set it up for one package, so instead we mock for most cases and handle a few
15
+ * full realistic cases in the e2e tests.
16
+ */
17
+ export declare function setMockImportReporter(mock: MockImportReporter | undefined): void;
18
+ /**
19
+ * Create a reporter of the given type.
20
+ *
21
+ * NOTE: This is covered by tests in `initializeReporter.test.ts`, `customReporter.test.ts`, and
22
+ * E2E `customReporter.test.ts`.
23
+ */
24
+ export declare function createReporter(reporter: string, options: ReporterInitOptions, customReportersOptions: CustomReportersOptions | undefined): Promise<Reporter>;
25
+ export {};
@@ -2,16 +2,24 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "createReporter", {
6
- enumerable: true,
7
- get: function() {
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get createReporter () {
8
13
  return createReporter;
14
+ },
15
+ get setMockImportReporter () {
16
+ return setMockImportReporter;
9
17
  }
10
18
  });
11
19
  const _logger = require("@lage-run/logger");
12
20
  const _reporters = require("@lage-run/reporters");
13
21
  const _workspacetools = require("workspace-tools");
14
- const _fs = require("fs");
22
+ const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
15
23
  const _path = /*#__PURE__*/ _interop_require_default(require("path"));
16
24
  const _url = require("url");
17
25
  const _isinteractive = /*#__PURE__*/ _interop_require_default(require("is-interactive"));
@@ -20,11 +28,15 @@ function _interop_require_default(obj) {
20
28
  default: obj
21
29
  };
22
30
  }
23
- async function createReporter(reporter, options, customReporters = {}) {
31
+ let mockImportReporter;
32
+ function setMockImportReporter(mock) {
33
+ mockImportReporter = mock;
34
+ }
35
+ async function createReporter(reporter, options, customReportersOptions) {
24
36
  const { verbose, grouped, logLevel: logLevelName, concurrency, profile, progress, logFile, indented } = options;
25
37
  const logLevel = _logger.LogLevel[logLevelName];
26
- const root = (0, _workspacetools.findPackageRoot)(__filename);
27
- const packageJson = JSON.parse((0, _fs.readFileSync)(_path.default.join(root, "package.json"), "utf-8"));
38
+ const lageRoot = (0, _workspacetools.findPackageRoot)(__filename);
39
+ const packageJson = JSON.parse(_fs.default.readFileSync(_path.default.join(lageRoot, "package.json"), "utf-8"));
28
40
  const version = packageJson.version;
29
41
  switch(reporter){
30
42
  case "profile":
@@ -65,26 +77,8 @@ async function createReporter(reporter, options, customReporters = {}) {
65
77
  return new _reporters.VerboseFileLogReporter(logFile);
66
78
  }
67
79
  // Check if it's a custom reporter defined in config
68
- if (customReporters && customReporters[reporter]) {
69
- const reporterPath = customReporters[reporter];
70
- const resolvedPath = _path.default.isAbsolute(reporterPath) ? reporterPath : _path.default.resolve(process.cwd(), reporterPath);
71
- try {
72
- // Use dynamic import to load the custom reporter module
73
- // This works with both ESM (.mjs, .js with type: module) and CommonJS (.cjs, .js) files
74
- const reporterModule = await import((0, _url.pathToFileURL)(resolvedPath).href);
75
- // Try different export patterns
76
- const ReporterClass = reporterModule.default ?? reporterModule[reporter] ?? reporterModule;
77
- if (typeof ReporterClass === "function") {
78
- return new ReporterClass(options);
79
- } else if (typeof ReporterClass === "object" && ReporterClass !== null) {
80
- // If it's already an instance
81
- return ReporterClass;
82
- } else {
83
- throw new Error(`Custom reporter "${reporter}" at "${resolvedPath}" does not export a valid reporter class or instance.`);
84
- }
85
- } catch (error) {
86
- throw new Error(`Failed to load custom reporter "${reporter}" from "${resolvedPath}": ${error}`);
87
- }
80
+ if (customReportersOptions?.customReporters?.[reporter]) {
81
+ return loadCustomReporterModule(reporter, options, customReportersOptions);
88
82
  }
89
83
  // Default reporter behavior - auto-detect CI environments
90
84
  if (process.env.GITHUB_ACTIONS) {
@@ -110,3 +104,33 @@ async function createReporter(reporter, options, customReporters = {}) {
110
104
  logLevel: verbose ? _logger.LogLevel.verbose : logLevel
111
105
  });
112
106
  }
107
+ async function loadCustomReporterModule(reporter, options, customReportersOptions) {
108
+ const { customReporters, root } = customReportersOptions;
109
+ const resolvedPath = _path.default.resolve(root, customReporters[reporter]);
110
+ if (!_fs.default.existsSync(resolvedPath)) {
111
+ throw new Error(`Custom reporter "${reporter}" file "${resolvedPath}" does not exist`);
112
+ }
113
+ let reporterInstance;
114
+ try {
115
+ // Use dynamic import to load the custom reporter module
116
+ // This works with both ESM (.mjs, .js with type: module) and CommonJS (.cjs, .js) files
117
+ const reporterModule = mockImportReporter ? mockImportReporter({
118
+ reporterName: reporter,
119
+ resolvedPath
120
+ }) : await import((0, _url.pathToFileURL)(resolvedPath).href);
121
+ // Try different export patterns
122
+ const maybeReporter = reporterModule[reporter] ?? reporterModule.default ?? reporterModule;
123
+ if (typeof maybeReporter === "function") {
124
+ reporterInstance = new maybeReporter(options);
125
+ } else if (maybeReporter && typeof maybeReporter === "object") {
126
+ reporterInstance = maybeReporter;
127
+ }
128
+ } catch (error) {
129
+ throw new Error(`Failed to load custom reporter "${reporter}" from "${resolvedPath}": ${error}`);
130
+ }
131
+ if (reporterInstance && typeof reporterInstance.log === "function" && typeof reporterInstance.summarize === "function") {
132
+ return reporterInstance;
133
+ }
134
+ const issue = reporterInstance ? "does not implement the Reporter interface (missing log or summarize method)" : "does not export a valid reporter class or instance";
135
+ throw new Error(`Custom reporter "${reporter}" at "${resolvedPath}" ${issue}`);
136
+ }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/createReporter.ts"],"sourcesContent":["import { LogLevel } from \"@lage-run/logger\";\nimport {\n JsonReporter,\n AdoReporter,\n GithubActionsReporter,\n LogReporter,\n ProgressReporter,\n BasicReporter,\n VerboseFileLogReporter,\n ChromeTraceEventsReporter,\n} from \"@lage-run/reporters\";\nimport type { BuiltInReporterName, ReporterInitOptions } from \"../types/ReporterInitOptions.js\";\nimport type { Reporter } from \"@lage-run/logger\";\nimport { findPackageRoot } from \"workspace-tools\";\nimport { readFileSync } from \"fs\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport isInteractive from \"is-interactive\";\n\nexport async function createReporter(\n reporter: string,\n options: ReporterInitOptions,\n customReporters: Record<string, string> = {}\n): Promise<Reporter> {\n const { verbose, grouped, logLevel: logLevelName, concurrency, profile, progress, logFile, indented } = options;\n const logLevel = LogLevel[logLevelName];\n\n const root = findPackageRoot(__filename)!;\n const packageJson = JSON.parse(readFileSync(path.join(root, \"package.json\"), \"utf-8\"));\n const version = packageJson.version;\n\n switch (reporter as BuiltInReporterName) {\n case \"profile\":\n return new ChromeTraceEventsReporter({\n concurrency,\n outputFile: typeof profile === \"string\" ? profile : undefined,\n });\n case \"json\":\n return new JsonReporter({ logLevel, indented: indented ?? false });\n case \"azureDevops\":\n case \"adoLog\":\n return new AdoReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });\n\n case \"githubActions\":\n case \"gha\":\n return new GithubActionsReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });\n\n case \"npmLog\":\n case \"old\":\n return new LogReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });\n\n case \"fancy\":\n return new ProgressReporter({ concurrency, version });\n\n case \"verboseFileLog\":\n case \"vfl\":\n return new VerboseFileLogReporter(logFile);\n }\n\n // Check if it's a custom reporter defined in config\n if (customReporters && customReporters[reporter]) {\n const reporterPath = customReporters[reporter];\n const resolvedPath = path.isAbsolute(reporterPath) ? reporterPath : path.resolve(process.cwd(), reporterPath);\n\n try {\n // Use dynamic import to load the custom reporter module\n // This works with both ESM (.mjs, .js with type: module) and CommonJS (.cjs, .js) files\n const reporterModule = await import(pathToFileURL(resolvedPath).href);\n\n // Try different export patterns\n const ReporterClass = reporterModule.default ?? reporterModule[reporter] ?? reporterModule;\n\n if (typeof ReporterClass === \"function\") {\n return new ReporterClass(options);\n } else if (typeof ReporterClass === \"object\" && ReporterClass !== null) {\n // If it's already an instance\n return ReporterClass;\n } else {\n throw new Error(`Custom reporter \"${reporter}\" at \"${resolvedPath}\" does not export a valid reporter class or instance.`);\n }\n } catch (error) {\n throw new Error(`Failed to load custom reporter \"${reporter}\" from \"${resolvedPath}\": ${error}`);\n }\n }\n\n // Default reporter behavior - auto-detect CI environments\n if (process.env.GITHUB_ACTIONS) {\n return new GithubActionsReporter({ grouped: true, logLevel: verbose ? LogLevel.verbose : logLevel });\n }\n\n if (process.env.TF_BUILD) {\n return new AdoReporter({ grouped: true, logLevel: verbose ? LogLevel.verbose : logLevel });\n }\n\n if (progress && isInteractive() && !(logLevel >= LogLevel.verbose || verbose || grouped)) {\n return new BasicReporter({ concurrency, version });\n }\n\n return new LogReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });\n}\n"],"names":["createReporter","reporter","options","customReporters","verbose","grouped","logLevel","logLevelName","concurrency","profile","progress","logFile","indented","LogLevel","root","findPackageRoot","__filename","packageJson","JSON","parse","readFileSync","path","join","version","ChromeTraceEventsReporter","outputFile","undefined","JsonReporter","AdoReporter","GithubActionsReporter","LogReporter","ProgressReporter","VerboseFileLogReporter","reporterPath","resolvedPath","isAbsolute","resolve","process","cwd","reporterModule","pathToFileURL","href","ReporterClass","default","Error","error","env","GITHUB_ACTIONS","TF_BUILD","isInteractive","BasicReporter"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/commands/createReporter.ts"],"sourcesContent":["import { LogLevel } from \"@lage-run/logger\";\nimport {\n JsonReporter,\n AdoReporter,\n GithubActionsReporter,\n LogReporter,\n ProgressReporter,\n BasicReporter,\n VerboseFileLogReporter,\n ChromeTraceEventsReporter,\n} from \"@lage-run/reporters\";\nimport type { BuiltInReporterName, ReporterInitOptions } from \"../types/ReporterInitOptions.js\";\nimport type { Reporter } from \"@lage-run/logger\";\nimport { findPackageRoot } from \"workspace-tools\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport isInteractive from \"is-interactive\";\n\nexport interface CustomReportersOptions {\n customReporters: Record<string, string> | undefined;\n /** Monorepo root for resolving custom reporters*/\n root: string;\n}\n\ntype MockImportReporter = (params: { reporterName: string; resolvedPath: string }) => unknown;\n\nlet mockImportReporter: MockImportReporter | undefined;\n\n/**\n * Mock the reporter importing for tests. We don't currently support ESM in Jest, and it's too much\n * of a headache to set it up for one package, so instead we mock for most cases and handle a few\n * full realistic cases in the e2e tests.\n */\nexport function setMockImportReporter(mock: MockImportReporter | undefined): void {\n mockImportReporter = mock;\n}\n\n/**\n * Create a reporter of the given type.\n *\n * NOTE: This is covered by tests in `initializeReporter.test.ts`, `customReporter.test.ts`, and\n * E2E `customReporter.test.ts`.\n */\nexport async function createReporter(\n reporter: string,\n options: ReporterInitOptions,\n customReportersOptions: CustomReportersOptions | undefined\n): Promise<Reporter> {\n const { verbose, grouped, logLevel: logLevelName, concurrency, profile, progress, logFile, indented } = options;\n const logLevel = LogLevel[logLevelName];\n\n const lageRoot = findPackageRoot(__filename)!;\n const packageJson = JSON.parse(fs.readFileSync(path.join(lageRoot, \"package.json\"), \"utf-8\"));\n const version = packageJson.version;\n\n switch (reporter as BuiltInReporterName) {\n case \"profile\":\n return new ChromeTraceEventsReporter({\n concurrency,\n outputFile: typeof profile === \"string\" ? profile : undefined,\n });\n case \"json\":\n return new JsonReporter({ logLevel, indented: indented ?? false });\n case \"azureDevops\":\n case \"adoLog\":\n return new AdoReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });\n\n case \"githubActions\":\n case \"gha\":\n return new GithubActionsReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });\n\n case \"npmLog\":\n case \"old\":\n return new LogReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });\n\n case \"fancy\":\n return new ProgressReporter({ concurrency, version });\n\n case \"verboseFileLog\":\n case \"vfl\":\n return new VerboseFileLogReporter(logFile);\n }\n\n // Check if it's a custom reporter defined in config\n if (customReportersOptions?.customReporters?.[reporter]) {\n return loadCustomReporterModule(reporter, options, customReportersOptions);\n }\n\n // Default reporter behavior - auto-detect CI environments\n if (process.env.GITHUB_ACTIONS) {\n return new GithubActionsReporter({ grouped: true, logLevel: verbose ? LogLevel.verbose : logLevel });\n }\n\n if (process.env.TF_BUILD) {\n return new AdoReporter({ grouped: true, logLevel: verbose ? LogLevel.verbose : logLevel });\n }\n\n if (progress && isInteractive() && !(logLevel >= LogLevel.verbose || verbose || grouped)) {\n return new BasicReporter({ concurrency, version });\n }\n\n return new LogReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });\n}\n\nasync function loadCustomReporterModule(\n reporter: string,\n options: ReporterInitOptions,\n customReportersOptions: Required<CustomReportersOptions>\n): Promise<Reporter> {\n const { customReporters, root } = customReportersOptions;\n const resolvedPath = path.resolve(root, customReporters![reporter]);\n\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`Custom reporter \"${reporter}\" file \"${resolvedPath}\" does not exist`);\n }\n\n let reporterInstance: Reporter | undefined;\n try {\n // Use dynamic import to load the custom reporter module\n // This works with both ESM (.mjs, .js with type: module) and CommonJS (.cjs, .js) files\n const reporterModule = mockImportReporter\n ? mockImportReporter({ reporterName: reporter, resolvedPath })\n : await import(pathToFileURL(resolvedPath).href);\n\n // Try different export patterns\n const maybeReporter = reporterModule[reporter] ?? reporterModule.default ?? reporterModule;\n\n if (typeof maybeReporter === \"function\") {\n reporterInstance = new maybeReporter(options);\n } else if (maybeReporter && typeof maybeReporter === \"object\") {\n reporterInstance = maybeReporter;\n }\n } catch (error) {\n throw new Error(`Failed to load custom reporter \"${reporter}\" from \"${resolvedPath}\": ${error}`);\n }\n\n if (reporterInstance && typeof reporterInstance.log === \"function\" && typeof reporterInstance.summarize === \"function\") {\n return reporterInstance;\n }\n\n const issue = reporterInstance\n ? \"does not implement the Reporter interface (missing log or summarize method)\"\n : \"does not export a valid reporter class or instance\";\n throw new Error(`Custom reporter \"${reporter}\" at \"${resolvedPath}\" ${issue}`);\n}\n"],"names":["createReporter","setMockImportReporter","mockImportReporter","mock","reporter","options","customReportersOptions","verbose","grouped","logLevel","logLevelName","concurrency","profile","progress","logFile","indented","LogLevel","lageRoot","findPackageRoot","__filename","packageJson","JSON","parse","fs","readFileSync","path","join","version","ChromeTraceEventsReporter","outputFile","undefined","JsonReporter","AdoReporter","GithubActionsReporter","LogReporter","ProgressReporter","VerboseFileLogReporter","customReporters","loadCustomReporterModule","process","env","GITHUB_ACTIONS","TF_BUILD","isInteractive","BasicReporter","root","resolvedPath","resolve","existsSync","Error","reporterInstance","reporterModule","reporterName","pathToFileURL","href","maybeReporter","default","error","log","summarize","issue"],"mappings":"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"}
@@ -13,6 +13,7 @@ const _initializeReporters = require("../initializeReporters.js");
13
13
  const _executeInProcess = require("./executeInProcess.js");
14
14
  const _executeRemotely = require("./executeRemotely.js");
15
15
  const _config = require("@lage-run/config");
16
+ const _workspacetools = require("workspace-tools");
16
17
  function _interop_require_default(obj) {
17
18
  return obj && obj.__esModule ? obj : {
18
19
  default: obj
@@ -20,12 +21,16 @@ function _interop_require_default(obj) {
20
21
  }
21
22
  async function execAction(options, command) {
22
23
  const cwd = options.cwd ?? process.cwd();
24
+ const root = (0, _workspacetools.getWorkspaceManagerRoot)(cwd) ?? cwd;
23
25
  const config = await (0, _config.getConfig)(cwd);
24
26
  const logger = (0, _logger.default)();
25
27
  options.cwd = cwd;
26
28
  options.logLevel = options.logLevel ?? "info";
27
29
  options.reporter = options.reporter ?? "json";
28
- await (0, _initializeReporters.initializeReporters)(logger, options, config.reporters);
30
+ await (0, _initializeReporters.initializeReporters)(logger, options, {
31
+ customReporters: config.reporters,
32
+ root
33
+ });
29
34
  const { server } = options;
30
35
  if (server) {
31
36
  logger.info("Running in server mode");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/exec/action.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport createLogger from \"@lage-run/logger\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { executeInProcess } from \"./executeInProcess.js\";\nimport { executeRemotely } from \"./executeRemotely.js\";\nimport { getConfig } from \"@lage-run/config\";\n\ninterface ExecOptions extends ReporterInitOptions {\n cwd?: string;\n server?: boolean | string;\n timeout?: number;\n nodeArg?: string;\n tasks?: string[];\n}\n\ninterface ExecRemoteOptions extends ExecOptions {\n tasks: string[];\n}\n\nexport async function execAction(options: ExecOptions, command: Command): Promise<void> {\n const cwd = options.cwd ?? process.cwd();\n const config = await getConfig(cwd);\n const logger = createLogger();\n options.cwd = cwd;\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n await initializeReporters(logger, options, config.reporters);\n\n const { server } = options;\n if (server) {\n logger.info(\"Running in server mode\");\n\n if (typeof options.tasks === \"undefined\") {\n throw new Error(\"No tasks specified, this is required for when running in server mode\");\n }\n\n await executeRemotely(options as ExecRemoteOptions, command);\n } else {\n await executeInProcess({ logger, args: command.args, cwd: options.cwd, nodeArg: options.nodeArg });\n }\n}\n"],"names":["execAction","options","command","cwd","process","config","getConfig","logger","createLogger","logLevel","reporter","initializeReporters","reporters","server","info","tasks","Error","executeRemotely","executeInProcess","args","nodeArg"],"mappings":";;;;+BAoBsBA;;;eAAAA;;;+DAnBG;qCAEW;kCACH;iCACD;wBACN;;;;;;AAcnB,eAAeA,WAAWC,OAAoB,EAAEC,OAAgB;IACrE,MAAMC,MAAMF,QAAQE,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAME,SAAS,MAAMC,IAAAA,iBAAS,EAACH;IAC/B,MAAMI,SAASC,IAAAA,eAAY;IAC3BP,QAAQE,GAAG,GAAGA;IACdF,QAAQQ,QAAQ,GAAGR,QAAQQ,QAAQ,IAAI;IACvCR,QAAQS,QAAQ,GAAGT,QAAQS,QAAQ,IAAI;IACvC,MAAMC,IAAAA,wCAAmB,EAACJ,QAAQN,SAASI,OAAOO,SAAS;IAE3D,MAAM,EAAEC,MAAM,EAAE,GAAGZ;IACnB,IAAIY,QAAQ;QACVN,OAAOO,IAAI,CAAC;QAEZ,IAAI,OAAOb,QAAQc,KAAK,KAAK,aAAa;YACxC,MAAM,IAAIC,MAAM;QAClB;QAEA,MAAMC,IAAAA,gCAAe,EAAChB,SAA8BC;IACtD,OAAO;QACL,MAAMgB,IAAAA,kCAAgB,EAAC;YAAEX;YAAQY,MAAMjB,QAAQiB,IAAI;YAAEhB,KAAKF,QAAQE,GAAG;YAAEiB,SAASnB,QAAQmB,OAAO;QAAC;IAClG;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/exec/action.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport createLogger from \"@lage-run/logger\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { executeInProcess } from \"./executeInProcess.js\";\nimport { executeRemotely } from \"./executeRemotely.js\";\nimport { getConfig } from \"@lage-run/config\";\nimport { getWorkspaceManagerRoot } from \"workspace-tools\";\n\ninterface ExecOptions extends ReporterInitOptions {\n cwd?: string;\n server?: boolean | string;\n timeout?: number;\n nodeArg?: string;\n tasks?: string[];\n}\n\ninterface ExecRemoteOptions extends ExecOptions {\n tasks: string[];\n}\n\nexport async function execAction(options: ExecOptions, command: Command): Promise<void> {\n const cwd = options.cwd ?? process.cwd();\n const root = getWorkspaceManagerRoot(cwd) ?? cwd;\n const config = await getConfig(cwd);\n const logger = createLogger();\n options.cwd = cwd;\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n await initializeReporters(logger, options, { customReporters: config.reporters, root });\n\n const { server } = options;\n if (server) {\n logger.info(\"Running in server mode\");\n\n if (typeof options.tasks === \"undefined\") {\n throw new Error(\"No tasks specified, this is required for when running in server mode\");\n }\n\n await executeRemotely(options as ExecRemoteOptions, command);\n } else {\n await executeInProcess({ logger, args: command.args, cwd: options.cwd, nodeArg: options.nodeArg });\n }\n}\n"],"names":["execAction","options","command","cwd","process","root","getWorkspaceManagerRoot","config","getConfig","logger","createLogger","logLevel","reporter","initializeReporters","customReporters","reporters","server","info","tasks","Error","executeRemotely","executeInProcess","args","nodeArg"],"mappings":";;;;+BAqBsBA;;;eAAAA;;;+DApBG;qCAEW;kCACH;iCACD;wBACN;gCACc;;;;;;AAcjC,eAAeA,WAAWC,OAAoB,EAAEC,OAAgB;IACrE,MAAMC,MAAMF,QAAQE,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAME,OAAOC,IAAAA,uCAAuB,EAACH,QAAQA;IAC7C,MAAMI,SAAS,MAAMC,IAAAA,iBAAS,EAACL;IAC/B,MAAMM,SAASC,IAAAA,eAAY;IAC3BT,QAAQE,GAAG,GAAGA;IACdF,QAAQU,QAAQ,GAAGV,QAAQU,QAAQ,IAAI;IACvCV,QAAQW,QAAQ,GAAGX,QAAQW,QAAQ,IAAI;IACvC,MAAMC,IAAAA,wCAAmB,EAACJ,QAAQR,SAAS;QAAEa,iBAAiBP,OAAOQ,SAAS;QAAEV;IAAK;IAErF,MAAM,EAAEW,MAAM,EAAE,GAAGf;IACnB,IAAIe,QAAQ;QACVP,OAAOQ,IAAI,CAAC;QAEZ,IAAI,OAAOhB,QAAQiB,KAAK,KAAK,aAAa;YACxC,MAAM,IAAIC,MAAM;QAClB;QAEA,MAAMC,IAAAA,gCAAe,EAACnB,SAA8BC;IACtD,OAAO;QACL,MAAMmB,IAAAA,kCAAgB,EAAC;YAAEZ;YAAQa,MAAMpB,QAAQoB,IAAI;YAAEnB,KAAKF,QAAQE,GAAG;YAAEoB,SAAStB,QAAQsB,OAAO;QAAC;IAClG;AACF"}
@@ -93,12 +93,15 @@ async function executeRemotely(options, command) {
93
93
  const timeout = options.timeout ?? 5 * 60;
94
94
  const { host, port } = (0, _parseServerOption.parseServerOption)(server);
95
95
  const cwd = options.cwd ?? process.cwd();
96
+ const root = (0, _workspacetools.getWorkspaceManagerRoot)(cwd) ?? cwd;
96
97
  const config = await (0, _config.getConfig)(cwd);
97
98
  const logger = (0, _logger.default)();
98
99
  options.logLevel = options.logLevel ?? "info";
99
100
  options.reporter = options.reporter ?? "json";
100
- await (0, _initializeReporters.initializeReporters)(logger, options, config.reporters);
101
- const root = (0, _workspacetools.getWorkspaceManagerRoot)(options.cwd ?? process.cwd());
101
+ await (0, _initializeReporters.initializeReporters)(logger, options, {
102
+ customReporters: config.reporters,
103
+ root
104
+ });
102
105
  let client = await tryCreateClient(host, port);
103
106
  const args = command.args;
104
107
  logger.info(`Command args ${command.args.join(" ")}`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/exec/executeRemotely.ts"],"sourcesContent":["import path from \"path\";\nimport type { Logger } from \"@lage-run/logger\";\nimport createLogger from \"@lage-run/logger\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { LageClient } from \"@lage-run/rpc\";\nimport { ConnectError, createClient } from \"@lage-run/rpc\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport { simulateFileAccess } from \"./simulateFileAccess.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport { getConfig } from \"@lage-run/config\";\nimport { getWorkspaceManagerRoot } from \"workspace-tools\";\nimport type { Command } from \"commander\";\nimport { launchServerInBackground } from \"../launchServerInBackground.js\";\n\ninterface ExecRemotelyOptions extends ReporterInitOptions {\n cwd?: string;\n server?: string | boolean;\n timeout?: number;\n tasks: string[];\n nodeArg?: string;\n}\n\nasync function tryCreateClient(host: string, port: number) {\n const client = createClient({\n baseUrl: `http://${host}:${port}`,\n httpVersion: \"2\",\n });\n\n try {\n const success = await client.ping({});\n if (success.pong) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n return undefined;\n }\n\n throw e;\n }\n\n return undefined;\n}\n\nasync function tryCreateClientWithRetries(host: string, port: number, logger: Logger) {\n let client: ReturnType<typeof createClient> | undefined;\n\n const start = Date.now();\n while (Date.now() - start < 5 * 1000) {\n try {\n client = await tryCreateClient(host, port);\n\n if (client) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n logger.error(\"Error connecting to server\", e);\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n return undefined;\n}\n\nasync function executeOnServer(args: string[], client: LageClient, logger: Logger) {\n const task = args.length === 1 ? args[0] : args[1];\n const packageName = args.length > 1 ? args[0] : undefined;\n\n if (!task) {\n throw new Error(\"No task provided\");\n }\n\n const { taskArgs } = filterArgsForTasks(args ?? []);\n\n try {\n const response = await client.runTarget({\n packageName,\n task,\n taskArgs,\n });\n logger.info(`Task ${response.packageName} ${response.task} exited with code ${response.exitCode}`);\n return response;\n } catch (error) {\n if (error instanceof ConnectError) {\n logger.error(\"Error connecting to server\", { error });\n } else {\n logger.error(\"Error running task\", { error });\n }\n }\n}\n\nexport async function executeRemotely(options: ExecRemotelyOptions, command: Command): Promise<void> {\n // launch a 'lage-server.js' process, detached if it is not already running\n // send the command to the server process\n const { server, tasks, nodeArg } = options;\n const timeout = options.timeout ?? 5 * 60;\n\n const { host, port } = parseServerOption(server);\n const cwd = options.cwd ?? process.cwd();\n const config = await getConfig(cwd);\n\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n await initializeReporters(logger, options, config.reporters);\n\n const root = getWorkspaceManagerRoot(options.cwd ?? process.cwd())!;\n\n let client = await tryCreateClient(host, port);\n const args = command.args;\n\n logger.info(`Command args ${command.args.join(\" \")}`);\n\n if (!client) {\n await launchServerInBackground({\n host,\n port,\n tasks,\n args,\n timeout,\n logger,\n root,\n nodeArg,\n });\n\n logger.info(\"Creating a client to connect to the background services\");\n client = await tryCreateClientWithRetries(host, port, logger);\n\n if (!client) {\n throw new Error(\"Server could not be started\");\n }\n }\n\n logger.info(`Executing on server http://${host}:${port}`);\n const response = await executeOnServer(args, client, logger);\n\n if (response) {\n process.stdout.write(response.stdout);\n process.stderr.write(response.stderr);\n process.exitCode = response.exitCode;\n\n // we will simulate file access even if exit code may be non-zero\n const relativeGlobalInputsForTarget = path.relative(root, path.join(response.cwd, response.globalInputHashFile));\n await simulateFileAccess(logger, root, [...response.inputs, relativeGlobalInputsForTarget], response.outputs);\n } else {\n process.exitCode = 1;\n }\n\n logger.info(\"Task execution finished\");\n}\n"],"names":["executeRemotely","tryCreateClient","host","port","client","createClient","baseUrl","httpVersion","success","ping","pong","e","ConnectError","undefined","tryCreateClientWithRetries","logger","start","Date","now","error","Promise","resolve","setTimeout","executeOnServer","args","task","length","packageName","Error","taskArgs","filterArgsForTasks","response","runTarget","info","exitCode","options","command","server","tasks","nodeArg","timeout","parseServerOption","cwd","process","config","getConfig","createLogger","logLevel","reporter","initializeReporters","reporters","root","getWorkspaceManagerRoot","join","launchServerInBackground","stdout","write","stderr","relativeGlobalInputsForTarget","path","relative","globalInputHashFile","simulateFileAccess","inputs","outputs"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/exec/executeRemotely.ts"],"sourcesContent":["import path from \"path\";\nimport type { Logger } from \"@lage-run/logger\";\nimport createLogger from \"@lage-run/logger\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { LageClient } from \"@lage-run/rpc\";\nimport { ConnectError, createClient } from \"@lage-run/rpc\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport { simulateFileAccess } from \"./simulateFileAccess.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport { getConfig } from \"@lage-run/config\";\nimport { getWorkspaceManagerRoot } from \"workspace-tools\";\nimport type { Command } from \"commander\";\nimport { launchServerInBackground } from \"../launchServerInBackground.js\";\n\ninterface ExecRemotelyOptions extends ReporterInitOptions {\n cwd?: string;\n server?: string | boolean;\n timeout?: number;\n tasks: string[];\n nodeArg?: string;\n}\n\nasync function tryCreateClient(host: string, port: number) {\n const client = createClient({\n baseUrl: `http://${host}:${port}`,\n httpVersion: \"2\",\n });\n\n try {\n const success = await client.ping({});\n if (success.pong) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n return undefined;\n }\n\n throw e;\n }\n\n return undefined;\n}\n\nasync function tryCreateClientWithRetries(host: string, port: number, logger: Logger) {\n let client: ReturnType<typeof createClient> | undefined;\n\n const start = Date.now();\n while (Date.now() - start < 5 * 1000) {\n try {\n client = await tryCreateClient(host, port);\n\n if (client) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n logger.error(\"Error connecting to server\", e);\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n return undefined;\n}\n\nasync function executeOnServer(args: string[], client: LageClient, logger: Logger) {\n const task = args.length === 1 ? args[0] : args[1];\n const packageName = args.length > 1 ? args[0] : undefined;\n\n if (!task) {\n throw new Error(\"No task provided\");\n }\n\n const { taskArgs } = filterArgsForTasks(args ?? []);\n\n try {\n const response = await client.runTarget({\n packageName,\n task,\n taskArgs,\n });\n logger.info(`Task ${response.packageName} ${response.task} exited with code ${response.exitCode}`);\n return response;\n } catch (error) {\n if (error instanceof ConnectError) {\n logger.error(\"Error connecting to server\", { error });\n } else {\n logger.error(\"Error running task\", { error });\n }\n }\n}\n\nexport async function executeRemotely(options: ExecRemotelyOptions, command: Command): Promise<void> {\n // launch a 'lage-server.js' process, detached if it is not already running\n // send the command to the server process\n const { server, tasks, nodeArg } = options;\n const timeout = options.timeout ?? 5 * 60;\n\n const { host, port } = parseServerOption(server);\n const cwd = options.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.reporter = options.reporter ?? \"json\";\n await initializeReporters(logger, options, { customReporters: config.reporters, root });\n\n let client = await tryCreateClient(host, port);\n const args = command.args;\n\n logger.info(`Command args ${command.args.join(\" \")}`);\n\n if (!client) {\n await launchServerInBackground({\n host,\n port,\n tasks,\n args,\n timeout,\n logger,\n root,\n nodeArg,\n });\n\n logger.info(\"Creating a client to connect to the background services\");\n client = await tryCreateClientWithRetries(host, port, logger);\n\n if (!client) {\n throw new Error(\"Server could not be started\");\n }\n }\n\n logger.info(`Executing on server http://${host}:${port}`);\n const response = await executeOnServer(args, client, logger);\n\n if (response) {\n process.stdout.write(response.stdout);\n process.stderr.write(response.stderr);\n process.exitCode = response.exitCode;\n\n // we will simulate file access even if exit code may be non-zero\n const relativeGlobalInputsForTarget = path.relative(root, path.join(response.cwd, response.globalInputHashFile));\n await simulateFileAccess(logger, root, [...response.inputs, relativeGlobalInputsForTarget], response.outputs);\n } else {\n process.exitCode = 1;\n }\n\n logger.info(\"Task execution finished\");\n}\n"],"names":["executeRemotely","tryCreateClient","host","port","client","createClient","baseUrl","httpVersion","success","ping","pong","e","ConnectError","undefined","tryCreateClientWithRetries","logger","start","Date","now","error","Promise","resolve","setTimeout","executeOnServer","args","task","length","packageName","Error","taskArgs","filterArgsForTasks","response","runTarget","info","exitCode","options","command","server","tasks","nodeArg","timeout","parseServerOption","cwd","process","root","getWorkspaceManagerRoot","config","getConfig","createLogger","logLevel","reporter","initializeReporters","customReporters","reporters","join","launchServerInBackground","stdout","write","stderr","relativeGlobalInputsForTarget","path","relative","globalInputHashFile","simulateFileAccess","inputs","outputs"],"mappings":"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"}
@@ -28,6 +28,12 @@ export interface PackageTask {
28
28
  options?: Record<string, any>;
29
29
  weight?: number;
30
30
  }
31
+ /** Result logged and written to a file by the `info` command */
32
+ export interface InfoResult {
33
+ packageTasks: PackageTask[];
34
+ scope: string[];
35
+ command: string[];
36
+ }
31
37
  /**
32
38
  * The info command displays information about a target graph in a workspace.
33
39
  * The generated output can be read and used by other task runners, such as BuildXL.
@@ -53,7 +59,7 @@ export interface PackageTask {
53
59
  * ],
54
60
  * "weight": 3,
55
61
  * "inputs": ["src//**/ export declare function infoAction(options: InfoActionOptions, command: Command): Promise<void>;
56
- export declare function generatePackageTask(target: Target, taskArgs: string[], config: ConfigOptions, options: InfoActionOptions, binPaths: {
62
+ export declare function generatePackageTask(target: Target, taskArgs: string[], config: Pick<ConfigOptions, "npmClient">, options: Pick<InfoActionOptions, "concurrency" | "server">, binPaths: {
57
63
  lage: string;
58
64
  "lage-server": string;
59
65
  }, packageInfos: PackageInfos, tasks: string[]): PackageTask;
@@ -47,8 +47,11 @@ async function infoAction(options, command) {
47
47
  options.logLevel = options.logLevel ?? "info";
48
48
  options.reporter = options.reporter ?? "json";
49
49
  options.server = typeof options.server === "boolean" && options.server ? "localhost:5332" : options.server;
50
- await (0, _initializeReporters.initializeReporters)(logger, options, config.reporters);
51
- const root = (0, _workspacetools.getWorkspaceManagerRoot)(cwd);
50
+ const root = (0, _workspacetools.getWorkspaceManagerRoot)(cwd) ?? cwd;
51
+ await (0, _initializeReporters.initializeReporters)(logger, options, {
52
+ customReporters: config.reporters,
53
+ root
54
+ });
52
55
  const packageInfos = (0, _workspacetools.getPackageInfos)(root);
53
56
  const { tasks, taskArgs } = (0, _filterArgsForTasks.filterArgsForTasks)(command.args);
54
57
  const targetGraph = await (0, _createTargetGraph.createTargetGraph)({
@@ -105,12 +108,12 @@ async function infoAction(options, command) {
105
108
  root
106
109
  });
107
110
  const globHashCache = new Map();
108
- const globHashWithCache = (patterns, options)=>{
111
+ const globHashWithCache = (patterns, opts)=>{
109
112
  const key = patterns.join("###");
110
113
  if (globHashCache.has(key)) {
111
114
  return globHashCache.get(key);
112
115
  }
113
- const files = (0, _globby.glob)(patterns, options);
116
+ const files = (0, _globby.glob)(patterns, opts);
114
117
  const hash = (0, _hasher.hashStrings)(Object.values(fileHasher.hash(files.map((file)=>_path.default.join(root, file)))));
115
118
  globHashCache.set(key, hash);
116
119
  return hash;
@@ -185,7 +188,7 @@ function shouldRunWorkersAsService(options) {
185
188
  return typeof process.env.LAGE_WORKER_SERVER === "string" && process.env.LAGE_WORKER_SERVER !== "false" || !!options.server;
186
189
  }
187
190
  function generateCommand(target, taskArgs, config, options, binPaths, packageInfos, tasks) {
188
- if (target.type === "npmScript") {
191
+ if (target.type === _targetgraph.builtInTargetTypes.npmScript) {
189
192
  const script = target.packageName !== undefined ? packageInfos[target.packageName]?.scripts?.[target.task] : undefined;
190
193
  // If the script is a node script, and that it does not have any shell operators (&&, ||, etc)
191
194
  // then we can simply pass this along to info command rather than using npm client to run it.
@@ -199,12 +202,12 @@ function generateCommand(target, taskArgs, config, options, binPaths, packageInf
199
202
  }
200
203
  }
201
204
  const npmClient = config.npmClient ?? "npm";
202
- const command = [
205
+ return [
203
206
  npmClient,
204
207
  ...getNpmArgs(target.task, taskArgs)
205
208
  ];
206
- return command;
207
- } else if (target.type === "worker" && shouldRunWorkersAsService(options)) {
209
+ }
210
+ if (target.type === _targetgraph.builtInTargetTypes.worker && shouldRunWorkersAsService(options)) {
208
211
  const { host, port } = (0, _parseServerOption.parseServerOption)(options.server);
209
212
  const command = [
210
213
  binPaths["lage"],
@@ -225,7 +228,8 @@ function generateCommand(target, taskArgs, config, options, binPaths, packageInf
225
228
  }
226
229
  command.push(...taskArgs);
227
230
  return command;
228
- } else if (target.type === "worker") {
231
+ }
232
+ if (target.type === _targetgraph.builtInTargetTypes.worker) {
229
233
  const command = [
230
234
  binPaths.lage,
231
235
  "exec"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/info/action.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport type { ConfigOptions } from \"@lage-run/config\";\nimport { getConfig } from \"@lage-run/config\";\nimport { type PackageInfos, getPackageInfos, getWorkspaceManagerRoot } from \"workspace-tools\";\nimport { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport createLogger from \"@lage-run/logger\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { parse } from \"shell-quote\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { type Target, getStartTargetId } from \"@lage-run/target-graph\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { TargetRunnerPicker } from \"@lage-run/runners\";\nimport { getBinPaths } from \"../../getBinPaths.js\";\nimport { getBuiltInRunners } from \"../../getBuiltInRunners.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport { optimizeTargetGraph } from \"../../optimizeTargetGraph.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { FileHasher, hashStrings } from \"@lage-run/hasher\";\nimport { getGlobalInputHashFilePath } from \"../targetHashFilePath.js\";\n\nexport interface InfoActionOptions extends ReporterInitOptions {\n dependencies: boolean;\n dependents: boolean;\n since: string;\n scope: string[];\n to: string[];\n cache: boolean;\n nodeArg: string;\n ignore: string[];\n server: string;\n outputFile?: string;\n optimizeGraph: boolean;\n}\n\nexport interface PackageTask {\n id: string;\n command: string[];\n dependencies: string[];\n workingDirectory: string;\n package: string;\n task: string;\n inputs?: string[];\n outputs?: string[];\n options?: Record<string, any>;\n weight?: number;\n}\n\n/**\n * The info command displays information about a target graph in a workspace.\n * The generated output can be read and used by other task runners, such as BuildXL.\n *\n * Expected format:\n * [\n * {\n * \"id\": \"bar##build\",\n * \"package\": \"bar\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/bar\",\n * \"dependencies\": []\n * },\n * {\n * \"id\": \"foo##build\",\n * \"package\": \"foo\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"bar##build\"\n * ],\n * \"weight\": 3,\n * \"inputs\": [\"src//**/ /*.ts\"],\n * \"inputs\": [\"lib//**/ /*.js\", \"lib//**/ /*.d.ts]\"\n * \"options\": {\n * \"environment\": {\n * \"custom_env_var\": \"x\",\n * }\n * }\n * },\n * {\n * \"id\": \"foo##test\",\n * \"package\": \"foo\",\n * \"task\": \"test\",\n * \"command\": \"npm run test --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"foo##build\"\n * ]\n * },\n * ...\n * ]\n */\nexport async function infoAction(options: InfoActionOptions, command: Command): Promise<void> {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n options.server = typeof options.server === \"boolean\" && options.server ? \"localhost:5332\" : options.server;\n await initializeReporters(logger, options, config.reporters);\n const root = getWorkspaceManagerRoot(cwd)!;\n\n const packageInfos = getPackageInfos(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n enableTargetConfigMerging: config.enableTargetConfigMerging,\n enablePhantomTargetOptimization: config.enablePhantomTargetOptimization,\n });\n\n const scope = getFilteredPackages({\n root,\n packageInfos,\n logger,\n includeDependencies: options.dependencies,\n includeDependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n since: options.since,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n repoWideChanges: config.repoWideChanges,\n sinceIgnoreGlobs: options.ignore.concat(config.ignore),\n });\n\n const pickerOptions = getBuiltInRunners({ nodeArg: options.nodeArg, npmCmd: config.npmClient, taskArgs });\n\n const runnerPicker = new TargetRunnerPicker(pickerOptions);\n\n // This is a temporary flag to allow backwards compatibility with the old lage graph format used by BuildXL (formerly known as Domino).\n // I initially worked on a commandline flag, but threading that through requires 3 different releases (lage, buildxl, ohome).\n // This is a temp solution to be able to upgrade to Lage V2 without breaking the BuildXL integration. And allow us\n // to update to lage v2.\n // Unfortunately this is the only variable that we can use to not break any other customers\n const createBackwardsCompatGraph = process.env[\"DOMINO\"] === \"1\" || !options.optimizeGraph;\n\n const optimizedTargets = await optimizeTargetGraph(targetGraph, runnerPicker, createBackwardsCompatGraph);\n const binPaths = getBinPaths();\n const packageTasks = optimizedTargets.map((target) =>\n generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos, tasks)\n );\n\n // In worker server mode, we need to actually speed up the BuildXL runs with presupplied global input hashes so that it doesn't try to read it over and over again\n // This is an important optimization for BuildXL for large amount of env glob matches in non-well-behaved monorepos\n // (e.g. repos that have files listed in env glob to avoid circular dependencies in package graph)\n if (shouldRunWorkersAsService(options)) {\n // For each target in the target graph, we need to create a global input hash file in this kind of location:\n // ${target.cwd}/.lage/global_inputs_hash\n // We will use glob for these files and use the FileHasher to generate these hashes.\n const fileHasher = new FileHasher({\n root,\n });\n\n const globHashCache = new Map<string, string>();\n const globHashWithCache = (patterns: string[], options: { cwd: string }) => {\n const key = patterns.join(\"###\");\n if (globHashCache.has(key)) {\n return globHashCache.get(key)!;\n }\n\n const files = glob(patterns, options);\n const hash = hashStrings(Object.values(fileHasher.hash(files.map((file) => path.join(root, file)))));\n\n globHashCache.set(key, hash);\n\n return hash;\n };\n\n const globalInputs = config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root })\n : [\"lage.config.js\"];\n\n for (const target of optimizedTargets) {\n if (target.id === getStartTargetId()) {\n continue;\n }\n\n const targetGlobalInputsHash = target.environmentGlob\n ? globHashWithCache(target.environmentGlob, { cwd: root })\n : globHashWithCache(globalInputs, { cwd: root });\n\n const targetGlobalInputsHashFile = path.join(target.cwd, getGlobalInputHashFilePath(target));\n const targetGlobalInputsHashFileDir = path.dirname(targetGlobalInputsHashFile);\n\n // Make sure the directory exists\n if (!fs.existsSync(targetGlobalInputsHashFileDir)) {\n fs.mkdirSync(targetGlobalInputsHashFileDir, { recursive: true });\n }\n\n // Write the hash to the file\n fs.writeFileSync(targetGlobalInputsHashFile, targetGlobalInputsHash);\n }\n }\n\n const infoResult = {\n command: command.args,\n scope,\n packageTasks,\n };\n\n if (options.outputFile) {\n const parentFolder = path.dirname(options.outputFile);\n if (!fs.existsSync(parentFolder)) {\n await fs.promises.mkdir(parentFolder, { recursive: true });\n }\n const infoJson = JSON.stringify(infoResult, null, options.verbose ? 2 : undefined);\n await fs.promises.writeFile(options.outputFile, infoJson);\n logger.info(`Wrote info to file: ${options.outputFile}`);\n } else {\n logger.info(\"info\", infoResult);\n }\n}\n\nexport function generatePackageTask(\n target: Target,\n taskArgs: string[],\n config: ConfigOptions,\n options: InfoActionOptions,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos,\n tasks: string[]\n): PackageTask {\n const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos, tasks);\n const workingDirectory = getWorkingDirectory(target);\n\n const packageTask: PackageTask = {\n id: target.id,\n command,\n dependencies: target.dependencies,\n workingDirectory,\n package: target.packageName ?? \"\",\n task: target.task,\n inputs: target.inputs,\n outputs: target.outputs,\n };\n\n if (target.weight && target.weight !== 1) {\n packageTask.weight = target.weight;\n }\n\n if (target.options && Object.keys(target.options).length != 0) {\n packageTask.options = target.options;\n }\n\n return packageTask;\n}\n\nfunction shouldRunWorkersAsService(options: InfoActionOptions) {\n return (typeof process.env.LAGE_WORKER_SERVER === \"string\" && process.env.LAGE_WORKER_SERVER !== \"false\") || !!options.server;\n}\n\nfunction generateCommand(\n target: Target,\n taskArgs: string[],\n config: ConfigOptions,\n options: InfoActionOptions,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos,\n tasks: string[]\n) {\n if (target.type === \"npmScript\") {\n const script = target.packageName !== undefined ? packageInfos[target.packageName]?.scripts?.[target.task] : undefined;\n\n // If the script is a node script, and that it does not have any shell operators (&&, ||, etc)\n // then we can simply pass this along to info command rather than using npm client to run it.\n if (script && script.startsWith(\"node\")) {\n const parsed = parse(script);\n if (parsed.length > 0 && parsed.every((entry) => typeof entry === \"string\")) {\n return [...(parsed as string[]), ...taskArgs];\n }\n }\n\n const npmClient = config.npmClient ?? \"npm\";\n const command = [npmClient, ...getNpmArgs(target.task, taskArgs)];\n return command;\n } else if (target.type === \"worker\" && shouldRunWorkersAsService(options)) {\n const { host, port } = parseServerOption(options.server);\n const command = [binPaths[\"lage\"], \"exec\", \"--tasks\", ...tasks, \"--server\", `${host}:${port}`];\n if (options.concurrency) {\n command.push(\"--concurrency\", options.concurrency.toString());\n }\n\n if (target.packageName) {\n command.push(target.packageName);\n }\n\n if (target.task) {\n command.push(target.task);\n }\n\n command.push(...taskArgs);\n return command;\n } else if (target.type === \"worker\") {\n const command = [binPaths.lage, \"exec\"];\n command.push(target.packageName ?? \"\");\n command.push(target.task);\n command.push(...taskArgs);\n return command;\n }\n\n return [];\n}\n\nfunction getWorkingDirectory(target: Target) {\n const cwd = process.cwd();\n const workingDirectory = path.relative(getWorkspaceManagerRoot(cwd) ?? \"\", target.cwd).replace(/\\\\/g, \"/\");\n return workingDirectory;\n}\n\nfunction getNpmArgs(task: string, taskTargs: string[]) {\n const extraArgs = taskTargs != undefined && taskTargs.length > 0 ? [\"--\", ...taskTargs] : [];\n return [\"run\", task, ...extraArgs];\n}\n"],"names":["generatePackageTask","infoAction","options","command","cwd","process","config","getConfig","logger","createLogger","logLevel","reporter","server","initializeReporters","reporters","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","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","pickerOptions","getBuiltInRunners","nodeArg","npmCmd","npmClient","runnerPicker","TargetRunnerPicker","createBackwardsCompatGraph","env","optimizeGraph","optimizedTargets","optimizeTargetGraph","binPaths","getBinPaths","packageTasks","map","target","shouldRunWorkersAsService","fileHasher","FileHasher","globHashCache","Map","globHashWithCache","patterns","key","join","has","get","files","glob","hash","hashStrings","Object","values","file","path","set","globalInputs","environmentGlob","id","getStartTargetId","targetGlobalInputsHash","targetGlobalInputsHashFile","getGlobalInputHashFilePath","targetGlobalInputsHashFileDir","dirname","fs","existsSync","mkdirSync","recursive","writeFileSync","infoResult","outputFile","parentFolder","promises","mkdir","infoJson","JSON","stringify","verbose","undefined","writeFile","info","generateCommand","workingDirectory","getWorkingDirectory","packageTask","package","packageName","task","inputs","weight","keys","length","LAGE_WORKER_SERVER","type","script","scripts","startsWith","parsed","parse","every","entry","getNpmArgs","host","port","parseServerOption","concurrency","push","toString","lage","relative","replace","taskTargs","extraArgs"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/info/action.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport type { ConfigOptions } from \"@lage-run/config\";\nimport { getConfig } from \"@lage-run/config\";\nimport { type PackageInfos, getPackageInfos, getWorkspaceManagerRoot } from \"workspace-tools\";\nimport { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport createLogger from \"@lage-run/logger\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { parse } from \"shell-quote\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { type Target, builtInTargetTypes, getStartTargetId } from \"@lage-run/target-graph\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { TargetRunnerPicker } from \"@lage-run/runners\";\nimport { getBinPaths } from \"../../getBinPaths.js\";\nimport { getBuiltInRunners } from \"../../getBuiltInRunners.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport { optimizeTargetGraph } from \"../../optimizeTargetGraph.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { FileHasher, hashStrings } from \"@lage-run/hasher\";\nimport { getGlobalInputHashFilePath } from \"../targetHashFilePath.js\";\n\nexport interface InfoActionOptions extends ReporterInitOptions {\n dependencies: boolean;\n dependents: boolean;\n since: string;\n scope: string[];\n to: string[];\n cache: boolean;\n nodeArg: string;\n ignore: string[];\n server: string;\n outputFile?: string;\n optimizeGraph: boolean;\n}\n\nexport interface PackageTask {\n id: string;\n command: string[];\n dependencies: string[];\n workingDirectory: string;\n package: string;\n task: string;\n inputs?: string[];\n outputs?: string[];\n options?: Record<string, any>;\n weight?: number;\n}\n\n/** Result logged and written to a file by the `info` command */\nexport interface InfoResult {\n packageTasks: PackageTask[];\n scope: string[];\n command: string[];\n}\n\n/**\n * The info command displays information about a target graph in a workspace.\n * The generated output can be read and used by other task runners, such as BuildXL.\n *\n * Expected format:\n * [\n * {\n * \"id\": \"bar##build\",\n * \"package\": \"bar\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/bar\",\n * \"dependencies\": []\n * },\n * {\n * \"id\": \"foo##build\",\n * \"package\": \"foo\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"bar##build\"\n * ],\n * \"weight\": 3,\n * \"inputs\": [\"src//**/ /*.ts\"],\n * \"inputs\": [\"lib//**/ /*.js\", \"lib//**/ /*.d.ts]\"\n * \"options\": {\n * \"environment\": {\n * \"custom_env_var\": \"x\",\n * }\n * }\n * },\n * {\n * \"id\": \"foo##test\",\n * \"package\": \"foo\",\n * \"task\": \"test\",\n * \"command\": \"npm run test --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"foo##build\"\n * ]\n * },\n * ...\n * ]\n */\nexport async function infoAction(options: InfoActionOptions, command: Command): Promise<void> {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n options.server = typeof options.server === \"boolean\" && options.server ? \"localhost:5332\" : options.server;\n const root = getWorkspaceManagerRoot(cwd) ?? cwd;\n await initializeReporters(logger, options, { customReporters: config.reporters, root });\n\n const packageInfos = getPackageInfos(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n enableTargetConfigMerging: config.enableTargetConfigMerging,\n enablePhantomTargetOptimization: config.enablePhantomTargetOptimization,\n });\n\n const scope = getFilteredPackages({\n root,\n packageInfos,\n logger,\n includeDependencies: options.dependencies,\n includeDependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n since: options.since,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n repoWideChanges: config.repoWideChanges,\n sinceIgnoreGlobs: options.ignore.concat(config.ignore),\n });\n\n const pickerOptions = getBuiltInRunners({ nodeArg: options.nodeArg, npmCmd: config.npmClient, taskArgs });\n\n const runnerPicker = new TargetRunnerPicker(pickerOptions);\n\n // This is a temporary flag to allow backwards compatibility with the old lage graph format used by BuildXL (formerly known as Domino).\n // I initially worked on a commandline flag, but threading that through requires 3 different releases (lage, buildxl, ohome).\n // This is a temp solution to be able to upgrade to Lage V2 without breaking the BuildXL integration. And allow us\n // to update to lage v2.\n // Unfortunately this is the only variable that we can use to not break any other customers\n const createBackwardsCompatGraph = process.env[\"DOMINO\"] === \"1\" || !options.optimizeGraph;\n\n const optimizedTargets = await optimizeTargetGraph(targetGraph, runnerPicker, createBackwardsCompatGraph);\n const binPaths = getBinPaths();\n const packageTasks = optimizedTargets.map((target) =>\n generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos, tasks)\n );\n\n // In worker server mode, we need to actually speed up the BuildXL runs with presupplied global input hashes so that it doesn't try to read it over and over again\n // This is an important optimization for BuildXL for large amount of env glob matches in non-well-behaved monorepos\n // (e.g. repos that have files listed in env glob to avoid circular dependencies in package graph)\n if (shouldRunWorkersAsService(options)) {\n // For each target in the target graph, we need to create a global input hash file in this kind of location:\n // ${target.cwd}/.lage/global_inputs_hash\n // We will use glob for these files and use the FileHasher to generate these hashes.\n const fileHasher = new FileHasher({\n root,\n });\n\n const globHashCache = new Map<string, string>();\n const globHashWithCache = (patterns: string[], opts: { cwd: string }) => {\n const key = patterns.join(\"###\");\n if (globHashCache.has(key)) {\n return globHashCache.get(key)!;\n }\n\n const files = glob(patterns, opts);\n const hash = hashStrings(Object.values(fileHasher.hash(files.map((file) => path.join(root, file)))));\n\n globHashCache.set(key, hash);\n\n return hash;\n };\n\n const globalInputs = config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root })\n : [\"lage.config.js\"];\n\n for (const target of optimizedTargets) {\n if (target.id === getStartTargetId()) {\n continue;\n }\n\n const targetGlobalInputsHash = target.environmentGlob\n ? globHashWithCache(target.environmentGlob, { cwd: root })\n : globHashWithCache(globalInputs, { cwd: root });\n\n const targetGlobalInputsHashFile = path.join(target.cwd, getGlobalInputHashFilePath(target));\n const targetGlobalInputsHashFileDir = path.dirname(targetGlobalInputsHashFile);\n\n // Make sure the directory exists\n if (!fs.existsSync(targetGlobalInputsHashFileDir)) {\n fs.mkdirSync(targetGlobalInputsHashFileDir, { recursive: true });\n }\n\n // Write the hash to the file\n fs.writeFileSync(targetGlobalInputsHashFile, targetGlobalInputsHash);\n }\n }\n\n const infoResult: InfoResult = {\n command: command.args,\n scope,\n packageTasks,\n };\n\n if (options.outputFile) {\n const parentFolder = path.dirname(options.outputFile);\n if (!fs.existsSync(parentFolder)) {\n await fs.promises.mkdir(parentFolder, { recursive: true });\n }\n const infoJson = JSON.stringify(infoResult, null, options.verbose ? 2 : undefined);\n await fs.promises.writeFile(options.outputFile, infoJson);\n logger.info(`Wrote info to file: ${options.outputFile}`);\n } else {\n logger.info(\"info\", infoResult);\n }\n}\n\nexport function generatePackageTask(\n target: Target,\n taskArgs: string[],\n config: Pick<ConfigOptions, \"npmClient\">,\n options: Pick<InfoActionOptions, \"concurrency\" | \"server\">,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos,\n tasks: string[]\n): PackageTask {\n const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos, tasks);\n const workingDirectory = getWorkingDirectory(target);\n\n const packageTask: PackageTask = {\n id: target.id,\n command,\n dependencies: target.dependencies,\n workingDirectory,\n package: target.packageName ?? \"\",\n task: target.task,\n inputs: target.inputs,\n outputs: target.outputs,\n };\n\n if (target.weight && target.weight !== 1) {\n packageTask.weight = target.weight;\n }\n\n if (target.options && Object.keys(target.options).length != 0) {\n packageTask.options = target.options;\n }\n\n return packageTask;\n}\n\nfunction shouldRunWorkersAsService(options: Pick<InfoActionOptions, \"server\">) {\n return (typeof process.env.LAGE_WORKER_SERVER === \"string\" && process.env.LAGE_WORKER_SERVER !== \"false\") || !!options.server;\n}\n\nfunction generateCommand(\n target: Target,\n taskArgs: string[],\n config: Pick<ConfigOptions, \"npmClient\">,\n options: Pick<InfoActionOptions, \"concurrency\" | \"server\">,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos,\n tasks: string[]\n) {\n if (target.type === builtInTargetTypes.npmScript) {\n const script = target.packageName !== undefined ? packageInfos[target.packageName]?.scripts?.[target.task] : undefined;\n\n // If the script is a node script, and that it does not have any shell operators (&&, ||, etc)\n // then we can simply pass this along to info command rather than using npm client to run it.\n if (script && script.startsWith(\"node\")) {\n const parsed = parse(script);\n if (parsed.length > 0 && parsed.every((entry) => typeof entry === \"string\")) {\n return [...(parsed as string[]), ...taskArgs];\n }\n }\n\n const npmClient = config.npmClient ?? \"npm\";\n return [npmClient, ...getNpmArgs(target.task, taskArgs)];\n }\n\n if (target.type === builtInTargetTypes.worker && shouldRunWorkersAsService(options)) {\n const { host, port } = parseServerOption(options.server);\n const command = [binPaths[\"lage\"], \"exec\", \"--tasks\", ...tasks, \"--server\", `${host}:${port}`];\n if (options.concurrency) {\n command.push(\"--concurrency\", options.concurrency.toString());\n }\n\n if (target.packageName) {\n command.push(target.packageName);\n }\n\n if (target.task) {\n command.push(target.task);\n }\n\n command.push(...taskArgs);\n return command;\n }\n\n if (target.type === builtInTargetTypes.worker) {\n const command = [binPaths.lage, \"exec\"];\n command.push(target.packageName ?? \"\");\n command.push(target.task);\n command.push(...taskArgs);\n return command;\n }\n\n return [];\n}\n\nfunction getWorkingDirectory(target: Target) {\n const cwd = process.cwd();\n const workingDirectory = path.relative(getWorkspaceManagerRoot(cwd) ?? \"\", target.cwd).replace(/\\\\/g, \"/\");\n return workingDirectory;\n}\n\nfunction getNpmArgs(task: string, taskTargs: string[]) {\n const extraArgs = taskTargs != undefined && taskTargs.length > 0 ? [\"--\", ...taskTargs] : [];\n return [\"run\", task, ...extraArgs];\n}\n"],"names":["generatePackageTask","infoAction","options","command","cwd","process","config","getConfig","logger","createLogger","logLevel","reporter","server","root","getWorkspaceManagerRoot","initializeReporters","customReporters","reporters","packageInfos","getPackageInfos","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","enablePhantomTargetOptimization","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","pickerOptions","getBuiltInRunners","nodeArg","npmCmd","npmClient","runnerPicker","TargetRunnerPicker","createBackwardsCompatGraph","env","optimizeGraph","optimizedTargets","optimizeTargetGraph","binPaths","getBinPaths","packageTasks","map","target","shouldRunWorkersAsService","fileHasher","FileHasher","globHashCache","Map","globHashWithCache","patterns","opts","key","join","has","get","files","glob","hash","hashStrings","Object","values","file","path","set","globalInputs","environmentGlob","id","getStartTargetId","targetGlobalInputsHash","targetGlobalInputsHashFile","getGlobalInputHashFilePath","targetGlobalInputsHashFileDir","dirname","fs","existsSync","mkdirSync","recursive","writeFileSync","infoResult","outputFile","parentFolder","promises","mkdir","infoJson","JSON","stringify","verbose","undefined","writeFile","info","generateCommand","workingDirectory","getWorkingDirectory","packageTask","package","packageName","task","inputs","weight","keys","length","LAGE_WORKER_SERVER","type","builtInTargetTypes","npmScript","script","scripts","startsWith","parsed","parse","every","entry","getNpmArgs","worker","host","port","parseServerOption","concurrency","push","toString","lage","relative","replace","taskTargs","extraArgs"],"mappings":";;;;;;;;;;;QA2OgBA;eAAAA;;QApIMC;eAAAA;;;mCAtGY;oCACC;wBAET;gCACkD;qCACxC;+DACX;6DACR;2DACF;4BACO;6BAG4C;qCAC9B;yBACD;6BACP;mCACM;mCACA;qCACE;wBACf;wBACmB;oCACG;;;;;;AAiFpC,eAAeA,WAAWC,OAA0B,EAAEC,OAAgB;IAC3E,MAAMC,MAAMC,QAAQD,GAAG;IACvB,MAAME,SAAS,MAAMC,IAAAA,iBAAS,EAACH;IAC/B,MAAMI,SAASC,IAAAA,eAAY;IAC3BP,QAAQQ,QAAQ,GAAGR,QAAQQ,QAAQ,IAAI;IACvCR,QAAQS,QAAQ,GAAGT,QAAQS,QAAQ,IAAI;IACvCT,QAAQU,MAAM,GAAG,OAAOV,QAAQU,MAAM,KAAK,aAAaV,QAAQU,MAAM,GAAG,mBAAmBV,QAAQU,MAAM;IAC1G,MAAMC,OAAOC,IAAAA,uCAAuB,EAACV,QAAQA;IAC7C,MAAMW,IAAAA,wCAAmB,EAACP,QAAQN,SAAS;QAAEc,iBAAiBV,OAAOW,SAAS;QAAEJ;IAAK;IAErF,MAAMK,eAAeC,IAAAA,+BAAe,EAACN;IAErC,MAAM,EAAEO,KAAK,EAAEC,QAAQ,EAAE,GAAGC,IAAAA,sCAAkB,EAACnB,QAAQoB,IAAI;IAE3D,MAAMC,cAAc,MAAMC,IAAAA,oCAAiB,EAAC;QAC1CjB;QACAK;QACAa,cAAcxB,QAAQwB,YAAY;QAClCC,YAAYzB,QAAQyB,UAAU,IAAI,CAACzB,QAAQ0B,EAAE;QAC7CC,QAAQ3B,QAAQ2B,MAAM,CAACC,MAAM,CAACxB,OAAOuB,MAAM;QAC3CE,UAAUzB,OAAOyB,QAAQ;QACzBC,iBAAiB1B,OAAO0B,eAAe;QACvCC,OAAO,AAAC/B,CAAAA,QAAQ+B,KAAK,IAAI,EAAE,AAAD,EAAGH,MAAM,CAAC5B,QAAQ0B,EAAE,IAAI,EAAE;QACpDM,OAAOhC,QAAQgC,KAAK;QACpBC,SAAS7B,OAAO8B,YAAY,CAACC,UAAU;QACvCjB;QACAF;QACAoB,YAAYhC,OAAOgC,UAAU;QAC7BC,2BAA2BjC,OAAOiC,yBAAyB;QAC3DC,iCAAiClC,OAAOkC,+BAA+B;IACzE;IAEA,MAAMP,QAAQQ,IAAAA,wCAAmB,EAAC;QAChC5B;QACAK;QACAV;QACAkC,qBAAqBxC,QAAQwB,YAAY;QACzCiB,mBAAmBzC,QAAQyB,UAAU,IAAI,CAACzB,QAAQ0B,EAAE;QACpDM,OAAOhC,QAAQgC,KAAK;QACpBD,OAAO,AAAC/B,CAAAA,QAAQ+B,KAAK,IAAI,EAAE,AAAD,EAAGH,MAAM,CAAC5B,QAAQ0B,EAAE,IAAI,EAAE;QACpDI,iBAAiB1B,OAAO0B,eAAe;QACvCY,kBAAkB1C,QAAQ2B,MAAM,CAACC,MAAM,CAACxB,OAAOuB,MAAM;IACvD;IAEA,MAAMgB,gBAAgBC,IAAAA,oCAAiB,EAAC;QAAEC,SAAS7C,QAAQ6C,OAAO;QAAEC,QAAQ1C,OAAO2C,SAAS;QAAE5B;IAAS;IAEvG,MAAM6B,eAAe,IAAIC,2BAAkB,CAACN;IAE5C,uIAAuI;IACvI,6HAA6H;IAC7H,kHAAkH;IAClH,wBAAwB;IACxB,2FAA2F;IAC3F,MAAMO,6BAA6B/C,QAAQgD,GAAG,CAAC,SAAS,KAAK,OAAO,CAACnD,QAAQoD,aAAa;IAE1F,MAAMC,mBAAmB,MAAMC,IAAAA,wCAAmB,EAAChC,aAAa0B,cAAcE;IAC9E,MAAMK,WAAWC,IAAAA,wBAAW;IAC5B,MAAMC,eAAeJ,iBAAiBK,GAAG,CAAC,CAACC,SACzC7D,oBAAoB6D,QAAQxC,UAAUf,QAAQJ,SAASuD,UAAUvC,cAAcE;IAGjF,kKAAkK;IAClK,mHAAmH;IACnH,kGAAkG;IAClG,IAAI0C,0BAA0B5D,UAAU;QACtC,4GAA4G;QAC5G,yCAAyC;QACzC,oFAAoF;QACpF,MAAM6D,aAAa,IAAIC,kBAAU,CAAC;YAChCnD;QACF;QAEA,MAAMoD,gBAAgB,IAAIC;QAC1B,MAAMC,oBAAoB,CAACC,UAAoBC;YAC7C,MAAMC,MAAMF,SAASG,IAAI,CAAC;YAC1B,IAAIN,cAAcO,GAAG,CAACF,MAAM;gBAC1B,OAAOL,cAAcQ,GAAG,CAACH;YAC3B;YAEA,MAAMI,QAAQC,IAAAA,YAAI,EAACP,UAAUC;YAC7B,MAAMO,OAAOC,IAAAA,mBAAW,EAACC,OAAOC,MAAM,CAAChB,WAAWa,IAAI,CAACF,MAAMd,GAAG,CAAC,CAACoB,OAASC,aAAI,CAACV,IAAI,CAAC1D,MAAMmE;YAE3Ff,cAAciB,GAAG,CAACZ,KAAKM;YAEvB,OAAOA;QACT;QAEA,MAAMO,eAAe7E,OAAO8B,YAAY,EAAEgD,kBACtCT,IAAAA,YAAI,EAACrE,OAAO8B,YAAY,EAAEgD,iBAAiB;YAAEhF,KAAKS;QAAK,KACvD;YAAC;SAAiB;QAEtB,KAAK,MAAMgD,UAAUN,iBAAkB;YACrC,IAAIM,OAAOwB,EAAE,KAAKC,IAAAA,6BAAgB,KAAI;gBACpC;YACF;YAEA,MAAMC,yBAAyB1B,OAAOuB,eAAe,GACjDjB,kBAAkBN,OAAOuB,eAAe,EAAE;gBAAEhF,KAAKS;YAAK,KACtDsD,kBAAkBgB,cAAc;gBAAE/E,KAAKS;YAAK;YAEhD,MAAM2E,6BAA6BP,aAAI,CAACV,IAAI,CAACV,OAAOzD,GAAG,EAAEqF,IAAAA,8CAA0B,EAAC5B;YACpF,MAAM6B,gCAAgCT,aAAI,CAACU,OAAO,CAACH;YAEnD,iCAAiC;YACjC,IAAI,CAACI,WAAE,CAACC,UAAU,CAACH,gCAAgC;gBACjDE,WAAE,CAACE,SAAS,CAACJ,+BAA+B;oBAAEK,WAAW;gBAAK;YAChE;YAEA,6BAA6B;YAC7BH,WAAE,CAACI,aAAa,CAACR,4BAA4BD;QAC/C;IACF;IAEA,MAAMU,aAAyB;QAC7B9F,SAASA,QAAQoB,IAAI;QACrBU;QACA0B;IACF;IAEA,IAAIzD,QAAQgG,UAAU,EAAE;QACtB,MAAMC,eAAelB,aAAI,CAACU,OAAO,CAACzF,QAAQgG,UAAU;QACpD,IAAI,CAACN,WAAE,CAACC,UAAU,CAACM,eAAe;YAChC,MAAMP,WAAE,CAACQ,QAAQ,CAACC,KAAK,CAACF,cAAc;gBAAEJ,WAAW;YAAK;QAC1D;QACA,MAAMO,WAAWC,KAAKC,SAAS,CAACP,YAAY,MAAM/F,QAAQuG,OAAO,GAAG,IAAIC;QACxE,MAAMd,WAAE,CAACQ,QAAQ,CAACO,SAAS,CAACzG,QAAQgG,UAAU,EAAEI;QAChD9F,OAAOoG,IAAI,CAAC,CAAC,oBAAoB,EAAE1G,QAAQgG,UAAU,EAAE;IACzD,OAAO;QACL1F,OAAOoG,IAAI,CAAC,QAAQX;IACtB;AACF;AAEO,SAASjG,oBACd6D,MAAc,EACdxC,QAAkB,EAClBf,MAAwC,EACxCJ,OAA0D,EAC1DuD,QAAiD,EACjDvC,YAA0B,EAC1BE,KAAe;IAEf,MAAMjB,UAAU0G,gBAAgBhD,QAAQxC,UAAUf,QAAQJ,SAASuD,UAAUvC,cAAcE;IAC3F,MAAM0F,mBAAmBC,oBAAoBlD;IAE7C,MAAMmD,cAA2B;QAC/B3B,IAAIxB,OAAOwB,EAAE;QACblF;QACAuB,cAAcmC,OAAOnC,YAAY;QACjCoF;QACAG,SAASpD,OAAOqD,WAAW,IAAI;QAC/BC,MAAMtD,OAAOsD,IAAI;QACjBC,QAAQvD,OAAOuD,MAAM;QACrBjF,SAAS0B,OAAO1B,OAAO;IACzB;IAEA,IAAI0B,OAAOwD,MAAM,IAAIxD,OAAOwD,MAAM,KAAK,GAAG;QACxCL,YAAYK,MAAM,GAAGxD,OAAOwD,MAAM;IACpC;IAEA,IAAIxD,OAAO3D,OAAO,IAAI4E,OAAOwC,IAAI,CAACzD,OAAO3D,OAAO,EAAEqH,MAAM,IAAI,GAAG;QAC7DP,YAAY9G,OAAO,GAAG2D,OAAO3D,OAAO;IACtC;IAEA,OAAO8G;AACT;AAEA,SAASlD,0BAA0B5D,OAA0C;IAC3E,OAAO,AAAC,OAAOG,QAAQgD,GAAG,CAACmE,kBAAkB,KAAK,YAAYnH,QAAQgD,GAAG,CAACmE,kBAAkB,KAAK,WAAY,CAAC,CAACtH,QAAQU,MAAM;AAC/H;AAEA,SAASiG,gBACPhD,MAAc,EACdxC,QAAkB,EAClBf,MAAwC,EACxCJ,OAA0D,EAC1DuD,QAAiD,EACjDvC,YAA0B,EAC1BE,KAAe;IAEf,IAAIyC,OAAO4D,IAAI,KAAKC,+BAAkB,CAACC,SAAS,EAAE;QAChD,MAAMC,SAAS/D,OAAOqD,WAAW,KAAKR,YAAYxF,YAAY,CAAC2C,OAAOqD,WAAW,CAAC,EAAEW,SAAS,CAAChE,OAAOsD,IAAI,CAAC,GAAGT;QAE7G,8FAA8F;QAC9F,6FAA6F;QAC7F,IAAIkB,UAAUA,OAAOE,UAAU,CAAC,SAAS;YACvC,MAAMC,SAASC,IAAAA,iBAAK,EAACJ;YACrB,IAAIG,OAAOR,MAAM,GAAG,KAAKQ,OAAOE,KAAK,CAAC,CAACC,QAAU,OAAOA,UAAU,WAAW;gBAC3E,OAAO;uBAAKH;uBAAwB1G;iBAAS;YAC/C;QACF;QAEA,MAAM4B,YAAY3C,OAAO2C,SAAS,IAAI;QACtC,OAAO;YAACA;eAAckF,WAAWtE,OAAOsD,IAAI,EAAE9F;SAAU;IAC1D;IAEA,IAAIwC,OAAO4D,IAAI,KAAKC,+BAAkB,CAACU,MAAM,IAAItE,0BAA0B5D,UAAU;QACnF,MAAM,EAAEmI,IAAI,EAAEC,IAAI,EAAE,GAAGC,IAAAA,oCAAiB,EAACrI,QAAQU,MAAM;QACvD,MAAMT,UAAU;YAACsD,QAAQ,CAAC,OAAO;YAAE;YAAQ;eAAcrC;YAAO;YAAY,GAAGiH,KAAK,CAAC,EAAEC,MAAM;SAAC;QAC9F,IAAIpI,QAAQsI,WAAW,EAAE;YACvBrI,QAAQsI,IAAI,CAAC,iBAAiBvI,QAAQsI,WAAW,CAACE,QAAQ;QAC5D;QAEA,IAAI7E,OAAOqD,WAAW,EAAE;YACtB/G,QAAQsI,IAAI,CAAC5E,OAAOqD,WAAW;QACjC;QAEA,IAAIrD,OAAOsD,IAAI,EAAE;YACfhH,QAAQsI,IAAI,CAAC5E,OAAOsD,IAAI;QAC1B;QAEAhH,QAAQsI,IAAI,IAAIpH;QAChB,OAAOlB;IACT;IAEA,IAAI0D,OAAO4D,IAAI,KAAKC,+BAAkB,CAACU,MAAM,EAAE;QAC7C,MAAMjI,UAAU;YAACsD,SAASkF,IAAI;YAAE;SAAO;QACvCxI,QAAQsI,IAAI,CAAC5E,OAAOqD,WAAW,IAAI;QACnC/G,QAAQsI,IAAI,CAAC5E,OAAOsD,IAAI;QACxBhH,QAAQsI,IAAI,IAAIpH;QAChB,OAAOlB;IACT;IAEA,OAAO,EAAE;AACX;AAEA,SAAS4G,oBAAoBlD,MAAc;IACzC,MAAMzD,MAAMC,QAAQD,GAAG;IACvB,MAAM0G,mBAAmB7B,aAAI,CAAC2D,QAAQ,CAAC9H,IAAAA,uCAAuB,EAACV,QAAQ,IAAIyD,OAAOzD,GAAG,EAAEyI,OAAO,CAAC,OAAO;IACtG,OAAO/B;AACT;AAEA,SAASqB,WAAWhB,IAAY,EAAE2B,SAAmB;IACnD,MAAMC,YAAYD,aAAapC,aAAaoC,UAAUvB,MAAM,GAAG,IAAI;QAAC;WAASuB;KAAU,GAAG,EAAE;IAC5F,OAAO;QAAC;QAAO3B;WAAS4B;KAAU;AACpC"}
@@ -1,3 +1,4 @@
1
+ import { type CustomReportersOptions } from "./createReporter.js";
1
2
  import type { LogStructuredData, Logger, Reporter } from "@lage-run/logger";
2
3
  import { type ReporterInitOptions } from "../types/ReporterInitOptions.js";
3
- export declare function initializeReporters(logger: Logger, options: ReporterInitOptions, customReporters?: Record<string, string>): Promise<Reporter<LogStructuredData>[]>;
4
+ export declare function initializeReporters(logger: Logger, options: ReporterInitOptions, customReportersOptions: CustomReportersOptions | undefined): Promise<Reporter<LogStructuredData>[]>;
@@ -10,8 +10,8 @@ Object.defineProperty(exports, "initializeReporters", {
10
10
  });
11
11
  const _createReporter = require("./createReporter.js");
12
12
  const _ReporterInitOptions = require("../types/ReporterInitOptions.js");
13
- async function initializeReporters(logger, options, customReporters = {}) {
14
- const customReporterNames = Object.keys(customReporters);
13
+ async function initializeReporters(logger, options, customReportersOptions) {
14
+ const customReporterNames = Object.keys(customReportersOptions?.customReporters || {});
15
15
  // Mapping from lowercase reporter name to original name
16
16
  const supportedReportersLower = Object.fromEntries([
17
17
  ..._ReporterInitOptions.builtInReporterNames,
@@ -42,7 +42,7 @@ async function initializeReporters(logger, options, customReporters = {}) {
42
42
  ].join(", ");
43
43
  throw new Error(`Invalid --reporter option: "${rawReporterName}". Supported reporters are: ${reportersList}`);
44
44
  }
45
- const reporterInstance = await (0, _createReporter.createReporter)(reporterName, options, customReporters);
45
+ const reporterInstance = await (0, _createReporter.createReporter)(reporterName, options, customReportersOptions);
46
46
  logger.addReporter(reporterInstance);
47
47
  }
48
48
  return logger.reporters;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/initializeReporters.ts"],"sourcesContent":["import { createReporter } from \"./createReporter.js\";\nimport type { LogStructuredData, Logger, Reporter } from \"@lage-run/logger\";\nimport {\n type BuiltInReporterName,\n type ReporterInitOptions,\n type ReporterName,\n builtInReporterNames,\n logBuiltInReporterNames,\n} from \"../types/ReporterInitOptions.js\";\n\nexport async function initializeReporters(\n logger: Logger,\n options: ReporterInitOptions,\n customReporters: Record<string, string> = {}\n): Promise<Reporter<LogStructuredData>[]> {\n const customReporterNames = Object.keys(customReporters);\n\n // Mapping from lowercase reporter name to original name\n const supportedReportersLower = Object.fromEntries(\n [...builtInReporterNames, ...customReporterNames].map((name) => [name.toLowerCase(), name])\n );\n\n // filter out falsy values (e.g. undefined) from the reporter array\n const reporterOptions = (Array.isArray(options.reporter) ? options.reporter : [options.reporter]).filter(Boolean) as ReporterName[];\n\n if (reporterOptions.length === 0) {\n // \"default\" is just a dummy name to trigger the default case in createReporter\n reporterOptions.push(\"default\" satisfies BuiltInReporterName);\n }\n\n // add profile reporter if --profile is passed\n if (options.profile) {\n reporterOptions.push(\"profile\" satisfies BuiltInReporterName);\n }\n\n for (const rawReporterName of reporterOptions) {\n // Validate the given name, but be flexible about the casing\n const reporterName = supportedReportersLower[rawReporterName.toLowerCase()];\n if (!reporterName) {\n const reportersList = [...logBuiltInReporterNames, ...customReporterNames].join(\", \");\n throw new Error(`Invalid --reporter option: \"${rawReporterName}\". Supported reporters are: ${reportersList}`);\n }\n\n const reporterInstance = await createReporter(reporterName, options, customReporters);\n logger.addReporter(reporterInstance);\n }\n\n return logger.reporters;\n}\n"],"names":["initializeReporters","logger","options","customReporters","customReporterNames","Object","keys","supportedReportersLower","fromEntries","builtInReporterNames","map","name","toLowerCase","reporterOptions","Array","isArray","reporter","filter","Boolean","length","push","profile","rawReporterName","reporterName","reportersList","logBuiltInReporterNames","join","Error","reporterInstance","createReporter","addReporter","reporters"],"mappings":";;;;+BAUsBA;;;eAAAA;;;gCAVS;qCAQxB;AAEA,eAAeA,oBACpBC,MAAc,EACdC,OAA4B,EAC5BC,kBAA0C,CAAC,CAAC;IAE5C,MAAMC,sBAAsBC,OAAOC,IAAI,CAACH;IAExC,wDAAwD;IACxD,MAAMI,0BAA0BF,OAAOG,WAAW,CAChD;WAAIC,yCAAoB;WAAKL;KAAoB,CAACM,GAAG,CAAC,CAACC,OAAS;YAACA,KAAKC,WAAW;YAAID;SAAK;IAG5F,mEAAmE;IACnE,MAAME,kBAAkB,AAACC,CAAAA,MAAMC,OAAO,CAACb,QAAQc,QAAQ,IAAId,QAAQc,QAAQ,GAAG;QAACd,QAAQc,QAAQ;KAAC,AAAD,EAAGC,MAAM,CAACC;IAEzG,IAAIL,gBAAgBM,MAAM,KAAK,GAAG;QAChC,+EAA+E;QAC/EN,gBAAgBO,IAAI,CAAC;IACvB;IAEA,8CAA8C;IAC9C,IAAIlB,QAAQmB,OAAO,EAAE;QACnBR,gBAAgBO,IAAI,CAAC;IACvB;IAEA,KAAK,MAAME,mBAAmBT,gBAAiB;QAC7C,4DAA4D;QAC5D,MAAMU,eAAehB,uBAAuB,CAACe,gBAAgBV,WAAW,GAAG;QAC3E,IAAI,CAACW,cAAc;YACjB,MAAMC,gBAAgB;mBAAIC,4CAAuB;mBAAKrB;aAAoB,CAACsB,IAAI,CAAC;YAChF,MAAM,IAAIC,MAAM,CAAC,4BAA4B,EAAEL,gBAAgB,4BAA4B,EAAEE,eAAe;QAC9G;QAEA,MAAMI,mBAAmB,MAAMC,IAAAA,8BAAc,EAACN,cAAcrB,SAASC;QACrEF,OAAO6B,WAAW,CAACF;IACrB;IAEA,OAAO3B,OAAO8B,SAAS;AACzB"}
1
+ {"version":3,"sources":["../../src/commands/initializeReporters.ts"],"sourcesContent":["import { createReporter, type CustomReportersOptions } from \"./createReporter.js\";\nimport type { LogStructuredData, Logger, Reporter } from \"@lage-run/logger\";\nimport {\n type BuiltInReporterName,\n type ReporterInitOptions,\n type ReporterName,\n builtInReporterNames,\n logBuiltInReporterNames,\n} from \"../types/ReporterInitOptions.js\";\n\nexport async function initializeReporters(\n logger: Logger,\n options: ReporterInitOptions,\n customReportersOptions: CustomReportersOptions | undefined\n): Promise<Reporter<LogStructuredData>[]> {\n const customReporterNames = Object.keys(customReportersOptions?.customReporters || {});\n\n // Mapping from lowercase reporter name to original name\n const supportedReportersLower = Object.fromEntries(\n [...builtInReporterNames, ...customReporterNames].map((name) => [name.toLowerCase(), name])\n );\n\n // filter out falsy values (e.g. undefined) from the reporter array\n const reporterOptions = (Array.isArray(options.reporter) ? options.reporter : [options.reporter]).filter(Boolean) as ReporterName[];\n\n if (reporterOptions.length === 0) {\n // \"default\" is just a dummy name to trigger the default case in createReporter\n reporterOptions.push(\"default\" satisfies BuiltInReporterName);\n }\n\n // add profile reporter if --profile is passed\n if (options.profile) {\n reporterOptions.push(\"profile\" satisfies BuiltInReporterName);\n }\n\n for (const rawReporterName of reporterOptions) {\n // Validate the given name, but be flexible about the casing\n const reporterName = supportedReportersLower[rawReporterName.toLowerCase()];\n if (!reporterName) {\n const reportersList = [...logBuiltInReporterNames, ...customReporterNames].join(\", \");\n throw new Error(`Invalid --reporter option: \"${rawReporterName}\". Supported reporters are: ${reportersList}`);\n }\n\n const reporterInstance = await createReporter(reporterName, options, customReportersOptions);\n logger.addReporter(reporterInstance);\n }\n\n return logger.reporters;\n}\n"],"names":["initializeReporters","logger","options","customReportersOptions","customReporterNames","Object","keys","customReporters","supportedReportersLower","fromEntries","builtInReporterNames","map","name","toLowerCase","reporterOptions","Array","isArray","reporter","filter","Boolean","length","push","profile","rawReporterName","reporterName","reportersList","logBuiltInReporterNames","join","Error","reporterInstance","createReporter","addReporter","reporters"],"mappings":";;;;+BAUsBA;;;eAAAA;;;gCAVsC;qCAQrD;AAEA,eAAeA,oBACpBC,MAAc,EACdC,OAA4B,EAC5BC,sBAA0D;IAE1D,MAAMC,sBAAsBC,OAAOC,IAAI,CAACH,wBAAwBI,mBAAmB,CAAC;IAEpF,wDAAwD;IACxD,MAAMC,0BAA0BH,OAAOI,WAAW,CAChD;WAAIC,yCAAoB;WAAKN;KAAoB,CAACO,GAAG,CAAC,CAACC,OAAS;YAACA,KAAKC,WAAW;YAAID;SAAK;IAG5F,mEAAmE;IACnE,MAAME,kBAAkB,AAACC,CAAAA,MAAMC,OAAO,CAACd,QAAQe,QAAQ,IAAIf,QAAQe,QAAQ,GAAG;QAACf,QAAQe,QAAQ;KAAC,AAAD,EAAGC,MAAM,CAACC;IAEzG,IAAIL,gBAAgBM,MAAM,KAAK,GAAG;QAChC,+EAA+E;QAC/EN,gBAAgBO,IAAI,CAAC;IACvB;IAEA,8CAA8C;IAC9C,IAAInB,QAAQoB,OAAO,EAAE;QACnBR,gBAAgBO,IAAI,CAAC;IACvB;IAEA,KAAK,MAAME,mBAAmBT,gBAAiB;QAC7C,4DAA4D;QAC5D,MAAMU,eAAehB,uBAAuB,CAACe,gBAAgBV,WAAW,GAAG;QAC3E,IAAI,CAACW,cAAc;YACjB,MAAMC,gBAAgB;mBAAIC,4CAAuB;mBAAKtB;aAAoB,CAACuB,IAAI,CAAC;YAChF,MAAM,IAAIC,MAAM,CAAC,4BAA4B,EAAEL,gBAAgB,4BAA4B,EAAEE,eAAe;QAC9G;QAEA,MAAMI,mBAAmB,MAAMC,IAAAA,8BAAc,EAACN,cAActB,SAASC;QACrEF,OAAO8B,WAAW,CAACF;IACrB;IAEA,OAAO5B,OAAO+B,SAAS;AACzB"}
@@ -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;