@lage-run/cli 0.36.2 → 0.36.3

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.
@@ -1,10 +1,5 @@
1
1
  import type { ReporterInitOptions } from "../types/ReporterInitOptions.js";
2
2
  import type { Reporter } from "@lage-run/logger";
3
- export interface CustomReportersOptions {
4
- customReporters: Record<string, string> | undefined;
5
- /** Monorepo root for resolving custom reporters*/
6
- root: string;
7
- }
8
3
  type MockImportReporter = (params: {
9
4
  reporterName: string;
10
5
  resolvedPath: string;
@@ -20,6 +15,8 @@ export declare function setMockImportReporter(mock: MockImportReporter | undefin
20
15
  *
21
16
  * NOTE: This is covered by tests in `initializeReporter.test.ts`, `customReporter.test.ts`, and
22
17
  * E2E `customReporter.test.ts`.
18
+ *
19
+ * @param customReporterPath For a custom reporter, this is its absolute path (not verified to exist yet)
23
20
  */
24
- export declare function createReporter(reporter: string, options: ReporterInitOptions, customReportersOptions: CustomReportersOptions | undefined): Promise<Reporter>;
21
+ export declare function createReporter(reporter: string, options: ReporterInitOptions, customReporterPath?: string): Promise<Reporter>;
25
22
  export {};
@@ -36,9 +36,12 @@ let mockImportReporter;
36
36
  function setMockImportReporter(mock) {
37
37
  mockImportReporter = mock;
38
38
  }
39
- async function createReporter(reporter, options, customReportersOptions) {
39
+ async function createReporter(reporter, options, customReporterPath) {
40
40
  const { verbose, grouped, logLevel: logLevelName, concurrency, profile, progress, logFile, indented, logMemory } = options;
41
41
  const logLevel = _logger.LogLevel[logLevelName];
42
+ if (customReporterPath) {
43
+ return loadCustomReporterModule(reporter, options, customReporterPath);
44
+ }
42
45
  const lageRoot = (0, _workspacetools.findPackageRoot)(__filename);
43
46
  const packageJson = JSON.parse(_fs.default.readFileSync(_path.default.join(lageRoot, "package.json"), "utf-8"));
44
47
  const version = packageJson.version;
@@ -85,10 +88,6 @@ async function createReporter(reporter, options, customReportersOptions) {
85
88
  case "vfl":
86
89
  return new _reporters.VerboseFileLogReporter(logFile, undefined, logMemory);
87
90
  }
88
- // Check if it's a custom reporter defined in config
89
- if (customReportersOptions?.customReporters?.[reporter]) {
90
- return loadCustomReporterModule(reporter, options, customReportersOptions);
91
- }
92
91
  // Default reporter behavior - auto-detect CI environments
93
92
  if (process.env.GITHUB_ACTIONS) {
94
93
  return new _reporters.GithubActionsReporter({
@@ -117,9 +116,7 @@ async function createReporter(reporter, options, customReportersOptions) {
117
116
  logMemory
118
117
  });
119
118
  }
120
- async function loadCustomReporterModule(reporter, options, customReportersOptions) {
121
- const { customReporters, root } = customReportersOptions;
122
- const resolvedPath = _path.default.resolve(root, customReporters[reporter]);
119
+ async function loadCustomReporterModule(reporter, options, resolvedPath) {
123
120
  if (!_fs.default.existsSync(resolvedPath)) {
124
121
  throw new Error(`Custom reporter "${reporter}" file "${resolvedPath}" does not exist`);
125
122
  }
@@ -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 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, logMemory } = 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, logMemory });\n case \"azureDevops\":\n case \"adoLog\":\n return new AdoReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel, logMemory });\n\n case \"githubActions\":\n case \"gha\":\n return new GithubActionsReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel, logMemory });\n\n case \"npmLog\":\n case \"old\":\n return new LogReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel, logMemory });\n\n case \"fancy\":\n return new ProgressReporter({ concurrency, version, logMemory });\n\n case \"verboseFileLog\":\n case \"vfl\":\n return new VerboseFileLogReporter(logFile, undefined, logMemory);\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, logMemory });\n }\n\n if (process.env.TF_BUILD) {\n return new AdoReporter({ grouped: true, logLevel: verbose ? LogLevel.verbose : logLevel, logMemory });\n }\n\n if (progress && isInteractive() && !(logLevel >= LogLevel.verbose || verbose || grouped)) {\n return new BasicReporter({ concurrency, version, logMemory });\n }\n\n return new LogReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel, logMemory });\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","logMemory","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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"}
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\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 *\n * @param customReporterPath For a custom reporter, this is its absolute path (not verified to exist yet)\n */\nexport async function createReporter(reporter: string, options: ReporterInitOptions, customReporterPath?: string): Promise<Reporter> {\n const { verbose, grouped, logLevel: logLevelName, concurrency, profile, progress, logFile, indented, logMemory } = options;\n const logLevel = LogLevel[logLevelName];\n\n if (customReporterPath) {\n return loadCustomReporterModule(reporter, options, customReporterPath);\n }\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, logMemory });\n case \"azureDevops\":\n case \"adoLog\":\n return new AdoReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel, logMemory });\n\n case \"githubActions\":\n case \"gha\":\n return new GithubActionsReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel, logMemory });\n\n case \"npmLog\":\n case \"old\":\n return new LogReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel, logMemory });\n\n case \"fancy\":\n return new ProgressReporter({ concurrency, version, logMemory });\n\n case \"verboseFileLog\":\n case \"vfl\":\n return new VerboseFileLogReporter(logFile, undefined, logMemory);\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, logMemory });\n }\n\n if (process.env.TF_BUILD) {\n return new AdoReporter({ grouped: true, logLevel: verbose ? LogLevel.verbose : logLevel, logMemory });\n }\n\n if (progress && isInteractive() && !(logLevel >= LogLevel.verbose || verbose || grouped)) {\n return new BasicReporter({ concurrency, version, logMemory });\n }\n\n return new LogReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel, logMemory });\n}\n\nasync function loadCustomReporterModule(reporter: string, options: ReporterInitOptions, resolvedPath: string): Promise<Reporter> {\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","customReporterPath","verbose","grouped","logLevel","logLevelName","concurrency","profile","progress","logFile","indented","logMemory","LogLevel","loadCustomReporterModule","lageRoot","findPackageRoot","__filename","packageJson","JSON","parse","fs","readFileSync","path","join","version","ChromeTraceEventsReporter","outputFile","undefined","JsonReporter","AdoReporter","GithubActionsReporter","LogReporter","ProgressReporter","VerboseFileLogReporter","process","env","GITHUB_ACTIONS","TF_BUILD","isInteractive","BasicReporter","resolvedPath","existsSync","Error","reporterInstance","reporterModule","reporterName","pathToFileURL","href","maybeReporter","default","error","log","summarize","issue"],"mappings":"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"}
@@ -26,10 +26,12 @@ async function execAction(options, command) {
26
26
  const logger = (0, _logger.default)();
27
27
  options.cwd = cwd;
28
28
  options.logLevel = options.logLevel ?? "info";
29
- options.reporter = options.reporter ?? "json";
30
- await (0, _initializeReporters.initializeReporters)(logger, options, {
31
- customReporters: config.reporters,
32
- root
29
+ await (0, _initializeReporters.initializeReporters)({
30
+ logger,
31
+ options,
32
+ config,
33
+ root,
34
+ defaultReporter: "json"
33
35
  });
34
36
  const { server } = options;
35
37
  if (server) {
@@ -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\";\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"}
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 await initializeReporters({ logger, options, config, root, defaultReporter: \"json\" });\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","initializeReporters","defaultReporter","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;IACvC,MAAMC,IAAAA,wCAAmB,EAAC;QAAEH;QAAQR;QAASM;QAAQF;QAAMQ,iBAAiB;IAAO;IAEnF,MAAM,EAAEC,MAAM,EAAE,GAAGb;IACnB,IAAIa,QAAQ;QACVL,OAAOM,IAAI,CAAC;QAEZ,IAAI,OAAOd,QAAQe,KAAK,KAAK,aAAa;YACxC,MAAM,IAAIC,MAAM;QAClB;QAEA,MAAMC,IAAAA,gCAAe,EAACjB,SAA8BC;IACtD,OAAO;QACL,MAAMiB,IAAAA,kCAAgB,EAAC;YAAEV;YAAQW,MAAMlB,QAAQkB,IAAI;YAAEjB,KAAKF,QAAQE,GAAG;YAAEkB,SAASpB,QAAQoB,OAAO;QAAC;IAClG;AACF"}
@@ -97,10 +97,12 @@ async function executeRemotely(options, command) {
97
97
  const config = await (0, _config.getConfig)(cwd);
98
98
  const logger = (0, _logger.default)();
99
99
  options.logLevel = options.logLevel ?? "info";
100
- options.reporter = options.reporter ?? "json";
101
- await (0, _initializeReporters.initializeReporters)(logger, options, {
102
- customReporters: config.reporters,
103
- root
100
+ await (0, _initializeReporters.initializeReporters)({
101
+ logger,
102
+ options,
103
+ config,
104
+ root,
105
+ defaultReporter: "json"
104
106
  });
105
107
  let client = await tryCreateClient(host, port);
106
108
  const args = command.args;
@@ -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 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 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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"}
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 await initializeReporters({ logger, options, config, root, defaultReporter: \"json\" });\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 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","initializeReporters","defaultReporter","join","launchServerInBackground","stdout","write","stderr","relativeGlobalInputsForTarget","path","relative","globalInputHashFile","simulateFileAccess","inputs","outputs"],"mappings":"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"}
@@ -39,26 +39,49 @@ export interface InfoResult {
39
39
  * The generated output can be read and used by other task runners, such as BuildXL.
40
40
  *
41
41
  * Expected format:
42
+ * ```json
42
43
  * [
43
44
  * {
44
- * "id": "bar##build",
45
- * "package": "bar",
46
- * "task": "build",
47
- * "command": "npm run build --blah",
48
- * "workingDirectory": "packages/bar",
49
- * "dependencies": []
45
+ * "id": "bar##build",
46
+ * "package": "bar",
47
+ * "task": "build",
48
+ * "command": "npm run build --blah",
49
+ * "workingDirectory": "packages/bar",
50
+ * "dependencies": []
50
51
  * },
51
52
  * {
52
- * "id": "foo##build",
53
- * "package": "foo",
54
- * "task": "build",
55
- * "command": "npm run build --blah",
56
- * "workingDirectory": "packages/foo",
57
- * "dependencies": [
58
- * "bar##build"
59
- * ],
60
- * "weight": 3,
61
- * "inputs": ["src//**/ export declare function infoAction(options: InfoActionOptions, command: Command): Promise<void>;
53
+ * "id": "foo##build",
54
+ * "package": "foo",
55
+ * "task": "build",
56
+ * "command": "npm run build --blah",
57
+ * "workingDirectory": "packages/foo",
58
+ * "dependencies": [
59
+ * "bar##build"
60
+ * ],
61
+ * "weight": 3,
62
+ * "inputs": ["src/** /*.ts"],
63
+ * "inputs": ["lib/** /*.js", "lib/** /*.d.ts"]
64
+ * "options": {
65
+ * "environment": {
66
+ * "custom_env_var": "x",
67
+ * }
68
+ * }
69
+ * },
70
+ * {
71
+ * "id": "foo##test",
72
+ * "package": "foo",
73
+ * "task": "test",
74
+ * "command": "npm run test --blah",
75
+ * "workingDirectory": "packages/foo",
76
+ * "dependencies": [
77
+ * "foo##build"
78
+ * ]
79
+ * },
80
+ * ...
81
+ * ]
82
+ * ```
83
+ */
84
+ export declare function infoAction(options: InfoActionOptions, command: Command): Promise<void>;
62
85
  export declare function generatePackageTask(target: Target, taskArgs: string[], config: Pick<ConfigOptions, "npmClient">, options: Pick<InfoActionOptions, "concurrency" | "server">, binPaths: {
63
86
  lage: string;
64
87
  "lage-server": string;
@@ -49,12 +49,14 @@ async function infoAction(options, command) {
49
49
  const config = await (0, _config.getConfig)(cwd);
50
50
  const logger = (0, _logger.default)();
51
51
  options.logLevel = options.logLevel ?? "info";
52
- options.reporter = options.reporter ?? "json";
53
52
  options.server = typeof options.server === "boolean" && options.server ? "localhost:5332" : options.server;
54
53
  const root = (0, _workspacetools.getWorkspaceManagerRoot)(cwd) ?? cwd;
55
- await (0, _initializeReporters.initializeReporters)(logger, options, {
56
- customReporters: config.reporters,
57
- root
54
+ await (0, _initializeReporters.initializeReporters)({
55
+ logger,
56
+ options,
57
+ config,
58
+ root,
59
+ defaultReporter: "json"
58
60
  });
59
61
  const packageInfos = (0, _workspacetools.getPackageInfos)(root);
60
62
  const { tasks, taskArgs } = (0, _filterArgsForTasks.filterArgsForTasks)(command.args);
@@ -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, 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 { sync as globbySync } from \"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 = globbySync(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 ? globbySync(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","globbySync","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":"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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 { sync as globbySync } from \"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 * ```json\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 * ```\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.server = typeof options.server === \"boolean\" && options.server ? \"localhost:5332\" : options.server;\n const root = getWorkspaceManagerRoot(cwd) ?? cwd;\n await initializeReporters({ logger, options, config, root, defaultReporter: \"json\" });\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 = globbySync(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 ? globbySync(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","server","root","getWorkspaceManagerRoot","initializeReporters","defaultReporter","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","globbySync","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":"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"}
@@ -1,4 +1,16 @@
1
- import { type CustomReportersOptions } from "./createReporter.js";
2
1
  import type { LogStructuredData, Logger, Reporter } from "@lage-run/logger";
3
- import { type ReporterInitOptions } from "../types/ReporterInitOptions.js";
4
- export declare function initializeReporters(logger: Logger, options: ReporterInitOptions, customReportersOptions: CustomReportersOptions | undefined): Promise<Reporter<LogStructuredData>[]>;
2
+ import { type BuiltInReporterName, type ReporterInitOptions } from "../types/ReporterInitOptions.js";
3
+ import type { ConfigOptions } from "@lage-run/config";
4
+ /**
5
+ * Initialize reporters based on the CLI or config file options and add them to the logger.
6
+ */
7
+ export declare function initializeReporters(params: {
8
+ /** Reporters will be added to this logger */
9
+ logger: Logger;
10
+ options: ReporterInitOptions;
11
+ config: Pick<ConfigOptions, "reporter" | "reporters">;
12
+ /** Monorepo root for resolving custom reporters */
13
+ root: string;
14
+ /** Reporter to use instead of `"default"` if none are specified */
15
+ defaultReporter?: BuiltInReporterName;
16
+ }): Promise<Reporter<LogStructuredData>[]>;
@@ -10,8 +10,15 @@ 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, customReportersOptions) {
14
- const customReporterNames = Object.keys(customReportersOptions?.customReporters || {});
13
+ const _path = /*#__PURE__*/ _interop_require_default(require("path"));
14
+ function _interop_require_default(obj) {
15
+ return obj && obj.__esModule ? obj : {
16
+ default: obj
17
+ };
18
+ }
19
+ async function initializeReporters(params) {
20
+ const { logger, options, config, root } = params;
21
+ const customReporterNames = Object.keys(config.reporters);
15
22
  // Mapping from lowercase reporter name to original name
16
23
  const supportedReportersLower = Object.fromEntries([
17
24
  ..._ReporterInitOptions.builtInReporterNames,
@@ -21,12 +28,15 @@ async function initializeReporters(logger, options, customReportersOptions) {
21
28
  name
22
29
  ]));
23
30
  // filter out falsy values (e.g. undefined) from the reporter array
24
- const reporterOptions = (Array.isArray(options.reporter) ? options.reporter : [
25
- options.reporter
31
+ const useReporterOption = options.reporter?.length ? options.reporter : config.reporter;
32
+ const reporterOptions = (Array.isArray(useReporterOption) ? [
33
+ ...useReporterOption
34
+ ] : [
35
+ useReporterOption
26
36
  ]).filter(Boolean);
27
37
  if (reporterOptions.length === 0) {
28
38
  // "default" is just a dummy name to trigger the default case in createReporter
29
- reporterOptions.push("default");
39
+ reporterOptions.push(params.defaultReporter || "default");
30
40
  }
31
41
  // add profile reporter if --profile is passed
32
42
  if (options.profile) {
@@ -42,7 +52,12 @@ async function initializeReporters(logger, options, customReportersOptions) {
42
52
  ].join(", ");
43
53
  throw new Error(`Invalid --reporter option: "${rawReporterName}". Supported reporters are: ${reportersList}`);
44
54
  }
45
- const reporterInstance = await (0, _createReporter.createReporter)(reporterName, options, customReportersOptions);
55
+ let reporterInstance;
56
+ if (config.reporters[reporterName]) {
57
+ reporterInstance = await (0, _createReporter.createReporter)(reporterName, options, _path.default.resolve(root, config.reporters[reporterName]));
58
+ } else {
59
+ reporterInstance = await (0, _createReporter.createReporter)(reporterName, options);
60
+ }
46
61
  logger.addReporter(reporterInstance);
47
62
  }
48
63
  return logger.reporters;
@@ -1 +1 @@
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
+ {"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\";\nimport type { ConfigOptions } from \"@lage-run/config\";\nimport path from \"path\";\n\n/**\n * Initialize reporters based on the CLI or config file options and add them to the logger.\n */\nexport async function initializeReporters(params: {\n /** Reporters will be added to this logger */\n logger: Logger;\n options: ReporterInitOptions;\n config: Pick<ConfigOptions, \"reporter\" | \"reporters\">;\n /** Monorepo root for resolving custom reporters */\n root: string;\n /** Reporter to use instead of `\"default\"` if none are specified */\n defaultReporter?: BuiltInReporterName;\n}): Promise<Reporter<LogStructuredData>[]> {\n const { logger, options, config, root } = params;\n\n const customReporterNames = Object.keys(config.reporters);\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 useReporterOption = options.reporter?.length ? options.reporter : config.reporter;\n const reporterOptions = (Array.isArray(useReporterOption) ? [...useReporterOption] : [useReporterOption]).filter(\n Boolean\n ) 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(params.defaultReporter || (\"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 let reporterInstance: Reporter;\n if (config.reporters[reporterName]) {\n reporterInstance = await createReporter(reporterName, options, path.resolve(root, config.reporters[reporterName]));\n } else {\n reporterInstance = await createReporter(reporterName, options);\n }\n logger.addReporter(reporterInstance);\n }\n\n return logger.reporters;\n}\n"],"names":["initializeReporters","params","logger","options","config","root","customReporterNames","Object","keys","reporters","supportedReportersLower","fromEntries","builtInReporterNames","map","name","toLowerCase","useReporterOption","reporter","length","reporterOptions","Array","isArray","filter","Boolean","push","defaultReporter","profile","rawReporterName","reporterName","reportersList","logBuiltInReporterNames","join","Error","reporterInstance","createReporter","path","resolve","addReporter"],"mappings":";;;;+BAesBA;;;eAAAA;;;gCAfS;qCAQxB;6DAEU;;;;;;AAKV,eAAeA,oBAAoBC,MASzC;IACC,MAAM,EAAEC,MAAM,EAAEC,OAAO,EAAEC,MAAM,EAAEC,IAAI,EAAE,GAAGJ;IAE1C,MAAMK,sBAAsBC,OAAOC,IAAI,CAACJ,OAAOK,SAAS;IAExD,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,oBAAoBb,QAAQc,QAAQ,EAAEC,SAASf,QAAQc,QAAQ,GAAGb,OAAOa,QAAQ;IACvF,MAAME,kBAAkB,AAACC,CAAAA,MAAMC,OAAO,CAACL,qBAAqB;WAAIA;KAAkB,GAAG;QAACA;KAAkB,AAAD,EAAGM,MAAM,CAC9GC;IAGF,IAAIJ,gBAAgBD,MAAM,KAAK,GAAG;QAChC,+EAA+E;QAC/EC,gBAAgBK,IAAI,CAACvB,OAAOwB,eAAe,IAAK;IAClD;IAEA,8CAA8C;IAC9C,IAAItB,QAAQuB,OAAO,EAAE;QACnBP,gBAAgBK,IAAI,CAAC;IACvB;IAEA,KAAK,MAAMG,mBAAmBR,gBAAiB;QAC7C,4DAA4D;QAC5D,MAAMS,eAAelB,uBAAuB,CAACiB,gBAAgBZ,WAAW,GAAG;QAC3E,IAAI,CAACa,cAAc;YACjB,MAAMC,gBAAgB;mBAAIC,4CAAuB;mBAAKxB;aAAoB,CAACyB,IAAI,CAAC;YAChF,MAAM,IAAIC,MAAM,CAAC,4BAA4B,EAAEL,gBAAgB,4BAA4B,EAAEE,eAAe;QAC9G;QAEA,IAAII;QACJ,IAAI7B,OAAOK,SAAS,CAACmB,aAAa,EAAE;YAClCK,mBAAmB,MAAMC,IAAAA,8BAAc,EAACN,cAAczB,SAASgC,aAAI,CAACC,OAAO,CAAC/B,MAAMD,OAAOK,SAAS,CAACmB,aAAa;QAClH,OAAO;YACLK,mBAAmB,MAAMC,IAAAA,8BAAc,EAACN,cAAczB;QACxD;QACAD,OAAOmC,WAAW,CAACJ;IACrB;IAEA,OAAO/B,OAAOO,SAAS;AACzB"}
@@ -34,11 +34,13 @@ async function runAction(options, command) {
34
34
  // Configure logger
35
35
  const logger = (0, _logger.default)();
36
36
  const root = (0, _workspacetools.getWorkspaceManagerRoot)(cwd) ?? cwd;
37
- const reporters = await (0, _initializeReporters.initializeReporters)(logger, {
38
- ...options,
39
- concurrency
40
- }, {
41
- customReporters: config.reporters,
37
+ const reporters = await (0, _initializeReporters.initializeReporters)({
38
+ logger,
39
+ options: {
40
+ ...options,
41
+ concurrency
42
+ },
43
+ config,
42
44
  root
43
45
  });
44
46
  // Build Target Graph
@@ -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\";\nimport createLogger from \"@lage-run/logger\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { FilterOptions } from \"../../types/FilterOptions.js\";\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 logMemory: options.logMemory,\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 if (summary.results !== \"success\") {\n process.exitCode = 1;\n }\n\n for (const reporter of reporters) {\n reporter.summarize(summary);\n }\n\n for (const reporter of reporters) {\n await reporter.cleanup?.();\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","logMemory","optimizedTargets","optimizeTargetGraph","runnerPicker","optimizedGraph","map","target","id","summary","run","cleanup","results","exitCode","reporter","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\";\nimport createLogger from \"@lage-run/logger\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { FilterOptions } from \"../../types/FilterOptions.js\";\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: { ...options, concurrency }, config, 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 logMemory: options.logMemory,\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 if (summary.results !== \"success\") {\n process.exitCode = 1;\n }\n\n for (const reporter of reporters) {\n reporter.summarize(summary);\n }\n\n for (const reporter of reporters) {\n await reporter.cleanup?.();\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","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","logMemory","optimizedTargets","optimizeTargetGraph","runnerPicker","optimizedGraph","map","target","id","summary","run","cleanup","results","exitCode","reporter","summarize","visibleTargets","Array","from","filter","hidden","length","NoTargetFoundError"],"mappings":"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"}
@@ -31,10 +31,12 @@ async function serverAction(options) {
31
31
  const logger = (0, _logger.default)();
32
32
  options.logLevel = options.logLevel ?? "info";
33
33
  options.logFile = options.logFile ?? _path.default.join((0, _cache.getCacheDirectoryRoot)(root), "server.log");
34
- options.reporter = options.reporter ?? "verboseFileLog";
35
- await (0, _initializeReporters.initializeReporters)(logger, options, {
36
- customReporters: config.reporters,
37
- root
34
+ await (0, _initializeReporters.initializeReporters)({
35
+ logger,
36
+ options,
37
+ config,
38
+ root,
39
+ defaultReporter: "verboseFileLog"
38
40
  });
39
41
  logger.info(`Starting server on http://${host}:${port}`);
40
42
  const abortController = new AbortController();
@@ -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\";\nimport { getWorkspaceManagerRoot } from \"workspace-tools\";\nimport path from \"path\";\nimport { getCacheDirectoryRoot } from \"@lage-run/cache\";\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 ?? path.join(getCacheDirectoryRoot(root), \"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","path","join","getCacheDirectoryRoot","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":";;;;+BAmBsBA;;;eAAAA;;;+DAnBoB;qCAEN;6BACF;qBACL;mCACK;wBACR;gCACc;6DACvB;uBACqB;;;;;;AAU/B,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,IAAIC,aAAI,CAACC,IAAI,CAACC,IAAAA,4BAAqB,EAACV,OAAO;IAC5ET,QAAQoB,QAAQ,GAAGpB,QAAQoB,QAAQ,IAAI;IACvC,MAAMC,IAAAA,wCAAmB,EAACR,QAAQb,SAAS;QAAEsB,iBAAiBX,OAAOY,SAAS;QAAEd;IAAK;IAErFI,OAAOW,IAAI,CAAC,CAAC,0BAA0B,EAAEpB,KAAK,CAAC,EAAEC,MAAM;IAEvD,MAAMoB,kBAAkB,IAAIC;IAE5B,MAAMC,cAAcC,IAAAA,8BAAiB,EAAC;QACpCrB;QACAsB,gBAAgB;YACdJ;YACAK,qBAAqB,IAAMC,WAAWlB,QAAQX,SAASuB,iBAAiBO;YACxEC,gBAAgBC;QAClB;QACArB;QACAsB,aAAanC,QAAQmC,WAAW;QAChChC;IACF;IACA,MAAM6B,aAAa,MAAMI,IAAAA,iBAAY,EAACT,aAAaF;IAEnD,MAAMO,WAAWK,MAAM,CAAC;QAAEjC;QAAMC;IAAK;IACrCQ,OAAOW,IAAI,CAAC,CAAC,2BAA2B,EAAEpB,KAAK,CAAC,EAAEC,KAAK,aAAa,EAAEH,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAIoC;AACJ,SAASP,WAAWlB,MAAc,EAAEX,OAAe,EAAEuB,eAAgC,EAAExB,MAAW;IAChGiC;IAEAI,gBAAgBC,WAAWC,UAAU,CAAC;QACpC3B,OAAOW,IAAI,CAAC,CAAC,uBAAuB,EAAEtB,QAAQ,QAAQ,CAAC;QACvDuB,gBAAgBgB,KAAK;QACrBxC,OAAOyC,KAAK;IACd,GAAGxC,UAAU;AACf;AAEA,SAASgC;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\";\nimport path from \"path\";\nimport { getCacheDirectoryRoot } from \"@lage-run/cache\";\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 ?? path.join(getCacheDirectoryRoot(root), \"server.log\");\n await initializeReporters({ logger, options, config, root, defaultReporter: \"verboseFileLog\" });\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","path","join","getCacheDirectoryRoot","initializeReporters","defaultReporter","info","abortController","AbortController","lageService","createLageService","serverControls","countdownToShutdown","resetTimer","lageServer","clearCountdown","clearTimer","concurrency","createServer","listen","timeoutHandle","globalThis","setTimeout","abort","close","clearTimeout"],"mappings":";;;;+BAmBsBA;;;eAAAA;;;+DAnBoB;qCAEN;6BACF;qBACL;mCACK;wBACR;gCACc;6DACvB;uBACqB;;;;;;AAU/B,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,IAAIC,aAAI,CAACC,IAAI,CAACC,IAAAA,4BAAqB,EAACV,OAAO;IAC5E,MAAMW,IAAAA,wCAAmB,EAAC;QAAEP;QAAQb;QAASW;QAAQF;QAAMY,iBAAiB;IAAiB;IAE7FR,OAAOS,IAAI,CAAC,CAAC,0BAA0B,EAAElB,KAAK,CAAC,EAAEC,MAAM;IAEvD,MAAMkB,kBAAkB,IAAIC;IAE5B,MAAMC,cAAcC,IAAAA,8BAAiB,EAAC;QACpCnB;QACAoB,gBAAgB;YACdJ;YACAK,qBAAqB,IAAMC,WAAWhB,QAAQX,SAASqB,iBAAiBO;YACxEC,gBAAgBC;QAClB;QACAnB;QACAoB,aAAajC,QAAQiC,WAAW;QAChC9B;IACF;IACA,MAAM2B,aAAa,MAAMI,IAAAA,iBAAY,EAACT,aAAaF;IAEnD,MAAMO,WAAWK,MAAM,CAAC;QAAE/B;QAAMC;IAAK;IACrCQ,OAAOS,IAAI,CAAC,CAAC,2BAA2B,EAAElB,KAAK,CAAC,EAAEC,KAAK,aAAa,EAAEH,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAIkC;AACJ,SAASP,WAAWhB,MAAc,EAAEX,OAAe,EAAEqB,eAAgC,EAAEtB,MAAW;IAChG+B;IAEAI,gBAAgBC,WAAWC,UAAU,CAAC;QACpCzB,OAAOS,IAAI,CAAC,CAAC,uBAAuB,EAAEpB,QAAQ,QAAQ,CAAC;QACvDqB,gBAAgBgB,KAAK;QACrBtC,OAAOuC,KAAK;IACd,GAAGtC,UAAU;AACf;AAEA,SAAS8B;IACP,IAAII,eAAe;QACjBC,WAAWI,YAAY,CAACL;IAC1B;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lage-run/cli",
3
- "version": "0.36.2",
3
+ "version": "0.36.3",
4
4
  "description": "Command Line Interface for Lage",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,16 +23,16 @@
23
23
  "lint": "monorepo-scripts lint"
24
24
  },
25
25
  "dependencies": {
26
- "@lage-run/cache": "^1.5.1",
27
- "@lage-run/config": "^0.9.5",
28
- "@lage-run/hasher": "^1.10.2",
26
+ "@lage-run/cache": "^1.5.2",
27
+ "@lage-run/config": "^0.9.6",
28
+ "@lage-run/hasher": "^1.10.3",
29
29
  "@lage-run/logger": "^1.4.1",
30
- "@lage-run/reporters": "^1.7.1",
30
+ "@lage-run/reporters": "^1.7.2",
31
31
  "@lage-run/rpc": "^1.4.5",
32
- "@lage-run/runners": "^1.4.4",
33
- "@lage-run/scheduler": "^1.6.2",
34
- "@lage-run/scheduler-types": "^0.4.2",
35
- "@lage-run/target-graph": "^0.15.1",
32
+ "@lage-run/runners": "^1.4.5",
33
+ "@lage-run/scheduler": "^1.6.3",
34
+ "@lage-run/scheduler-types": "^0.4.3",
35
+ "@lage-run/target-graph": "^0.15.2",
36
36
  "@lage-run/worker-threads-pool": "^0.10.2",
37
37
  "chokidar": "^3.6.0",
38
38
  "commander": "^9.5.0",
@@ -42,7 +42,7 @@
42
42
  "is-interactive": "^1.0.0",
43
43
  "proper-lockfile": "^4.1.2",
44
44
  "shell-quote": "^1.8.3",
45
- "workspace-tools": "^0.41.3"
45
+ "workspace-tools": "^0.41.4"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@lage-run/monorepo-scripts": "^1.0.0",