@lage-run/cli 0.25.6 → 0.25.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,22 @@
|
|
|
2
2
|
"name": "@lage-run/cli",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "
|
|
5
|
+
"date": "Tue, 11 Feb 2025 05:40:18 GMT",
|
|
6
|
+
"version": "0.25.7",
|
|
7
|
+
"tag": "@lage-run/cli_v0.25.7",
|
|
8
|
+
"comments": {
|
|
9
|
+
"patch": [
|
|
10
|
+
{
|
|
11
|
+
"author": "kchau@microsoft.com",
|
|
12
|
+
"package": "@lage-run/cli",
|
|
13
|
+
"commit": "55dce132215025f6dea54e36eabcd7853168de1b",
|
|
14
|
+
"comment": "fixing outputs to have correct outputs"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"date": "Mon, 10 Feb 2025 00:35:53 GMT",
|
|
6
21
|
"version": "0.25.6",
|
|
7
22
|
"tag": "@lage-run/cli_v0.25.6",
|
|
8
23
|
"comments": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
# Change Log - @lage-run/cli
|
|
2
2
|
|
|
3
|
-
<!-- This log was last generated on
|
|
3
|
+
<!-- This log was last generated on Tue, 11 Feb 2025 05:40:18 GMT and should not be manually modified. -->
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 0.25.7
|
|
8
|
+
|
|
9
|
+
Tue, 11 Feb 2025 05:40:18 GMT
|
|
10
|
+
|
|
11
|
+
### Patches
|
|
12
|
+
|
|
13
|
+
- fixing outputs to have correct outputs (kchau@microsoft.com)
|
|
14
|
+
|
|
7
15
|
## 0.25.6
|
|
8
16
|
|
|
9
|
-
Mon, 10 Feb 2025 00:35:
|
|
17
|
+
Mon, 10 Feb 2025 00:35:53 GMT
|
|
10
18
|
|
|
11
19
|
### Patches
|
|
12
20
|
|
|
@@ -240,7 +240,8 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
|
|
|
240
240
|
pipedStderr.unpipe(writableStderr);
|
|
241
241
|
});
|
|
242
242
|
const outputs = (0, _getOutputFiles.getOutputFiles)(root, target, config.cacheOptions?.outputGlob, packageTree);
|
|
243
|
-
|
|
243
|
+
const targetHashFileRelativePath = _path.default.relative(root, targetHashFullPath).replace(/\\/g, "/");
|
|
244
|
+
outputs.push(targetHashFileRelativePath);
|
|
244
245
|
results = {
|
|
245
246
|
packageName: request.packageName,
|
|
246
247
|
task: request.task,
|
|
@@ -254,7 +255,8 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
|
|
|
254
255
|
};
|
|
255
256
|
} catch (e) {
|
|
256
257
|
const outputs = (0, _getOutputFiles.getOutputFiles)(root, target, config.cacheOptions?.outputGlob, packageTree);
|
|
257
|
-
|
|
258
|
+
const targetHashFileRelativePath = _path.default.relative(root, targetHashFullPath).replace(/\\/g, "/");
|
|
259
|
+
outputs.push(targetHashFileRelativePath);
|
|
258
260
|
targetRun.status = "failed";
|
|
259
261
|
targetRun.duration = (0, _formathrtime.hrtimeDiff)(targetRun.startTime, process.hrtime());
|
|
260
262
|
results = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/server/lageService.ts"],"sourcesContent":["import { type ConfigOptions, getConfig, getConcurrency, getMaxWorkersPerTask } from \"@lage-run/config\";\nimport type { Logger } from \"@lage-run/logger\";\nimport { ConnectError, Code, type ILageService } from \"@lage-run/rpc\";\nimport { getStartTargetId, getTargetId, type Target, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { type Readable } from \"stream\";\nimport { type Pool, AggregatedPool } from \"@lage-run/worker-threads-pool\";\nimport { getInputFiles, type PackageTree, TargetHasher } from \"@lage-run/hasher\";\nimport { getOutputFiles } from \"./getOutputFiles.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { MemoryStream } from \"./MemoryStream.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { filterPipelineDefinitions } from \"../run/filterPipelineDefinitions.js\";\nimport type { TargetRun } from \"@lage-run/scheduler-types\";\nimport { formatDuration, hrToSeconds, hrtimeDiff } from \"@lage-run/format-hrtime\";\nimport path from \"path\";\nimport fs from \"fs\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n globalInputs: string[];\n targetHasher: TargetHasher;\n}\n\nlet initializedPromise: Promise<LageServiceContext> | undefined;\ninterface ServiceControls {\n abortController: AbortController;\n countdownToShutdown: () => void;\n clearCountdown: () => void;\n}\ninterface InitializeOptions {\n cwd: string;\n logger: Logger;\n serverControls: ServiceControls;\n concurrency?: number;\n nodeArg?: string;\n taskArgs: string[];\n tasks: string[];\n}\n\nfunction formatBytes(bytes: number) {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nasync function createInitializedPromise({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }: InitializeOptions) {\n if (initializedPromise) {\n return initializedPromise;\n }\n\n const config = await getConfig(cwd);\n const root = getWorkspaceRoot(cwd)!;\n const maxWorkers = getConcurrency(concurrency, config.concurrency);\n\n logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(\", \")}`);\n\n const { pipeline } = config;\n\n const packageInfos = getPackageInfos(root);\n\n logger.info(\"Initializing target graph\");\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: false,\n dependents: false,\n ignore: [],\n pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: undefined,\n since: undefined,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n });\n\n const targetHasher = new TargetHasher({\n root,\n environmentGlob: config.cacheOptions?.environmentGlob ?? [],\n logger,\n cacheKey: config.cacheOptions?.cacheKey,\n cliArgs: taskArgs,\n });\n\n logger.info(\"Initializing hasher\");\n await targetHasher.initialize();\n\n logger.info(\"Initializing dependency map\");\n\n const packageTree = targetHasher.packageTree!;\n const dependencyMap = targetHasher.dependencyMap;\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n logger.info(\"Initializing Pool\");\n const pool = new AggregatedPool({\n logger,\n maxWorkersByGroup: new Map([...getMaxWorkersPerTask(filteredPipeline, maxWorkers)]),\n groupBy: ({ target }) => target.task,\n maxWorkers,\n script: require.resolve(\"./singleTargetWorker.js\"),\n workerOptions: {\n stdout: true,\n stderr: true,\n workerData: {\n runners: {\n ...runnerPickerOptions(nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n shouldCache: false,\n shouldResetCache: false,\n },\n },\n },\n workerIdleMemoryLimit: config.workerIdleMemoryLimit,\n });\n\n serverControls.abortController.signal.addEventListener(\"abort\", () => {\n pool?.close();\n });\n\n pool?.on(\"freedWorker\", () => {\n logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);\n });\n\n pool?.on(\"idle\", () => {\n logger.info(\"All workers are idle, shutting down after timeout\");\n serverControls.countdownToShutdown();\n });\n\n const globalInputs = config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n\n logger.info(`Environment glob inputs: \\n${JSON.stringify(globalInputs)}\\n-------`);\n\n logger.info(\"done initializing\");\n return { config, targetGraph, packageTree, dependencyMap, root, pool, globalInputs, targetHasher };\n}\n\n/**\n * Initializes the lageService: the extra \"initializePromise\" ensures only one initialization is done at a time across threads\n * @param cwd\n * @param logger\n * @returns\n */\nasync function initialize(options: InitializeOptions): Promise<LageServiceContext> {\n initializedPromise = createInitializedPromise(options);\n return initializedPromise;\n}\n\ninterface CreateLageServiceOptions {\n cwd: string;\n serverControls: ServiceControls;\n logger: Logger;\n concurrency?: number;\n tasks: string[];\n}\n\nfunction getHashFilePath(target: Target) {\n return path.join(`node_modules/.lage/hash_${target.task}`);\n}\n\nexport async function createLageService({\n cwd,\n serverControls,\n logger,\n concurrency,\n tasks,\n}: CreateLageServiceOptions): Promise<ILageService> {\n return {\n async ping() {\n return { pong: true };\n },\n\n async runTarget(request) {\n if (global.gc) {\n global.gc();\n }\n\n serverControls.clearCountdown();\n\n // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call\n // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same\n // `lage info` call\n const { config, targetGraph, dependencyMap, packageTree, root, pool, globalInputs, targetHasher } = await initialize({\n cwd,\n logger,\n nodeArg: request.nodeOptions,\n taskArgs: request.taskArgs,\n serverControls,\n concurrency,\n tasks,\n });\n\n const runners = runnerPickerOptions(request.nodeOptions, config.npmClient, request.taskArgs);\n\n const id = getTargetId(request.packageName, request.task);\n\n if (!targetGraph.targets.has(id)) {\n logger.info(`Target not found: ${request.packageName}#${request.task}`);\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n };\n }\n\n logger.info(`Running target: ${request.packageName}#${request.task}`);\n\n const target = targetGraph.targets.get(id)!;\n const task = {\n target,\n runners,\n };\n\n const writableStdout = new MemoryStream();\n const writableStderr = new MemoryStream();\n let pipedStdout: Readable;\n let pipedStderr: Readable;\n\n const targetRun: TargetRun = {\n queueTime: process.hrtime(),\n target,\n duration: [0, 0],\n startTime: [0, 0],\n status: \"queued\",\n threadId: 0,\n };\n\n const targetGlobalInputs = target.environmentGlob ? glob(target.environmentGlob, { cwd: root, gitignore: true }) : globalInputs;\n\n let results: {\n packageName?: string;\n task: string;\n exitCode: number;\n inputs: string[];\n outputs: string[];\n stdout: string;\n stderr: string;\n id: string;\n globalInputs: string[];\n };\n\n const inputs = getInputFiles(target, dependencyMap, packageTree);\n\n for (const dep of target.dependencies) {\n if (dep === getStartTargetId()) {\n continue;\n }\n\n const depTarget = targetGraph.targets.get(dep)!;\n inputs.push(path.join(path.relative(root, depTarget.cwd), getHashFilePath(depTarget)).replace(/\\\\/g, \"/\"));\n }\n\n const targetHashFile = getHashFilePath(target);\n const targetHashFullPath = path.join(target.cwd, targetHashFile);\n\n try {\n if (!fs.existsSync(path.dirname(targetHashFullPath))) {\n fs.mkdirSync(path.dirname(targetHashFullPath), { recursive: true });\n }\n\n fs.writeFileSync(targetHashFullPath, await targetHasher.hash(target));\n } catch (e) {\n throw new ConnectError(`Error writing target hash file: ${targetHashFullPath}`, Code.Internal);\n }\n\n try {\n await pool.exec(\n task,\n 0,\n (worker, stdout, stderr) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);\n\n pipedStdout = stdout;\n pipedStderr = stderr;\n\n stdout.pipe(writableStdout);\n stderr.pipe(writableStderr);\n\n targetRun.threadId = worker.threadId;\n targetRun.status = \"running\";\n targetRun.startTime = process.hrtime();\n },\n (worker) => {\n logger.info(`Max Worker Memory Usage: ${formatBytes(pool.stats().maxWorkerMemoryUsage)}`);\n\n // logger.info the main process memory usage\n const memoryUsage = process.memoryUsage();\n logger.info(\n `Main Process Memory Usage: RSS: ${formatBytes(memoryUsage.rss)} Heap Total: ${formatBytes(\n memoryUsage.heapTotal\n )} Heap Used: ${formatBytes(memoryUsage.heapUsed)}`\n );\n\n targetRun.status = \"success\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n logger.info(\n `[${worker.threadId}] ${request.packageName}#${request.task} end: ${formatDuration(hrToSeconds(targetRun.duration))}`\n );\n pipedStdout.unpipe(writableStdout);\n pipedStderr.unpipe(writableStderr);\n }\n );\n\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n outputs.push(targetHashFile);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n globalInputs: targetGlobalInputs,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n outputs.push(targetHashFile);\n\n targetRun.status = \"failed\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n globalInputs: targetGlobalInputs,\n };\n }\n\n logger.info(\n `${request.packageName}#${request.task} results: \\n${JSON.stringify(\n {\n packageName: results.packageName,\n task: results.task,\n exitCode: results.exitCode,\n inputs: results.inputs,\n outputs: results.outputs,\n id: results.id,\n globalInputs: `(${target.environmentGlob ? \"custom target env glob used\" : \"general global inputs used\"}): ${\n results.globalInputs.length\n } files`,\n },\n null,\n 2\n )}\\n------`,\n results\n );\n\n return results;\n },\n };\n}\n"],"names":["createLageService","initializedPromise","formatBytes","bytes","toFixed","createInitializedPromise","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","config","getConfig","root","getWorkspaceRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","priorities","targetHasher","TargetHasher","environmentGlob","cacheKey","cliArgs","initialize","packageTree","dependencyMap","filteredPipeline","filterPipelineDefinitions","targets","values","pool","AggregatedPool","maxWorkersByGroup","Map","getMaxWorkersPerTask","groupBy","target","task","script","require","resolve","workerOptions","stdout","stderr","workerData","runners","runnerPickerOptions","npmClient","shouldCache","shouldResetCache","workerIdleMemoryLimit","abortController","signal","addEventListener","close","on","silly","stats","maxWorkerMemoryUsage","countdownToShutdown","globalInputs","glob","gitignore","JSON","stringify","options","getHashFilePath","path","ping","pong","runTarget","request","global","gc","clearCountdown","nodeOptions","id","getTargetId","packageName","has","exitCode","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","targetRun","queueTime","process","hrtime","duration","startTime","status","threadId","targetGlobalInputs","results","inputs","getInputFiles","dep","getStartTargetId","depTarget","push","relative","replace","targetHashFile","targetHashFullPath","fs","existsSync","dirname","mkdirSync","recursive","writeFileSync","hash","e","ConnectError","Code","Internal","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","toString","Error","length"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/server/lageService.ts"],"sourcesContent":["import { type ConfigOptions, getConfig, getConcurrency, getMaxWorkersPerTask } from \"@lage-run/config\";\nimport type { Logger } from \"@lage-run/logger\";\nimport { ConnectError, Code, type ILageService } from \"@lage-run/rpc\";\nimport { getStartTargetId, getTargetId, type Target, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { type Readable } from \"stream\";\nimport { type Pool, AggregatedPool } from \"@lage-run/worker-threads-pool\";\nimport { getInputFiles, type PackageTree, TargetHasher } from \"@lage-run/hasher\";\nimport { getOutputFiles } from \"./getOutputFiles.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { MemoryStream } from \"./MemoryStream.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { filterPipelineDefinitions } from \"../run/filterPipelineDefinitions.js\";\nimport type { TargetRun } from \"@lage-run/scheduler-types\";\nimport { formatDuration, hrToSeconds, hrtimeDiff } from \"@lage-run/format-hrtime\";\nimport path from \"path\";\nimport fs from \"fs\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n globalInputs: string[];\n targetHasher: TargetHasher;\n}\n\nlet initializedPromise: Promise<LageServiceContext> | undefined;\ninterface ServiceControls {\n abortController: AbortController;\n countdownToShutdown: () => void;\n clearCountdown: () => void;\n}\ninterface InitializeOptions {\n cwd: string;\n logger: Logger;\n serverControls: ServiceControls;\n concurrency?: number;\n nodeArg?: string;\n taskArgs: string[];\n tasks: string[];\n}\n\nfunction formatBytes(bytes: number) {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nasync function createInitializedPromise({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }: InitializeOptions) {\n if (initializedPromise) {\n return initializedPromise;\n }\n\n const config = await getConfig(cwd);\n const root = getWorkspaceRoot(cwd)!;\n const maxWorkers = getConcurrency(concurrency, config.concurrency);\n\n logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(\", \")}`);\n\n const { pipeline } = config;\n\n const packageInfos = getPackageInfos(root);\n\n logger.info(\"Initializing target graph\");\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: false,\n dependents: false,\n ignore: [],\n pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: undefined,\n since: undefined,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n });\n\n const targetHasher = new TargetHasher({\n root,\n environmentGlob: config.cacheOptions?.environmentGlob ?? [],\n logger,\n cacheKey: config.cacheOptions?.cacheKey,\n cliArgs: taskArgs,\n });\n\n logger.info(\"Initializing hasher\");\n await targetHasher.initialize();\n\n logger.info(\"Initializing dependency map\");\n\n const packageTree = targetHasher.packageTree!;\n const dependencyMap = targetHasher.dependencyMap;\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n logger.info(\"Initializing Pool\");\n const pool = new AggregatedPool({\n logger,\n maxWorkersByGroup: new Map([...getMaxWorkersPerTask(filteredPipeline, maxWorkers)]),\n groupBy: ({ target }) => target.task,\n maxWorkers,\n script: require.resolve(\"./singleTargetWorker.js\"),\n workerOptions: {\n stdout: true,\n stderr: true,\n workerData: {\n runners: {\n ...runnerPickerOptions(nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n shouldCache: false,\n shouldResetCache: false,\n },\n },\n },\n workerIdleMemoryLimit: config.workerIdleMemoryLimit,\n });\n\n serverControls.abortController.signal.addEventListener(\"abort\", () => {\n pool?.close();\n });\n\n pool?.on(\"freedWorker\", () => {\n logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);\n });\n\n pool?.on(\"idle\", () => {\n logger.info(\"All workers are idle, shutting down after timeout\");\n serverControls.countdownToShutdown();\n });\n\n const globalInputs = config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n\n logger.info(`Environment glob inputs: \\n${JSON.stringify(globalInputs)}\\n-------`);\n\n logger.info(\"done initializing\");\n return { config, targetGraph, packageTree, dependencyMap, root, pool, globalInputs, targetHasher };\n}\n\n/**\n * Initializes the lageService: the extra \"initializePromise\" ensures only one initialization is done at a time across threads\n * @param cwd\n * @param logger\n * @returns\n */\nasync function initialize(options: InitializeOptions): Promise<LageServiceContext> {\n initializedPromise = createInitializedPromise(options);\n return initializedPromise;\n}\n\ninterface CreateLageServiceOptions {\n cwd: string;\n serverControls: ServiceControls;\n logger: Logger;\n concurrency?: number;\n tasks: string[];\n}\n\nfunction getHashFilePath(target: Target) {\n return path.join(`node_modules/.lage/hash_${target.task}`);\n}\n\nexport async function createLageService({\n cwd,\n serverControls,\n logger,\n concurrency,\n tasks,\n}: CreateLageServiceOptions): Promise<ILageService> {\n return {\n async ping() {\n return { pong: true };\n },\n\n async runTarget(request) {\n if (global.gc) {\n global.gc();\n }\n\n serverControls.clearCountdown();\n\n // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call\n // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same\n // `lage info` call\n const { config, targetGraph, dependencyMap, packageTree, root, pool, globalInputs, targetHasher } = await initialize({\n cwd,\n logger,\n nodeArg: request.nodeOptions,\n taskArgs: request.taskArgs,\n serverControls,\n concurrency,\n tasks,\n });\n\n const runners = runnerPickerOptions(request.nodeOptions, config.npmClient, request.taskArgs);\n\n const id = getTargetId(request.packageName, request.task);\n\n if (!targetGraph.targets.has(id)) {\n logger.info(`Target not found: ${request.packageName}#${request.task}`);\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n };\n }\n\n logger.info(`Running target: ${request.packageName}#${request.task}`);\n\n const target = targetGraph.targets.get(id)!;\n const task = {\n target,\n runners,\n };\n\n const writableStdout = new MemoryStream();\n const writableStderr = new MemoryStream();\n let pipedStdout: Readable;\n let pipedStderr: Readable;\n\n const targetRun: TargetRun = {\n queueTime: process.hrtime(),\n target,\n duration: [0, 0],\n startTime: [0, 0],\n status: \"queued\",\n threadId: 0,\n };\n\n const targetGlobalInputs = target.environmentGlob ? glob(target.environmentGlob, { cwd: root, gitignore: true }) : globalInputs;\n\n let results: {\n packageName?: string;\n task: string;\n exitCode: number;\n inputs: string[];\n outputs: string[];\n stdout: string;\n stderr: string;\n id: string;\n globalInputs: string[];\n };\n\n const inputs = getInputFiles(target, dependencyMap, packageTree);\n\n for (const dep of target.dependencies) {\n if (dep === getStartTargetId()) {\n continue;\n }\n\n const depTarget = targetGraph.targets.get(dep)!;\n inputs.push(path.join(path.relative(root, depTarget.cwd), getHashFilePath(depTarget)).replace(/\\\\/g, \"/\"));\n }\n\n const targetHashFile = getHashFilePath(target);\n const targetHashFullPath = path.join(target.cwd, targetHashFile);\n\n try {\n if (!fs.existsSync(path.dirname(targetHashFullPath))) {\n fs.mkdirSync(path.dirname(targetHashFullPath), { recursive: true });\n }\n\n fs.writeFileSync(targetHashFullPath, await targetHasher.hash(target));\n } catch (e) {\n throw new ConnectError(`Error writing target hash file: ${targetHashFullPath}`, Code.Internal);\n }\n\n try {\n await pool.exec(\n task,\n 0,\n (worker, stdout, stderr) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);\n\n pipedStdout = stdout;\n pipedStderr = stderr;\n\n stdout.pipe(writableStdout);\n stderr.pipe(writableStderr);\n\n targetRun.threadId = worker.threadId;\n targetRun.status = \"running\";\n targetRun.startTime = process.hrtime();\n },\n (worker) => {\n logger.info(`Max Worker Memory Usage: ${formatBytes(pool.stats().maxWorkerMemoryUsage)}`);\n\n // logger.info the main process memory usage\n const memoryUsage = process.memoryUsage();\n logger.info(\n `Main Process Memory Usage: RSS: ${formatBytes(memoryUsage.rss)} Heap Total: ${formatBytes(\n memoryUsage.heapTotal\n )} Heap Used: ${formatBytes(memoryUsage.heapUsed)}`\n );\n\n targetRun.status = \"success\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n logger.info(\n `[${worker.threadId}] ${request.packageName}#${request.task} end: ${formatDuration(hrToSeconds(targetRun.duration))}`\n );\n pipedStdout.unpipe(writableStdout);\n pipedStderr.unpipe(writableStderr);\n }\n );\n\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n const targetHashFileRelativePath = path.relative(root, targetHashFullPath).replace(/\\\\/g, \"/\");\n outputs.push(targetHashFileRelativePath);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n globalInputs: targetGlobalInputs,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n const targetHashFileRelativePath = path.relative(root, targetHashFullPath).replace(/\\\\/g, \"/\");\n outputs.push(targetHashFileRelativePath);\n\n targetRun.status = \"failed\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n globalInputs: targetGlobalInputs,\n };\n }\n\n logger.info(\n `${request.packageName}#${request.task} results: \\n${JSON.stringify(\n {\n packageName: results.packageName,\n task: results.task,\n exitCode: results.exitCode,\n inputs: results.inputs,\n outputs: results.outputs,\n id: results.id,\n globalInputs: `(${target.environmentGlob ? \"custom target env glob used\" : \"general global inputs used\"}): ${\n results.globalInputs.length\n } files`,\n },\n null,\n 2\n )}\\n------`,\n results\n );\n\n return results;\n },\n };\n}\n"],"names":["createLageService","initializedPromise","formatBytes","bytes","toFixed","createInitializedPromise","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","config","getConfig","root","getWorkspaceRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","priorities","targetHasher","TargetHasher","environmentGlob","cacheKey","cliArgs","initialize","packageTree","dependencyMap","filteredPipeline","filterPipelineDefinitions","targets","values","pool","AggregatedPool","maxWorkersByGroup","Map","getMaxWorkersPerTask","groupBy","target","task","script","require","resolve","workerOptions","stdout","stderr","workerData","runners","runnerPickerOptions","npmClient","shouldCache","shouldResetCache","workerIdleMemoryLimit","abortController","signal","addEventListener","close","on","silly","stats","maxWorkerMemoryUsage","countdownToShutdown","globalInputs","glob","gitignore","JSON","stringify","options","getHashFilePath","path","ping","pong","runTarget","request","global","gc","clearCountdown","nodeOptions","id","getTargetId","packageName","has","exitCode","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","targetRun","queueTime","process","hrtime","duration","startTime","status","threadId","targetGlobalInputs","results","inputs","getInputFiles","dep","getStartTargetId","depTarget","push","relative","replace","targetHashFile","targetHashFullPath","fs","existsSync","dirname","mkdirSync","recursive","writeFileSync","hash","e","ConnectError","Code","Internal","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","targetHashFileRelativePath","toString","Error","length"],"mappings":";;;;+BAwKsBA;;;eAAAA;;;wBAxK8D;qBAE9B;6BACuB;gCACP;mCACpC;mCAEQ;wBACoB;gCAC/B;wBACV;8BACQ;qCACO;2CACM;8BAEc;6DACvC;2DACF;;;;;;AAaf,IAAIC;AAgBJ,SAASC,YAAYC,KAAa;IAChC,OAAO,GAAG,AAACA,CAAAA,QAAQ,OAAO,IAAG,EAAGC,OAAO,CAAC,GAAG,GAAG,CAAC;AACjD;AAEA,eAAeC,yBAAyB,EAAEC,GAAG,EAAEC,MAAM,EAAEC,cAAc,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,KAAK,EAAqB;IAC/H,IAAIX,oBAAoB;QACtB,OAAOA;IACT;IAEA,MAAMY,SAAS,MAAMC,IAAAA,iBAAS,EAACR;IAC/B,MAAMS,OAAOC,IAAAA,gCAAgB,EAACV;IAC9B,MAAMW,aAAaC,IAAAA,sBAAc,EAACP,aAAaE,OAAOF,WAAW;IAEjEJ,OAAOY,IAAI,CAAC,CAAC,kBAAkB,EAAEF,WAAW,iBAAiB,EAAEL,MAAMQ,IAAI,CAAC,OAAO;IAEjF,MAAM,EAAEC,QAAQ,EAAE,GAAGR;IAErB,MAAMS,eAAeC,IAAAA,+BAAe,EAACR;IAErCR,OAAOY,IAAI,CAAC;IACZ,MAAMK,cAAc,MAAMC,IAAAA,oCAAiB,EAAC;QAC1ClB;QACAQ;QACAW,cAAc;QACdC,YAAY;QACZC,QAAQ,EAAE;QACVP;QACAQ,iBAAiBhB,OAAOgB,eAAe;QACvCC,OAAOC;QACPC,OAAOD;QACPE,SAASpB,OAAOqB,YAAY,CAACC,UAAU;QACvCvB;QACAU;QACAc,YAAYvB,OAAOuB,UAAU;IAC/B;IAEA,MAAMC,eAAe,IAAIC,oBAAY,CAAC;QACpCvB;QACAwB,iBAAiB1B,OAAOqB,YAAY,EAAEK,mBAAmB,EAAE;QAC3DhC;QACAiC,UAAU3B,OAAOqB,YAAY,EAAEM;QAC/BC,SAAS/B;IACX;IAEAH,OAAOY,IAAI,CAAC;IACZ,MAAMkB,aAAaK,UAAU;IAE7BnC,OAAOY,IAAI,CAAC;IAEZ,MAAMwB,cAAcN,aAAaM,WAAW;IAC5C,MAAMC,gBAAgBP,aAAaO,aAAa;IAEhD,MAAMC,mBAAmBC,IAAAA,oDAAyB,EAACtB,YAAYuB,OAAO,CAACC,MAAM,IAAInC,OAAOQ,QAAQ;IAEhGd,OAAOY,IAAI,CAAC;IACZ,MAAM8B,OAAO,IAAIC,iCAAc,CAAC;QAC9B3C;QACA4C,mBAAmB,IAAIC,IAAI;eAAIC,IAAAA,4BAAoB,EAACR,kBAAkB5B;SAAY;QAClFqC,SAAS,CAAC,EAAEC,MAAM,EAAE,GAAKA,OAAOC,IAAI;QACpCvC;QACAwC,QAAQC,QAAQC,OAAO,CAAC;QACxBC,eAAe;YACbC,QAAQ;YACRC,QAAQ;YACRC,YAAY;gBACVC,SAAS;oBACP,GAAGC,IAAAA,wCAAmB,EAACxD,SAASI,OAAOqD,SAAS,EAAExD,SAAS;oBAC3D,GAAGG,OAAOmD,OAAO;oBACjBG,aAAa;oBACbC,kBAAkB;gBACpB;YACF;QACF;QACAC,uBAAuBxD,OAAOwD,qBAAqB;IACrD;IAEA7D,eAAe8D,eAAe,CAACC,MAAM,CAACC,gBAAgB,CAAC,SAAS;QAC9DvB,MAAMwB;IACR;IAEAxB,MAAMyB,GAAG,eAAe;QACtBnE,OAAOoE,KAAK,CAAC,CAAC,yBAAyB,EAAEzE,YAAY+C,MAAM2B,QAAQC,uBAAuB;IAC5F;IAEA5B,MAAMyB,GAAG,QAAQ;QACfnE,OAAOY,IAAI,CAAC;QACZX,eAAesE,mBAAmB;IACpC;IAEA,MAAMC,eAAelE,OAAOqB,YAAY,EAAEK,kBACtCyC,IAAAA,YAAI,EAACnE,OAAOqB,YAAY,EAAEK,iBAAiB;QAAEjC,KAAKS;QAAMkE,WAAW;IAAK,KACxE;QAAC;KAAiB;IAEtB1E,OAAOY,IAAI,CAAC,CAAC,2BAA2B,EAAE+D,KAAKC,SAAS,CAACJ,cAAc,SAAS,CAAC;IAEjFxE,OAAOY,IAAI,CAAC;IACZ,OAAO;QAAEN;QAAQW;QAAamB;QAAaC;QAAe7B;QAAMkC;QAAM8B;QAAc1C;IAAa;AACnG;AAEA;;;;;CAKC,GACD,eAAeK,WAAW0C,OAA0B;IAClDnF,qBAAqBI,yBAAyB+E;IAC9C,OAAOnF;AACT;AAUA,SAASoF,gBAAgB9B,MAAc;IACrC,OAAO+B,aAAI,CAAClE,IAAI,CAAC,CAAC,wBAAwB,EAAEmC,OAAOC,IAAI,EAAE;AAC3D;AAEO,eAAexD,kBAAkB,EACtCM,GAAG,EACHE,cAAc,EACdD,MAAM,EACNI,WAAW,EACXC,KAAK,EACoB;IACzB,OAAO;QACL,MAAM2E;YACJ,OAAO;gBAAEC,MAAM;YAAK;QACtB;QAEA,MAAMC,WAAUC,OAAO;YACrB,IAAIC,OAAOC,EAAE,EAAE;gBACbD,OAAOC,EAAE;YACX;YAEApF,eAAeqF,cAAc;YAE7B,2FAA2F;YAC3F,qIAAqI;YACrI,mBAAmB;YACnB,MAAM,EAAEhF,MAAM,EAAEW,WAAW,EAAEoB,aAAa,EAAED,WAAW,EAAE5B,IAAI,EAAEkC,IAAI,EAAE8B,YAAY,EAAE1C,YAAY,EAAE,GAAG,MAAMK,WAAW;gBACnHpC;gBACAC;gBACAE,SAASiF,QAAQI,WAAW;gBAC5BpF,UAAUgF,QAAQhF,QAAQ;gBAC1BF;gBACAG;gBACAC;YACF;YAEA,MAAMoD,UAAUC,IAAAA,wCAAmB,EAACyB,QAAQI,WAAW,EAAEjF,OAAOqD,SAAS,EAAEwB,QAAQhF,QAAQ;YAE3F,MAAMqF,KAAKC,IAAAA,wBAAW,EAACN,QAAQO,WAAW,EAAEP,QAAQlC,IAAI;YAExD,IAAI,CAAChC,YAAYuB,OAAO,CAACmD,GAAG,CAACH,KAAK;gBAChCxF,OAAOY,IAAI,CAAC,CAAC,kBAAkB,EAAEuE,QAAQO,WAAW,CAAC,CAAC,EAAEP,QAAQlC,IAAI,EAAE;gBACtE,OAAO;oBACLyC,aAAaP,QAAQO,WAAW;oBAChCzC,MAAMkC,QAAQlC,IAAI;oBAClB2C,UAAU;gBACZ;YACF;YAEA5F,OAAOY,IAAI,CAAC,CAAC,gBAAgB,EAAEuE,QAAQO,WAAW,CAAC,CAAC,EAAEP,QAAQlC,IAAI,EAAE;YAEpE,MAAMD,SAAS/B,YAAYuB,OAAO,CAACqD,GAAG,CAACL;YACvC,MAAMvC,OAAO;gBACXD;gBACAS;YACF;YAEA,MAAMqC,iBAAiB,IAAIC,0BAAY;YACvC,MAAMC,iBAAiB,IAAID,0BAAY;YACvC,IAAIE;YACJ,IAAIC;YAEJ,MAAMC,YAAuB;gBAC3BC,WAAWC,QAAQC,MAAM;gBACzBtD;gBACAuD,UAAU;oBAAC;oBAAG;iBAAE;gBAChBC,WAAW;oBAAC;oBAAG;iBAAE;gBACjBC,QAAQ;gBACRC,UAAU;YACZ;YAEA,MAAMC,qBAAqB3D,OAAOhB,eAAe,GAAGyC,IAAAA,YAAI,EAACzB,OAAOhB,eAAe,EAAE;gBAAEjC,KAAKS;gBAAMkE,WAAW;YAAK,KAAKF;YAEnH,IAAIoC;YAYJ,MAAMC,SAASC,IAAAA,qBAAa,EAAC9D,QAAQX,eAAeD;YAEpD,KAAK,MAAM2E,OAAO/D,OAAO7B,YAAY,CAAE;gBACrC,IAAI4F,QAAQC,IAAAA,6BAAgB,KAAI;oBAC9B;gBACF;gBAEA,MAAMC,YAAYhG,YAAYuB,OAAO,CAACqD,GAAG,CAACkB;gBAC1CF,OAAOK,IAAI,CAACnC,aAAI,CAAClE,IAAI,CAACkE,aAAI,CAACoC,QAAQ,CAAC3G,MAAMyG,UAAUlH,GAAG,GAAG+E,gBAAgBmC,YAAYG,OAAO,CAAC,OAAO;YACvG;YAEA,MAAMC,iBAAiBvC,gBAAgB9B;YACvC,MAAMsE,qBAAqBvC,aAAI,CAAClE,IAAI,CAACmC,OAAOjD,GAAG,EAAEsH;YAEjD,IAAI;gBACF,IAAI,CAACE,WAAE,CAACC,UAAU,CAACzC,aAAI,CAAC0C,OAAO,CAACH,sBAAsB;oBACpDC,WAAE,CAACG,SAAS,CAAC3C,aAAI,CAAC0C,OAAO,CAACH,qBAAqB;wBAAEK,WAAW;oBAAK;gBACnE;gBAEAJ,WAAE,CAACK,aAAa,CAACN,oBAAoB,MAAMxF,aAAa+F,IAAI,CAAC7E;YAC/D,EAAE,OAAO8E,GAAG;gBACV,MAAM,IAAIC,iBAAY,CAAC,CAAC,gCAAgC,EAAET,oBAAoB,EAAEU,SAAI,CAACC,QAAQ;YAC/F;YAEA,IAAI;gBACF,MAAMvF,KAAKwF,IAAI,CACbjF,MACA,GACA,CAACkF,QAAQ7E,QAAQC;oBACfvD,OAAOY,IAAI,CAAC,CAAC,CAAC,EAAEuH,OAAOzB,QAAQ,CAAC,EAAE,EAAEvB,QAAQO,WAAW,CAAC,CAAC,EAAEP,QAAQlC,IAAI,CAAC,MAAM,CAAC;oBAE/EgD,cAAc3C;oBACd4C,cAAc3C;oBAEdD,OAAO8E,IAAI,CAACtC;oBACZvC,OAAO6E,IAAI,CAACpC;oBAEZG,UAAUO,QAAQ,GAAGyB,OAAOzB,QAAQ;oBACpCP,UAAUM,MAAM,GAAG;oBACnBN,UAAUK,SAAS,GAAGH,QAAQC,MAAM;gBACtC,GACA,CAAC6B;oBACCnI,OAAOY,IAAI,CAAC,CAAC,yBAAyB,EAAEjB,YAAY+C,KAAK2B,KAAK,GAAGC,oBAAoB,GAAG;oBAExF,4CAA4C;oBAC5C,MAAM+D,cAAchC,QAAQgC,WAAW;oBACvCrI,OAAOY,IAAI,CACT,CAAC,gCAAgC,EAAEjB,YAAY0I,YAAYC,GAAG,EAAE,aAAa,EAAE3I,YAC7E0I,YAAYE,SAAS,EACrB,YAAY,EAAE5I,YAAY0I,YAAYG,QAAQ,GAAG;oBAGrDrC,UAAUM,MAAM,GAAG;oBACnBN,UAAUI,QAAQ,GAAGkC,IAAAA,wBAAU,EAACtC,UAAUK,SAAS,EAAEH,QAAQC,MAAM;oBAEnEtG,OAAOY,IAAI,CACT,CAAC,CAAC,EAAEuH,OAAOzB,QAAQ,CAAC,EAAE,EAAEvB,QAAQO,WAAW,CAAC,CAAC,EAAEP,QAAQlC,IAAI,CAAC,MAAM,EAAEyF,IAAAA,4BAAc,EAACC,IAAAA,yBAAW,EAACxC,UAAUI,QAAQ,IAAI;oBAEvHN,YAAY2C,MAAM,CAAC9C;oBACnBI,YAAY0C,MAAM,CAAC5C;gBACrB;gBAGF,MAAMtE,UAAUmH,IAAAA,8BAAc,EAACrI,MAAMwC,QAAQ1C,OAAOqB,YAAY,EAAEC,YAAYQ;gBAC9E,MAAM0G,6BAA6B/D,aAAI,CAACoC,QAAQ,CAAC3G,MAAM8G,oBAAoBF,OAAO,CAAC,OAAO;gBAC1F1F,QAAQwF,IAAI,CAAC4B;gBAEblC,UAAU;oBACRlB,aAAaP,QAAQO,WAAW;oBAChCzC,MAAMkC,QAAQlC,IAAI;oBAClB2C,UAAU;oBACViB;oBACAnF;oBACA4B,QAAQwC,eAAeiD,QAAQ;oBAC/BxF,QAAQyC,eAAe+C,QAAQ;oBAC/BvD;oBACAhB,cAAcmC;gBAChB;YACF,EAAE,OAAOmB,GAAG;gBACV,MAAMpG,UAAUmH,IAAAA,8BAAc,EAACrI,MAAMwC,QAAQ1C,OAAOqB,YAAY,EAAEC,YAAYQ;gBAC9E,MAAM0G,6BAA6B/D,aAAI,CAACoC,QAAQ,CAAC3G,MAAM8G,oBAAoBF,OAAO,CAAC,OAAO;gBAC1F1F,QAAQwF,IAAI,CAAC4B;gBAEb3C,UAAUM,MAAM,GAAG;gBACnBN,UAAUI,QAAQ,GAAGkC,IAAAA,wBAAU,EAACtC,UAAUK,SAAS,EAAEH,QAAQC,MAAM;gBAEnEM,UAAU;oBACRlB,aAAaP,QAAQO,WAAW;oBAChCzC,MAAMkC,QAAQlC,IAAI;oBAClB2C,UAAU;oBACViB;oBACAnF;oBACA4B,QAAQ;oBACRC,QAAQuE,aAAakB,QAAQlB,EAAEiB,QAAQ,KAAK;oBAC5CvD;oBACAhB,cAAcmC;gBAChB;YACF;YAEA3G,OAAOY,IAAI,CACT,GAAGuE,QAAQO,WAAW,CAAC,CAAC,EAAEP,QAAQlC,IAAI,CAAC,YAAY,EAAE0B,KAAKC,SAAS,CACjE;gBACEc,aAAakB,QAAQlB,WAAW;gBAChCzC,MAAM2D,QAAQ3D,IAAI;gBAClB2C,UAAUgB,QAAQhB,QAAQ;gBAC1BiB,QAAQD,QAAQC,MAAM;gBACtBnF,SAASkF,QAAQlF,OAAO;gBACxB8D,IAAIoB,QAAQpB,EAAE;gBACdhB,cAAc,CAAC,CAAC,EAAExB,OAAOhB,eAAe,GAAG,gCAAgC,6BAA6B,GAAG,EACzG4E,QAAQpC,YAAY,CAACyE,MAAM,CAC5B,MAAM,CAAC;YACV,GACA,MACA,GACA,QAAQ,CAAC,EACXrC;YAGF,OAAOA;QACT;IACF;AACF"}
|