@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.
- package/lib/commands/createReporter.d.ts +3 -6
- package/lib/commands/createReporter.js +5 -8
- package/lib/commands/createReporter.js.map +1 -1
- package/lib/commands/exec/action.js +6 -4
- package/lib/commands/exec/action.js.map +1 -1
- package/lib/commands/exec/executeRemotely.js +6 -4
- package/lib/commands/exec/executeRemotely.js.map +1 -1
- package/lib/commands/info/action.d.ts +39 -16
- package/lib/commands/info/action.js +6 -4
- package/lib/commands/info/action.js.map +1 -1
- package/lib/commands/initializeReporters.d.ts +15 -3
- package/lib/commands/initializeReporters.js +21 -6
- package/lib/commands/initializeReporters.js.map +1 -1
- package/lib/commands/run/runAction.js +7 -5
- package/lib/commands/run/runAction.js.map +1 -1
- package/lib/commands/server/action.js +6 -4
- package/lib/commands/server/action.js.map +1 -1
- package/package.json +10 -10
|
@@ -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,
|
|
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,
|
|
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,
|
|
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\
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
|
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
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
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
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
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)(
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
14
|
-
|
|
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
|
|
25
|
-
|
|
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
|
-
|
|
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
|
|
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)(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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 },
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
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.
|
|
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.
|
|
27
|
-
"@lage-run/config": "^0.9.
|
|
28
|
-
"@lage-run/hasher": "^1.10.
|
|
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.
|
|
30
|
+
"@lage-run/reporters": "^1.7.2",
|
|
31
31
|
"@lage-run/rpc": "^1.4.5",
|
|
32
|
-
"@lage-run/runners": "^1.4.
|
|
33
|
-
"@lage-run/scheduler": "^1.6.
|
|
34
|
-
"@lage-run/scheduler-types": "^0.4.
|
|
35
|
-
"@lage-run/target-graph": "^0.15.
|
|
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.
|
|
45
|
+
"workspace-tools": "^0.41.4"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@lage-run/monorepo-scripts": "^1.0.0",
|