@lage-run/cli 0.31.8 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +16 -1
- package/CHANGELOG.md +10 -2
- package/lib/commands/info/action.d.ts +20 -1
- package/lib/commands/info/action.js +14 -6
- package/lib/commands/info/action.js.map +1 -1
- package/lib/commands/run/createTargetGraph.d.ts +1 -0
- package/lib/commands/run/createTargetGraph.js +24 -3
- package/lib/commands/run/createTargetGraph.js.map +1 -1
- package/lib/commands/run/runAction.js +2 -1
- package/lib/commands/run/runAction.js.map +1 -1
- package/lib/commands/run/watchAction.js +2 -1
- package/lib/commands/run/watchAction.js.map +1 -1
- package/lib/commands/server/lageService.js +2 -1
- package/lib/commands/server/lageService.js.map +1 -1
- package/package.json +9 -9
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,22 @@
|
|
|
2
2
|
"name": "@lage-run/cli",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "
|
|
5
|
+
"date": "Mon, 01 Sep 2025 08:10:04 GMT",
|
|
6
|
+
"version": "0.32.0",
|
|
7
|
+
"tag": "@lage-run/cli_v0.32.0",
|
|
8
|
+
"comments": {
|
|
9
|
+
"minor": [
|
|
10
|
+
{
|
|
11
|
+
"author": "dannyvv@microsoft.com",
|
|
12
|
+
"package": "@lage-run/cli",
|
|
13
|
+
"commit": "5f2d28335f9293a5cc44a3bc6a99f41f8f981e7c",
|
|
14
|
+
"comment": "Add merge logic for targetConfig"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"date": "Fri, 08 Aug 2025 08:10:13 GMT",
|
|
6
21
|
"version": "0.31.8",
|
|
7
22
|
"tag": "@lage-run/cli_v0.31.8",
|
|
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 Mon, 01 Sep 2025 08:10:04 GMT and should not be manually modified. -->
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 0.32.0
|
|
8
|
+
|
|
9
|
+
Mon, 01 Sep 2025 08:10:04 GMT
|
|
10
|
+
|
|
11
|
+
### Minor changes
|
|
12
|
+
|
|
13
|
+
- Add merge logic for targetConfig (dannyvv@microsoft.com)
|
|
14
|
+
|
|
7
15
|
## 0.31.8
|
|
8
16
|
|
|
9
|
-
Fri, 08 Aug 2025 08:
|
|
17
|
+
Fri, 08 Aug 2025 08:10:13 GMT
|
|
10
18
|
|
|
11
19
|
### Patches
|
|
12
20
|
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
|
+
import type { ConfigOptions } from "@lage-run/config";
|
|
3
|
+
import { type PackageInfos } from "workspace-tools";
|
|
2
4
|
import type { ReporterInitOptions } from "../../types/ReporterInitOptions.js";
|
|
3
|
-
|
|
5
|
+
import { type Target } from "@lage-run/target-graph";
|
|
6
|
+
export interface InfoActionOptions extends ReporterInitOptions {
|
|
4
7
|
dependencies: boolean;
|
|
5
8
|
dependents: boolean;
|
|
6
9
|
since: string;
|
|
@@ -13,6 +16,18 @@ interface InfoActionOptions extends ReporterInitOptions {
|
|
|
13
16
|
outputFile?: string;
|
|
14
17
|
optimizeGraph: boolean;
|
|
15
18
|
}
|
|
19
|
+
interface PackageTask {
|
|
20
|
+
id: string;
|
|
21
|
+
command: string[];
|
|
22
|
+
dependencies: string[];
|
|
23
|
+
workingDirectory: string;
|
|
24
|
+
package: string;
|
|
25
|
+
task: string;
|
|
26
|
+
inputs?: string[];
|
|
27
|
+
outputs?: string[];
|
|
28
|
+
options?: Record<string, any>;
|
|
29
|
+
weight?: number;
|
|
30
|
+
}
|
|
16
31
|
/**
|
|
17
32
|
* The info command displays information about a target graph in a workspace.
|
|
18
33
|
* The generated output can be read and used by other task runners, such as BuildXL.
|
|
@@ -38,4 +53,8 @@ interface InfoActionOptions extends ReporterInitOptions {
|
|
|
38
53
|
* ],
|
|
39
54
|
* "weight": 3,
|
|
40
55
|
* "inputs": ["src//**/ export declare function infoAction(options: InfoActionOptions, command: Command): Promise<void>;
|
|
56
|
+
export declare function generatePackageTask(target: Target, taskArgs: string[], config: ConfigOptions, options: InfoActionOptions, binPaths: {
|
|
57
|
+
lage: string;
|
|
58
|
+
"lage-server": string;
|
|
59
|
+
}, packageInfos: PackageInfos, tasks: string[]): PackageTask;
|
|
41
60
|
export {};
|
|
@@ -2,9 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get generatePackageTask () {
|
|
13
|
+
return generatePackageTask;
|
|
14
|
+
},
|
|
15
|
+
get infoAction () {
|
|
8
16
|
return infoAction;
|
|
9
17
|
}
|
|
10
18
|
});
|
|
@@ -25,7 +33,6 @@ const _runnerPickerOptions = require("../../runnerPickerOptions.js");
|
|
|
25
33
|
const _parseServerOption = require("../parseServerOption.js");
|
|
26
34
|
const _optimizeTargetGraph = require("../../optimizeTargetGraph.js");
|
|
27
35
|
const _globby = require("@lage-run/globby");
|
|
28
|
-
const _FileHasher = require("@lage-run/hasher/lib/FileHasher.js");
|
|
29
36
|
const _hasher = require("@lage-run/hasher");
|
|
30
37
|
const _targetHashFilePath = require("../targetHashFilePath.js");
|
|
31
38
|
function _interop_require_default(obj) {
|
|
@@ -57,7 +64,8 @@ async function infoAction(options, command) {
|
|
|
57
64
|
outputs: config.cacheOptions.outputGlob,
|
|
58
65
|
tasks,
|
|
59
66
|
packageInfos,
|
|
60
|
-
priorities: config.priorities
|
|
67
|
+
priorities: config.priorities,
|
|
68
|
+
enableTargetConfigMerging: config.enableTargetConfigMerging
|
|
61
69
|
});
|
|
62
70
|
const scope = (0, _getFilteredPackages.getFilteredPackages)({
|
|
63
71
|
root,
|
|
@@ -88,7 +96,7 @@ async function infoAction(options, command) {
|
|
|
88
96
|
// For each target in the target graph, we need to create a global input hash file in this kind of location:
|
|
89
97
|
// ${target.cwd}/.lage/global_inputs_hash
|
|
90
98
|
// We will use glob for these files and use the FileHasher to generate these hashes.
|
|
91
|
-
const fileHasher = new
|
|
99
|
+
const fileHasher = new _hasher.FileHasher({
|
|
92
100
|
root
|
|
93
101
|
});
|
|
94
102
|
const globHashCache = new Map();
|
|
@@ -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, getWorkspaceRoot } from \"workspace-tools\";\nimport { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport createLogger from \"@lage-run/logger\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { parse } from \"shell-quote\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { type Target, getStartTargetId } from \"@lage-run/target-graph\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { TargetRunnerPicker } from \"@lage-run/runners\";\nimport { getBinPaths } from \"../../getBinPaths.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport { optimizeTargetGraph } from \"../../optimizeTargetGraph.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { FileHasher } from \"@lage-run/hasher/lib/FileHasher.js\";\nimport { hashStrings } from \"@lage-run/hasher\";\nimport { getGlobalInputHashFilePath } from \"../targetHashFilePath.js\";\n\ninterface 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\ninterface PackageTask {\n id: string;\n command: string[];\n dependencies: string[];\n workingDirectory: string;\n package: string;\n task: string;\n inputs?: string[];\n outputs?: string[];\n options?: Record<string, any>;\n weight?: number;\n}\n\n/**\n * The info command displays information about a target graph in a workspace.\n * The generated output can be read and used by other task runners, such as BuildXL.\n *\n * Expected format:\n * [\n * {\n * \"id\": \"bar##build\",\n * \"package\": \"bar\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/bar\",\n * \"dependencies\": []\n * },\n * {\n * \"id\": \"foo##build\",\n * \"package\": \"foo\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"bar##build\"\n * ],\n * \"weight\": 3,\n * \"inputs\": [\"src//**/ /*.ts\"],\n * \"inputs\": [\"lib//**/ /*.js\", \"lib//**/ /*.d.ts]\"\n * \"options\": {\n * \"environment\": {\n * \"custom_env_var\": \"x\",\n * }\n * }\n * },\n * {\n * \"id\": \"foo##test\",\n * \"package\": \"foo\",\n * \"task\": \"test\",\n * \"command\": \"npm run test --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"foo##build\"\n * ]\n * },\n * ...\n * ]\n */\nexport async function infoAction(options: InfoActionOptions, command: Command) {\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 initializeReporters(logger, options);\n const root = getWorkspaceRoot(cwd)!;\n\n const packageInfos = getPackageInfos(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n });\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 = runnerPickerOptions(options.nodeArg, config.npmClient, taskArgs);\n\n const runnerPicker = new TargetRunnerPicker(pickerOptions);\n\n // This is a temporary flag to allow backwards compatibility with the old lage graph format used by BuildXL (formerly known as Domino).\n // I initially worked on a commandline flag, but threading that through requires 3 different releases (lage, buildxl, ohome).\n // This is a temp solution to be able to upgrade to Lage V2 without breaking the BuildXL integration. And allow us\n // to update to lage v2.\n // Unfortunately this is the only variable that we can use to not break any other customers\n const createBackwardsCompatGraph = process.env[\"DOMINO\"] === \"1\" || !options.optimizeGraph;\n\n const optimizedTargets = await optimizeTargetGraph(targetGraph, runnerPicker, createBackwardsCompatGraph);\n const binPaths = getBinPaths();\n const packageTasks = optimizedTargets.map((target) =>\n generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos, tasks)\n );\n\n // In worker server mode, we need to actually speed up the BuildXL runs with presupplied global input hashes so that it doesn't try to read it over and over again\n // This is an important optimization for BuildXL for large amount of env glob matches in non-well-behaved monorepos\n // (e.g. repos that have files listed in env glob to avoid circular dependencies in package graph)\n if (shouldRunWorkersAsService(options)) {\n // For each target in the target graph, we need to create a global input hash file in this kind of location:\n // ${target.cwd}/.lage/global_inputs_hash\n // We will use glob for these files and use the FileHasher to generate these hashes.\n const fileHasher = new FileHasher({\n root,\n });\n\n const globHashCache = new Map<string, string>();\n const globHashWithCache = (patterns: string[], options: { cwd: string }) => {\n const key = patterns.join(\"###\");\n if (globHashCache.has(key)) {\n return globHashCache.get(key)!;\n }\n\n const files = glob(patterns, options);\n const hash = hashStrings(Object.values(fileHasher.hash(files.map((file) => path.join(root, file)))));\n\n globHashCache.set(key, hash);\n\n return hash;\n };\n\n const globalInputs = config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root })\n : [\"lage.config.js\"];\n\n for (const target of optimizedTargets) {\n if (target.id === getStartTargetId()) {\n continue;\n }\n\n const targetGlobalInputsHash = target.environmentGlob\n ? globHashWithCache(target.environmentGlob, { cwd: root })\n : globHashWithCache(globalInputs, { cwd: root });\n\n const targetGlobalInputsHashFile = path.join(target.cwd, getGlobalInputHashFilePath(target));\n const targetGlobalInputsHashFileDir = path.dirname(targetGlobalInputsHashFile);\n\n // Make sure the directory exists\n if (!fs.existsSync(targetGlobalInputsHashFileDir)) {\n fs.mkdirSync(targetGlobalInputsHashFileDir, { recursive: true });\n }\n\n // Write the hash to the file\n fs.writeFileSync(targetGlobalInputsHashFile, targetGlobalInputsHash);\n }\n }\n\n const infoResult = {\n command: command.args,\n scope,\n packageTasks,\n };\n\n if (options.outputFile) {\n const parentFolder = path.dirname(options.outputFile);\n if (!fs.existsSync(parentFolder)) {\n await fs.promises.mkdir(parentFolder, { recursive: true });\n }\n const infoJson = JSON.stringify(infoResult, null, options.verbose ? 2 : undefined);\n await fs.promises.writeFile(options.outputFile, infoJson);\n logger.info(`Wrote info to file: ${options.outputFile}`);\n } else {\n logger.info(\"info\", infoResult);\n }\n}\n\nfunction generatePackageTask(\n target: Target,\n taskArgs: string[],\n config: ConfigOptions,\n options: InfoActionOptions,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos,\n tasks: string[]\n): PackageTask {\n const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos, tasks);\n const workingDirectory = getWorkingDirectory(target);\n\n const packageTask: PackageTask = {\n id: target.id,\n command,\n dependencies: target.dependencies,\n workingDirectory,\n package: target.packageName ?? \"\",\n task: target.task,\n inputs: target.inputs,\n outputs: target.outputs,\n };\n\n if (target.weight && target.weight !== 1) {\n packageTask.weight = target.weight;\n }\n\n if (target.options && Object.keys(target.options).length != 0) {\n packageTask.options = target.options;\n }\n\n return packageTask;\n}\n\nfunction shouldRunWorkersAsService(options: InfoActionOptions) {\n return (typeof process.env.LAGE_WORKER_SERVER === \"string\" && process.env.LAGE_WORKER_SERVER !== \"false\") || !!options.server;\n}\n\nfunction generateCommand(\n target: Target,\n taskArgs: string[],\n config: ConfigOptions,\n options: InfoActionOptions,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos,\n tasks: string[]\n) {\n if (target.type === \"npmScript\") {\n const script = target.packageName !== undefined ? packageInfos[target.packageName]?.scripts?.[target.task] : undefined;\n\n // If the script is a node script, and that it does not have any shell operators (&&, ||, etc)\n // then we can simply pass this along to info command rather than using npm client to run it.\n if (script && script.startsWith(\"node\")) {\n const parsed = parse(script);\n if (parsed.length > 0 && parsed.every((entry) => typeof entry === \"string\")) {\n return [...(parsed as string[]), ...taskArgs];\n }\n }\n\n const npmClient = config.npmClient ?? \"npm\";\n const command = [npmClient, ...getNpmArgs(target.task, taskArgs)];\n return command;\n } else if (target.type === \"worker\" && shouldRunWorkersAsService(options)) {\n const { host, port } = parseServerOption(options.server);\n const command = [binPaths[\"lage\"], \"exec\", \"--tasks\", ...tasks, \"--server\", `${host}:${port}`];\n if (options.concurrency) {\n command.push(\"--concurrency\", options.concurrency.toString());\n }\n\n if (target.packageName) {\n command.push(target.packageName);\n }\n\n if (target.task) {\n command.push(target.task);\n }\n\n command.push(...taskArgs);\n return command;\n } else if (target.type === \"worker\") {\n const command = [binPaths.lage, \"exec\"];\n command.push(target.packageName ?? \"\");\n command.push(target.task);\n command.push(...taskArgs);\n return command;\n }\n\n return [];\n}\n\nfunction getWorkingDirectory(target) {\n const cwd = process.cwd();\n const workingDirectory = path.relative(getWorkspaceRoot(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":["infoAction","options","command","cwd","process","config","getConfig","logger","createLogger","logLevel","reporter","server","initializeReporters","root","getWorkspaceRoot","packageInfos","getPackageInfos","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","pickerOptions","runnerPickerOptions","nodeArg","npmClient","runnerPicker","TargetRunnerPicker","createBackwardsCompatGraph","env","optimizeGraph","optimizedTargets","optimizeTargetGraph","binPaths","getBinPaths","packageTasks","map","target","generatePackageTask","shouldRunWorkersAsService","fileHasher","FileHasher","globHashCache","Map","globHashWithCache","patterns","key","join","has","get","files","glob","hash","hashStrings","Object","values","file","path","set","globalInputs","environmentGlob","id","getStartTargetId","targetGlobalInputsHash","targetGlobalInputsHashFile","getGlobalInputHashFilePath","targetGlobalInputsHashFileDir","dirname","fs","existsSync","mkdirSync","recursive","writeFileSync","infoResult","outputFile","parentFolder","promises","mkdir","infoJson","JSON","stringify","verbose","undefined","writeFile","info","generateCommand","workingDirectory","getWorkingDirectory","packageTask","package","packageName","task","inputs","weight","keys","length","LAGE_WORKER_SERVER","type","script","scripts","startsWith","parsed","parse","every","entry","getNpmArgs","host","port","parseServerOption","concurrency","push","toString","lage","relative","replace","taskTargs","extraArgs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/info/action.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport type { ConfigOptions } from \"@lage-run/config\";\nimport { getConfig } from \"@lage-run/config\";\nimport { type PackageInfos, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport createLogger from \"@lage-run/logger\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { parse } from \"shell-quote\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { type Target, getStartTargetId } from \"@lage-run/target-graph\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { TargetRunnerPicker } from \"@lage-run/runners\";\nimport { getBinPaths } from \"../../getBinPaths.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport { optimizeTargetGraph } from \"../../optimizeTargetGraph.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { FileHasher, hashStrings } from \"@lage-run/hasher\";\nimport { getGlobalInputHashFilePath } from \"../targetHashFilePath.js\";\n\nexport interface InfoActionOptions extends ReporterInitOptions {\n dependencies: boolean;\n dependents: boolean;\n since: string;\n scope: string[];\n to: string[];\n cache: boolean;\n nodeArg: string;\n ignore: string[];\n server: string;\n outputFile?: string;\n optimizeGraph: boolean;\n}\n\ninterface PackageTask {\n id: string;\n command: string[];\n dependencies: string[];\n workingDirectory: string;\n package: string;\n task: string;\n inputs?: string[];\n outputs?: string[];\n options?: Record<string, any>;\n weight?: number;\n}\n\n/**\n * The info command displays information about a target graph in a workspace.\n * The generated output can be read and used by other task runners, such as BuildXL.\n *\n * Expected format:\n * [\n * {\n * \"id\": \"bar##build\",\n * \"package\": \"bar\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/bar\",\n * \"dependencies\": []\n * },\n * {\n * \"id\": \"foo##build\",\n * \"package\": \"foo\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"bar##build\"\n * ],\n * \"weight\": 3,\n * \"inputs\": [\"src//**/ /*.ts\"],\n * \"inputs\": [\"lib//**/ /*.js\", \"lib//**/ /*.d.ts]\"\n * \"options\": {\n * \"environment\": {\n * \"custom_env_var\": \"x\",\n * }\n * }\n * },\n * {\n * \"id\": \"foo##test\",\n * \"package\": \"foo\",\n * \"task\": \"test\",\n * \"command\": \"npm run test --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"foo##build\"\n * ]\n * },\n * ...\n * ]\n */\nexport async function infoAction(options: InfoActionOptions, command: Command) {\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 initializeReporters(logger, options);\n const root = getWorkspaceRoot(cwd)!;\n\n const packageInfos = getPackageInfos(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n enableTargetConfigMerging: config.enableTargetConfigMerging,\n });\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 = runnerPickerOptions(options.nodeArg, config.npmClient, taskArgs);\n\n const runnerPicker = new TargetRunnerPicker(pickerOptions);\n\n // This is a temporary flag to allow backwards compatibility with the old lage graph format used by BuildXL (formerly known as Domino).\n // I initially worked on a commandline flag, but threading that through requires 3 different releases (lage, buildxl, ohome).\n // This is a temp solution to be able to upgrade to Lage V2 without breaking the BuildXL integration. And allow us\n // to update to lage v2.\n // Unfortunately this is the only variable that we can use to not break any other customers\n const createBackwardsCompatGraph = process.env[\"DOMINO\"] === \"1\" || !options.optimizeGraph;\n\n const optimizedTargets = await optimizeTargetGraph(targetGraph, runnerPicker, createBackwardsCompatGraph);\n const binPaths = getBinPaths();\n const packageTasks = optimizedTargets.map((target) =>\n generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos, tasks)\n );\n\n // In worker server mode, we need to actually speed up the BuildXL runs with presupplied global input hashes so that it doesn't try to read it over and over again\n // This is an important optimization for BuildXL for large amount of env glob matches in non-well-behaved monorepos\n // (e.g. repos that have files listed in env glob to avoid circular dependencies in package graph)\n if (shouldRunWorkersAsService(options)) {\n // For each target in the target graph, we need to create a global input hash file in this kind of location:\n // ${target.cwd}/.lage/global_inputs_hash\n // We will use glob for these files and use the FileHasher to generate these hashes.\n const fileHasher = new FileHasher({\n root,\n });\n\n const globHashCache = new Map<string, string>();\n const globHashWithCache = (patterns: string[], options: { cwd: string }) => {\n const key = patterns.join(\"###\");\n if (globHashCache.has(key)) {\n return globHashCache.get(key)!;\n }\n\n const files = glob(patterns, options);\n const hash = hashStrings(Object.values(fileHasher.hash(files.map((file) => path.join(root, file)))));\n\n globHashCache.set(key, hash);\n\n return hash;\n };\n\n const globalInputs = config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root })\n : [\"lage.config.js\"];\n\n for (const target of optimizedTargets) {\n if (target.id === getStartTargetId()) {\n continue;\n }\n\n const targetGlobalInputsHash = target.environmentGlob\n ? globHashWithCache(target.environmentGlob, { cwd: root })\n : globHashWithCache(globalInputs, { cwd: root });\n\n const targetGlobalInputsHashFile = path.join(target.cwd, getGlobalInputHashFilePath(target));\n const targetGlobalInputsHashFileDir = path.dirname(targetGlobalInputsHashFile);\n\n // Make sure the directory exists\n if (!fs.existsSync(targetGlobalInputsHashFileDir)) {\n fs.mkdirSync(targetGlobalInputsHashFileDir, { recursive: true });\n }\n\n // Write the hash to the file\n fs.writeFileSync(targetGlobalInputsHashFile, targetGlobalInputsHash);\n }\n }\n\n const infoResult = {\n command: command.args,\n scope,\n packageTasks,\n };\n\n if (options.outputFile) {\n const parentFolder = path.dirname(options.outputFile);\n if (!fs.existsSync(parentFolder)) {\n await fs.promises.mkdir(parentFolder, { recursive: true });\n }\n const infoJson = JSON.stringify(infoResult, null, options.verbose ? 2 : undefined);\n await fs.promises.writeFile(options.outputFile, infoJson);\n logger.info(`Wrote info to file: ${options.outputFile}`);\n } else {\n logger.info(\"info\", infoResult);\n }\n}\n\nexport function generatePackageTask(\n target: Target,\n taskArgs: string[],\n config: ConfigOptions,\n options: InfoActionOptions,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos,\n tasks: string[]\n): PackageTask {\n const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos, tasks);\n const workingDirectory = getWorkingDirectory(target);\n\n const packageTask: PackageTask = {\n id: target.id,\n command,\n dependencies: target.dependencies,\n workingDirectory,\n package: target.packageName ?? \"\",\n task: target.task,\n inputs: target.inputs,\n outputs: target.outputs,\n };\n\n if (target.weight && target.weight !== 1) {\n packageTask.weight = target.weight;\n }\n\n if (target.options && Object.keys(target.options).length != 0) {\n packageTask.options = target.options;\n }\n\n return packageTask;\n}\n\nfunction shouldRunWorkersAsService(options: InfoActionOptions) {\n return (typeof process.env.LAGE_WORKER_SERVER === \"string\" && process.env.LAGE_WORKER_SERVER !== \"false\") || !!options.server;\n}\n\nfunction generateCommand(\n target: Target,\n taskArgs: string[],\n config: ConfigOptions,\n options: InfoActionOptions,\n binPaths: { lage: string; \"lage-server\": string },\n packageInfos: PackageInfos,\n tasks: string[]\n) {\n if (target.type === \"npmScript\") {\n const script = target.packageName !== undefined ? packageInfos[target.packageName]?.scripts?.[target.task] : undefined;\n\n // If the script is a node script, and that it does not have any shell operators (&&, ||, etc)\n // then we can simply pass this along to info command rather than using npm client to run it.\n if (script && script.startsWith(\"node\")) {\n const parsed = parse(script);\n if (parsed.length > 0 && parsed.every((entry) => typeof entry === \"string\")) {\n return [...(parsed as string[]), ...taskArgs];\n }\n }\n\n const npmClient = config.npmClient ?? \"npm\";\n const command = [npmClient, ...getNpmArgs(target.task, taskArgs)];\n return command;\n } else if (target.type === \"worker\" && shouldRunWorkersAsService(options)) {\n const { host, port } = parseServerOption(options.server);\n const command = [binPaths[\"lage\"], \"exec\", \"--tasks\", ...tasks, \"--server\", `${host}:${port}`];\n if (options.concurrency) {\n command.push(\"--concurrency\", options.concurrency.toString());\n }\n\n if (target.packageName) {\n command.push(target.packageName);\n }\n\n if (target.task) {\n command.push(target.task);\n }\n\n command.push(...taskArgs);\n return command;\n } else if (target.type === \"worker\") {\n const command = [binPaths.lage, \"exec\"];\n command.push(target.packageName ?? \"\");\n command.push(target.task);\n command.push(...taskArgs);\n return command;\n }\n\n return [];\n}\n\nfunction getWorkingDirectory(target) {\n const cwd = process.cwd();\n const workingDirectory = path.relative(getWorkspaceRoot(cwd) ?? \"\", target.cwd).replace(/\\\\/g, \"/\");\n return workingDirectory;\n}\n\nfunction getNpmArgs(task: string, taskTargs: string[]) {\n const extraArgs = taskTargs != undefined && taskTargs.length > 0 ? [\"--\", ...taskTargs] : [];\n return [\"run\", task, ...extraArgs];\n}\n"],"names":["generatePackageTask","infoAction","options","command","cwd","process","config","getConfig","logger","createLogger","logLevel","reporter","server","initializeReporters","root","getWorkspaceRoot","packageInfos","getPackageInfos","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","pickerOptions","runnerPickerOptions","nodeArg","npmClient","runnerPicker","TargetRunnerPicker","createBackwardsCompatGraph","env","optimizeGraph","optimizedTargets","optimizeTargetGraph","binPaths","getBinPaths","packageTasks","map","target","shouldRunWorkersAsService","fileHasher","FileHasher","globHashCache","Map","globHashWithCache","patterns","key","join","has","get","files","glob","hash","hashStrings","Object","values","file","path","set","globalInputs","environmentGlob","id","getStartTargetId","targetGlobalInputsHash","targetGlobalInputsHashFile","getGlobalInputHashFilePath","targetGlobalInputsHashFileDir","dirname","fs","existsSync","mkdirSync","recursive","writeFileSync","infoResult","outputFile","parentFolder","promises","mkdir","infoJson","JSON","stringify","verbose","undefined","writeFile","info","generateCommand","workingDirectory","getWorkingDirectory","packageTask","package","packageName","task","inputs","weight","keys","length","LAGE_WORKER_SERVER","type","script","scripts","startsWith","parsed","parse","every","entry","getNpmArgs","host","port","parseServerOption","concurrency","push","toString","lage","relative","replace","taskTargs","extraArgs"],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ interface CreateTargetGraphOptions {
|
|
|
15
15
|
tasks: string[];
|
|
16
16
|
packageInfos: PackageInfos;
|
|
17
17
|
priorities: Priority[];
|
|
18
|
+
enableTargetConfigMerging: boolean;
|
|
18
19
|
}
|
|
19
20
|
export declare function createTargetGraph(options: CreateTargetGraphOptions): Promise<{
|
|
20
21
|
targets: Map<string, import("@lage-run/target-graph").Target>;
|
|
@@ -27,8 +27,8 @@ function getChangedFiles(since, cwd) {
|
|
|
27
27
|
return changes;
|
|
28
28
|
}
|
|
29
29
|
async function createTargetGraph(options) {
|
|
30
|
-
const { logger, root, dependencies, dependents, since, scope, repoWideChanges, ignore, pipeline, outputs, tasks, packageInfos, priorities } = options;
|
|
31
|
-
const builder = new _targetgraph.WorkspaceTargetGraphBuilder(root, packageInfos);
|
|
30
|
+
const { logger, root, dependencies, dependents, enableTargetConfigMerging, since, scope, repoWideChanges, ignore, pipeline, outputs, tasks, packageInfos, priorities } = options;
|
|
31
|
+
const builder = new _targetgraph.WorkspaceTargetGraphBuilder(root, packageInfos, enableTargetConfigMerging);
|
|
32
32
|
const packages = (0, _getFilteredPackages.getFilteredPackages)({
|
|
33
33
|
root,
|
|
34
34
|
logger,
|
|
@@ -48,7 +48,28 @@ async function createTargetGraph(options) {
|
|
|
48
48
|
changedFiles = getChangedFiles(since, root);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
const pipelineEntries = Object.entries(pipeline);
|
|
52
|
+
// Add lage pipeline configuration in the package.json files.
|
|
53
|
+
// They are configured in the lage field, but without the package id.
|
|
54
|
+
// i.e. having this package.json
|
|
55
|
+
// { "name": "@lage-run/globby", "lage": { "transpile": { type: "npmScript" } }}
|
|
56
|
+
// is equivalent to having the following in lage.config.js
|
|
57
|
+
// { pipeline: { "@lage-run/globby#transpile": { type: "npmScript" } }
|
|
58
|
+
// We conciously add these 'after' the ones in lage.config.js
|
|
59
|
+
// to indicate that the more specific package.json definition takes
|
|
60
|
+
// precedence over the global lage.config.js.
|
|
61
|
+
for (const [packageId, packageInfo] of Object.entries(packageInfos)){
|
|
62
|
+
const packageLageDefinition = packageInfo.lage;
|
|
63
|
+
if (packageLageDefinition) {
|
|
64
|
+
for (const [id, definition] of Object.entries(packageLageDefinition)){
|
|
65
|
+
pipelineEntries.push([
|
|
66
|
+
packageId + "#" + id,
|
|
67
|
+
definition
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
for (const [id, definition] of pipelineEntries){
|
|
52
73
|
if (Array.isArray(definition)) {
|
|
53
74
|
builder.addTargetConfig(id, {
|
|
54
75
|
cache: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/run/createTargetGraph.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport { WorkspaceTargetGraphBuilder } from \"@lage-run/target-graph\";\nimport type { PackageInfos } from \"workspace-tools\";\nimport { getBranchChanges, getDefaultRemoteBranch, getStagedChanges, getUnstagedChanges, getUntrackedChanges } from \"workspace-tools\";\nimport { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport type { PipelineDefinition, Priority } from \"@lage-run/config\";\nimport { hasRepoChanged } from \"../../filter/hasRepoChanged.js\";\n\ninterface CreateTargetGraphOptions {\n logger: Logger;\n root: string;\n dependencies: boolean;\n dependents: boolean;\n since?: string;\n scope?: string[];\n ignore: string[];\n repoWideChanges: string[];\n pipeline: PipelineDefinition;\n outputs: string[];\n tasks: string[];\n packageInfos: PackageInfos;\n priorities: Priority[];\n}\n\nfunction getChangedFiles(since: string, cwd: string) {\n const targetBranch = since || getDefaultRemoteBranch({ cwd });\n\n const changes = [\n ...new Set([\n ...(getUntrackedChanges(cwd) || []),\n ...(getUnstagedChanges(cwd) || []),\n ...(getBranchChanges(targetBranch, cwd) || []),\n ...(getStagedChanges(cwd) || []),\n ]),\n ];\n\n return changes;\n}\n\nexport async function createTargetGraph(options: CreateTargetGraphOptions) {\n const {\n logger,\n root,\n dependencies,\n dependents,\n since,\n scope,\n repoWideChanges,\n ignore,\n pipeline,\n outputs,\n tasks,\n packageInfos,\n priorities,\n } = options;\n\n const builder = new WorkspaceTargetGraphBuilder(root, packageInfos);\n\n const packages = getFilteredPackages({\n root,\n logger,\n packageInfos,\n includeDependencies: dependencies,\n includeDependents: dependents,\n since,\n scope,\n repoWideChanges,\n sinceIgnoreGlobs: ignore,\n });\n\n let changedFiles: string[] = [];\n\n // TODO: enhancement would be for workspace-tools to implement a \"getChangedPackageFromChangedFiles()\" type function\n // TODO: optimize this so that we don't double up the work to determine if repo has changed\n if (since) {\n if (!hasRepoChanged(since, root, repoWideChanges, logger)) {\n changedFiles = getChangedFiles(since, root);\n }\n }\n\n for (const [id, definition] of Object.entries(
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/run/createTargetGraph.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport { WorkspaceTargetGraphBuilder } from \"@lage-run/target-graph\";\nimport type { PackageInfos } from \"workspace-tools\";\nimport { getBranchChanges, getDefaultRemoteBranch, getStagedChanges, getUnstagedChanges, getUntrackedChanges } from \"workspace-tools\";\nimport { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport type { PipelineDefinition, Priority } from \"@lage-run/config\";\nimport { hasRepoChanged } from \"../../filter/hasRepoChanged.js\";\n\ninterface CreateTargetGraphOptions {\n logger: Logger;\n root: string;\n dependencies: boolean;\n dependents: boolean;\n since?: string;\n scope?: string[];\n ignore: string[];\n repoWideChanges: string[];\n pipeline: PipelineDefinition;\n outputs: string[];\n tasks: string[];\n packageInfos: PackageInfos;\n priorities: Priority[];\n enableTargetConfigMerging: boolean;\n}\n\nfunction getChangedFiles(since: string, cwd: string) {\n const targetBranch = since || getDefaultRemoteBranch({ cwd });\n\n const changes = [\n ...new Set([\n ...(getUntrackedChanges(cwd) || []),\n ...(getUnstagedChanges(cwd) || []),\n ...(getBranchChanges(targetBranch, cwd) || []),\n ...(getStagedChanges(cwd) || []),\n ]),\n ];\n\n return changes;\n}\n\nexport async function createTargetGraph(options: CreateTargetGraphOptions) {\n const {\n logger,\n root,\n dependencies,\n dependents,\n enableTargetConfigMerging,\n since,\n scope,\n repoWideChanges,\n ignore,\n pipeline,\n outputs,\n tasks,\n packageInfos,\n priorities,\n } = options;\n\n const builder = new WorkspaceTargetGraphBuilder(root, packageInfos, enableTargetConfigMerging);\n\n const packages = getFilteredPackages({\n root,\n logger,\n packageInfos,\n includeDependencies: dependencies,\n includeDependents: dependents,\n since,\n scope,\n repoWideChanges,\n sinceIgnoreGlobs: ignore,\n });\n\n let changedFiles: string[] = [];\n\n // TODO: enhancement would be for workspace-tools to implement a \"getChangedPackageFromChangedFiles()\" type function\n // TODO: optimize this so that we don't double up the work to determine if repo has changed\n if (since) {\n if (!hasRepoChanged(since, root, repoWideChanges, logger)) {\n changedFiles = getChangedFiles(since, root);\n }\n }\n\n const pipelineEntries = Object.entries(pipeline);\n\n // Add lage pipeline configuration in the package.json files.\n // They are configured in the lage field, but without the package id.\n // i.e. having this package.json\n // { \"name\": \"@lage-run/globby\", \"lage\": { \"transpile\": { type: \"npmScript\" } }}\n // is equivalent to having the following in lage.config.js\n // { pipeline: { \"@lage-run/globby#transpile\": { type: \"npmScript\" } }\n // We conciously add these 'after' the ones in lage.config.js\n // to indicate that the more specific package.json definition takes\n // precedence over the global lage.config.js.\n for (const [packageId, packageInfo] of Object.entries(packageInfos)) {\n const packageLageDefinition = packageInfo.lage as PipelineDefinition;\n if (packageLageDefinition) {\n for (const [id, definition] of Object.entries(packageLageDefinition)) {\n pipelineEntries.push([packageId + \"#\" + id, definition]);\n }\n }\n }\n\n for (const [id, definition] of pipelineEntries) {\n if (Array.isArray(definition)) {\n builder.addTargetConfig(\n id,\n {\n cache: true,\n dependsOn: definition,\n options: {},\n outputs,\n },\n changedFiles\n );\n } else {\n builder.addTargetConfig(id, definition, changedFiles);\n }\n }\n\n return await builder.build(tasks, packages, priorities);\n}\n"],"names":["createTargetGraph","getChangedFiles","since","cwd","targetBranch","getDefaultRemoteBranch","changes","Set","getUntrackedChanges","getUnstagedChanges","getBranchChanges","getStagedChanges","options","logger","root","dependencies","dependents","enableTargetConfigMerging","scope","repoWideChanges","ignore","pipeline","outputs","tasks","packageInfos","priorities","builder","WorkspaceTargetGraphBuilder","packages","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","changedFiles","hasRepoChanged","pipelineEntries","Object","entries","packageId","packageInfo","packageLageDefinition","lage","id","definition","push","Array","isArray","addTargetConfig","cache","dependsOn","build"],"mappings":";;;;+BAwCsBA;;;eAAAA;;;6BAvCsB;gCAEwE;qCAChF;gCAEL;AAmB/B,SAASC,gBAAgBC,KAAa,EAAEC,GAAW;IACjD,MAAMC,eAAeF,SAASG,IAAAA,sCAAsB,EAAC;QAAEF;IAAI;IAE3D,MAAMG,UAAU;WACX,IAAIC,IAAI;eACLC,IAAAA,mCAAmB,EAACL,QAAQ,EAAE;eAC9BM,IAAAA,kCAAkB,EAACN,QAAQ,EAAE;eAC7BO,IAAAA,gCAAgB,EAACN,cAAcD,QAAQ,EAAE;eACzCQ,IAAAA,gCAAgB,EAACR,QAAQ,EAAE;SAChC;KACF;IAED,OAAOG;AACT;AAEO,eAAeN,kBAAkBY,OAAiC;IACvE,MAAM,EACJC,MAAM,EACNC,IAAI,EACJC,YAAY,EACZC,UAAU,EACVC,yBAAyB,EACzBf,KAAK,EACLgB,KAAK,EACLC,eAAe,EACfC,MAAM,EACNC,QAAQ,EACRC,OAAO,EACPC,KAAK,EACLC,YAAY,EACZC,UAAU,EACX,GAAGb;IAEJ,MAAMc,UAAU,IAAIC,wCAA2B,CAACb,MAAMU,cAAcP;IAEpE,MAAMW,WAAWC,IAAAA,wCAAmB,EAAC;QACnCf;QACAD;QACAW;QACAM,qBAAqBf;QACrBgB,mBAAmBf;QACnBd;QACAgB;QACAC;QACAa,kBAAkBZ;IACpB;IAEA,IAAIa,eAAyB,EAAE;IAE/B,oHAAoH;IACpH,2FAA2F;IAC3F,IAAI/B,OAAO;QACT,IAAI,CAACgC,IAAAA,8BAAc,EAAChC,OAAOY,MAAMK,iBAAiBN,SAAS;YACzDoB,eAAehC,gBAAgBC,OAAOY;QACxC;IACF;IAEA,MAAMqB,kBAAkBC,OAAOC,OAAO,CAAChB;IAEvC,6DAA6D;IAC7D,qEAAqE;IACrE,gCAAgC;IAChC,mFAAmF;IACnF,0DAA0D;IAC1D,sEAAsE;IACtE,6DAA6D;IAC7D,mEAAmE;IACnE,8CAA8C;IAC9C,KAAK,MAAM,CAACiB,WAAWC,YAAY,IAAIH,OAAOC,OAAO,CAACb,cAAe;QACnE,MAAMgB,wBAAwBD,YAAYE,IAAI;QAC9C,IAAID,uBAAuB;YACzB,KAAK,MAAM,CAACE,IAAIC,WAAW,IAAIP,OAAOC,OAAO,CAACG,uBAAwB;gBACpEL,gBAAgBS,IAAI,CAAC;oBAACN,YAAY,MAAMI;oBAAIC;iBAAW;YACzD;QACF;IACF;IAEA,KAAK,MAAM,CAACD,IAAIC,WAAW,IAAIR,gBAAiB;QAC9C,IAAIU,MAAMC,OAAO,CAACH,aAAa;YAC7BjB,QAAQqB,eAAe,CACrBL,IACA;gBACEM,OAAO;gBACPC,WAAWN;gBACX/B,SAAS,CAAC;gBACVU;YACF,GACAW;QAEJ,OAAO;YACLP,QAAQqB,eAAe,CAACL,IAAIC,YAAYV;QAC1C;IACF;IAEA,OAAO,MAAMP,QAAQwB,KAAK,CAAC3B,OAAOK,UAAUH;AAC9C"}
|
|
@@ -54,7 +54,8 @@ async function runAction(options, command) {
|
|
|
54
54
|
outputs: config.cacheOptions.outputGlob,
|
|
55
55
|
tasks,
|
|
56
56
|
packageInfos,
|
|
57
|
-
priorities: config.priorities
|
|
57
|
+
priorities: config.priorities,
|
|
58
|
+
enableTargetConfigMerging: config.enableTargetConfigMerging
|
|
58
59
|
});
|
|
59
60
|
validateTargetGraph(targetGraph, allowNoTargetRuns);
|
|
60
61
|
logger.verbose(`Running with ${concurrency} workers`);
|
|
@@ -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, getWorkspaceRoot } from \"workspace-tools\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { SimpleScheduler } from \"@lage-run/scheduler\";\n\nimport type { Reporter } from \"@lage-run/logger\";\nimport createLogger from \"@lage-run/logger\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { FilterOptions } from \"../../types/FilterOptions.js\";\nimport type { SchedulerRunSummary } from \"@lage-run/scheduler-types\";\nimport type { TargetGraph } from \"@lage-run/target-graph\";\nimport { NoTargetFoundError } from \"../../types/errors.js\";\nimport { createCache } from \"../../cache/createCacheProvider.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.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) {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n\n // Merged options\n const concurrency = getConcurrency(options.concurrency, config.concurrency);\n const allowNoTargetRuns = options.allowNoTargetRuns || config.allowNoTargetRuns;\n\n // Configure logger\n const logger = createLogger();\n\n const reporters = initializeReporters(logger, { ...options, concurrency });\n\n // Build Target Graph\n const root = getWorkspaceRoot(process.cwd())!;\n const packageInfos = getPackageInfos(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n });\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 ...runnerPickerOptions(options.nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n },\n },\n maxWorkersPerTask: new Map([...getMaxWorkersPerTask(filteredPipeline, concurrency), ...maxWorkersPerTaskMap]),\n hasher,\n workerIdleMemoryLimit: config.workerIdleMemoryLimit, // in bytes\n });\n\n const optimizedTargets = await optimizeTargetGraph(targetGraph, scheduler.runnerPicker, false);\n const optimizedGraph: TargetGraph = {\n targets: new Map(optimizedTargets.map((target) => [target.id, target])),\n };\n\n const summary = await scheduler.run(root, optimizedGraph);\n await scheduler.cleanup();\n\n displaySummaryAndExit(summary, logger.reporters);\n\n for (const reporter of reporters) {\n await reporter.cleanup?.();\n }\n}\n\nfunction displaySummaryAndExit(summary: SchedulerRunSummary, reporters: Reporter[]) {\n if (summary.results !== \"success\") {\n process.exitCode = 1;\n }\n\n for (const reporter of reporters) {\n reporter.summarize(summary);\n }\n}\n\nfunction validateTargetGraph(targetGraph: TargetGraph, allowNoTargetRuns: boolean) {\n const visibleTargets = Array.from(targetGraph.targets.values()).filter((target) => !target.hidden);\n if (visibleTargets.length === 0 && !allowNoTargetRuns) {\n throw NoTargetFoundError;\n }\n}\n"],"names":["runAction","options","command","cwd","process","config","getConfig","concurrency","getConcurrency","allowNoTargetRuns","logger","createLogger","reporters","initializeReporters","root","getWorkspaceRoot","packageInfos","getPackageInfos","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","validateTargetGraph","verbose","filteredPipeline","filterPipelineDefinitions","targets","values","maxWorkersPerTaskMap","getMaxWorkersPerTaskFromOptions","maxWorkersPerTask","hasher","createCache","cliArgs","skipLocalCache","scheduler","SimpleScheduler","continueOnError","continue","shouldCache","cache","shouldResetCache","resetCache","workerData","runners","runnerPickerOptions","nodeArg","npmClient","Map","getMaxWorkersPerTask","workerIdleMemoryLimit","optimizedTargets","optimizeTargetGraph","runnerPicker","optimizedGraph","map","target","id","summary","run","cleanup","displaySummaryAndExit","reporter","results","exitCode","summarize","visibleTargets","Array","from","filter","hidden","length","NoTargetFoundError"],"mappings":";;;;+BAiCsBA;;;eAAAA;;;mCAhCY;oCACC;2CACO;wBACuD;gCAC/C;qCACd;2BACJ;+DAGP;wBAMU;qCACP;qCACQ;qCACA;;;;;;AAc7B,eAAeA,UAAUC,OAAmB,EAAEC,OAAgB;IACnE,MAAMC,MAAMC,QAAQD,GAAG;IACvB,MAAME,SAAS,MAAMC,IAAAA,iBAAS,EAACH;IAE/B,iBAAiB;IACjB,MAAMI,cAAcC,IAAAA,sBAAc,EAACP,QAAQM,WAAW,EAAEF,OAAOE,WAAW;IAC1E,MAAME,oBAAoBR,QAAQQ,iBAAiB,IAAIJ,OAAOI,iBAAiB;IAE/E,mBAAmB;IACnB,MAAMC,SAASC,IAAAA,eAAY;IAE3B,MAAMC,YAAYC,IAAAA,wCAAmB,EAACH,QAAQ;QAAE,GAAGT,OAAO;QAAEM;IAAY;IAExE,qBAAqB;IACrB,MAAMO,OAAOC,IAAAA,gCAAgB,EAACX,QAAQD,GAAG;IACzC,MAAMa,eAAeC,IAAAA,+BAAe,EAACH;IAErC,MAAM,EAAEI,KAAK,EAAEC,QAAQ,EAAE,GAAGC,IAAAA,sCAAkB,EAAClB,QAAQmB,IAAI;IAE3D,MAAMC,cAAc,MAAMC,IAAAA,oCAAiB,EAAC;QAC1Cb;QACAI;QACAU,cAAcvB,QAAQuB,YAAY;QAClCC,YAAYxB,QAAQwB,UAAU,IAAI,CAACxB,QAAQyB,EAAE;QAC7CC,QAAQ1B,QAAQ0B,MAAM,CAACC,MAAM,CAACvB,OAAOsB,MAAM;QAC3CE,UAAUxB,OAAOwB,QAAQ;QACzBC,iBAAiBzB,OAAOyB,eAAe;QACvCC,OAAO,AAAC9B,CAAAA,QAAQ8B,KAAK,IAAI,EAAE,AAAD,EAAGH,MAAM,CAAC3B,QAAQyB,EAAE,IAAI,EAAE;QACpDM,OAAO/B,QAAQ+B,KAAK;QACpBC,SAAS5B,OAAO6B,YAAY,CAACC,UAAU;QACvCjB;QACAF;QACAoB,YAAY/B,OAAO+B,UAAU;
|
|
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, getWorkspaceRoot } from \"workspace-tools\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { SimpleScheduler } from \"@lage-run/scheduler\";\n\nimport type { Reporter } from \"@lage-run/logger\";\nimport createLogger from \"@lage-run/logger\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { FilterOptions } from \"../../types/FilterOptions.js\";\nimport type { SchedulerRunSummary } from \"@lage-run/scheduler-types\";\nimport type { TargetGraph } from \"@lage-run/target-graph\";\nimport { NoTargetFoundError } from \"../../types/errors.js\";\nimport { createCache } from \"../../cache/createCacheProvider.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.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) {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n\n // Merged options\n const concurrency = getConcurrency(options.concurrency, config.concurrency);\n const allowNoTargetRuns = options.allowNoTargetRuns || config.allowNoTargetRuns;\n\n // Configure logger\n const logger = createLogger();\n\n const reporters = initializeReporters(logger, { ...options, concurrency });\n\n // Build Target Graph\n const root = getWorkspaceRoot(process.cwd())!;\n const packageInfos = getPackageInfos(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n enableTargetConfigMerging: config.enableTargetConfigMerging,\n });\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 ...runnerPickerOptions(options.nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n },\n },\n maxWorkersPerTask: new Map([...getMaxWorkersPerTask(filteredPipeline, concurrency), ...maxWorkersPerTaskMap]),\n hasher,\n workerIdleMemoryLimit: config.workerIdleMemoryLimit, // in bytes\n });\n\n const optimizedTargets = await optimizeTargetGraph(targetGraph, scheduler.runnerPicker, false);\n const optimizedGraph: TargetGraph = {\n targets: new Map(optimizedTargets.map((target) => [target.id, target])),\n };\n\n const summary = await scheduler.run(root, optimizedGraph);\n await scheduler.cleanup();\n\n displaySummaryAndExit(summary, logger.reporters);\n\n for (const reporter of reporters) {\n await reporter.cleanup?.();\n }\n}\n\nfunction displaySummaryAndExit(summary: SchedulerRunSummary, reporters: Reporter[]) {\n if (summary.results !== \"success\") {\n process.exitCode = 1;\n }\n\n for (const reporter of reporters) {\n reporter.summarize(summary);\n }\n}\n\nfunction validateTargetGraph(targetGraph: TargetGraph, allowNoTargetRuns: boolean) {\n const visibleTargets = Array.from(targetGraph.targets.values()).filter((target) => !target.hidden);\n if (visibleTargets.length === 0 && !allowNoTargetRuns) {\n throw NoTargetFoundError;\n }\n}\n"],"names":["runAction","options","command","cwd","process","config","getConfig","concurrency","getConcurrency","allowNoTargetRuns","logger","createLogger","reporters","initializeReporters","root","getWorkspaceRoot","packageInfos","getPackageInfos","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","validateTargetGraph","verbose","filteredPipeline","filterPipelineDefinitions","targets","values","maxWorkersPerTaskMap","getMaxWorkersPerTaskFromOptions","maxWorkersPerTask","hasher","createCache","cliArgs","skipLocalCache","scheduler","SimpleScheduler","continueOnError","continue","shouldCache","cache","shouldResetCache","resetCache","workerData","runners","runnerPickerOptions","nodeArg","npmClient","Map","getMaxWorkersPerTask","workerIdleMemoryLimit","optimizedTargets","optimizeTargetGraph","runnerPicker","optimizedGraph","map","target","id","summary","run","cleanup","displaySummaryAndExit","reporter","results","exitCode","summarize","visibleTargets","Array","from","filter","hidden","length","NoTargetFoundError"],"mappings":"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"}
|
|
@@ -87,7 +87,8 @@ async function watchAction(options, command) {
|
|
|
87
87
|
outputs: config.cacheOptions.outputGlob,
|
|
88
88
|
tasks,
|
|
89
89
|
packageInfos,
|
|
90
|
-
priorities: config.priorities
|
|
90
|
+
priorities: config.priorities,
|
|
91
|
+
enableTargetConfigMerging: config.enableTargetConfigMerging
|
|
91
92
|
});
|
|
92
93
|
// Make sure we do not attempt writeRemoteCache in watch mode
|
|
93
94
|
config.cacheOptions.writeRemoteCache = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/run/watchAction.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"./createTargetGraph.js\";\nimport { filterArgsForTasks } from \"./filterArgsForTasks.js\";\nimport { getConfig, getMaxWorkersPerTask, getMaxWorkersPerTaskFromOptions, getConcurrency } from \"@lage-run/config\";\nimport { getPackageInfosAsync, getWorkspaceRoot } from \"workspace-tools\";\nimport { filterPipelineDefinitions } from \"./filterPipelineDefinitions.js\";\nimport { LogReporter } from \"@lage-run/reporters\";\nimport { SimpleScheduler } from \"@lage-run/scheduler\";\nimport { watch } from \"./watcher.js\";\n\nimport type { Reporter } from \"@lage-run/logger\";\nimport createLogger, { LogLevel } from \"@lage-run/logger\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { SchedulerRunSummary } from \"@lage-run/scheduler-types\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport type { FilterOptions } from \"../../types/FilterOptions.js\";\nimport { createCache } from \"../../cache/createCacheProvider.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\n\ninterface RunOptions extends ReporterInitOptions, FilterOptions {\n concurrency: number;\n maxWorkersPerTask: string[];\n profile: string | boolean | undefined;\n skipLocalCache: boolean;\n continue: boolean;\n cache: boolean;\n resetCache: boolean;\n nodeArg: string;\n allowNoTargetRuns: boolean;\n}\n\nexport async function watchAction(options: RunOptions, command: Command) {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n const concurrency = getConcurrency(options.concurrency, config.concurrency);\n\n // Configure logger\n const logger = createLogger();\n const reporter = new LogReporter({\n logLevel: LogLevel[options.logLevel],\n });\n logger.addReporter(reporter);\n\n // Build Target Graph\n const root = getWorkspaceRoot(process.cwd())!;\n const packageInfos = await getPackageInfosAsync(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n });\n\n // Make sure we do not attempt writeRemoteCache in watch mode\n config.cacheOptions.writeRemoteCache = false;\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n const maxWorkersPerTaskMap = getMaxWorkersPerTaskFromOptions(options.maxWorkersPerTask);\n\n const { hasher } = await createCache({\n root,\n logger,\n cacheOptions: config.cacheOptions,\n cliArgs: taskArgs,\n skipLocalCache: options.skipLocalCache,\n });\n\n const scheduler = new SimpleScheduler({\n logger,\n concurrency,\n continueOnError: true,\n workerData: {\n root,\n taskArgs,\n skipLocalCache: options.skipLocalCache,\n cacheOptions: config.cacheOptions,\n runners: {\n ...runnerPickerOptions(options.nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n },\n },\n shouldCache: options.cache,\n shouldResetCache: options.resetCache,\n maxWorkersPerTask: new Map([...getMaxWorkersPerTask(filteredPipeline, concurrency), ...maxWorkersPerTaskMap]),\n hasher,\n workerIdleMemoryLimit: config.workerIdleMemoryLimit, // in bytes\n });\n\n // Initial run\n const summary = await scheduler.run(root, targetGraph);\n displaySummary(summary, logger.reporters);\n\n logger.info(\"Running scheduler in watch mode\");\n\n // Disables cache for subsequent runs\n // TODO: support updating hasher + write-only local cacheProvider for subsequent runs\n for (const targetRun of scheduler.targetRuns.values()) {\n targetRun.options.shouldCache = false;\n }\n\n // When initial run is done, disable fetching of caches on all targets, keep writing to the cache\n const watcher = await watch(root, packageInfos);\n watcher.on(\"change\", async (packageName) => {\n reporter.resetLogEntries();\n const targets = new Map<string, Target>();\n for (const target of targetGraph.targets.values()) {\n if (target.packageName === packageName) {\n targets.set(target.id, target);\n }\n }\n\n const deltaGraph = { targets };\n\n const summary = await scheduler.run(root, deltaGraph, true);\n displaySummary(summary, logger.reporters);\n });\n}\n\nfunction displaySummary(summary: SchedulerRunSummary, reporters: Reporter[]) {\n for (const reporter of reporters) {\n reporter.summarize(summary);\n reporter.cleanup?.();\n }\n}\n"],"names":["watchAction","options","command","cwd","process","config","getConfig","concurrency","getConcurrency","logger","createLogger","reporter","LogReporter","logLevel","LogLevel","addReporter","root","getWorkspaceRoot","packageInfos","getPackageInfosAsync","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","writeRemoteCache","filteredPipeline","filterPipelineDefinitions","targets","values","maxWorkersPerTaskMap","getMaxWorkersPerTaskFromOptions","maxWorkersPerTask","hasher","createCache","cliArgs","skipLocalCache","scheduler","SimpleScheduler","continueOnError","workerData","runners","runnerPickerOptions","nodeArg","npmClient","shouldCache","cache","shouldResetCache","resetCache","Map","getMaxWorkersPerTask","workerIdleMemoryLimit","summary","run","displaySummary","reporters","info","targetRun","targetRuns","watcher","watch","on","packageName","resetLogEntries","target","set","id","deltaGraph","summarize","cleanup"],"mappings":";;;;+BAgCsBA;;;eAAAA;;;mCA/BY;oCACC;wBAC8D;gCAC1C;2CACb;2BACd;2BACI;yBACV;gEAGiB;qCAMX;qCACQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAc7B,eAAeA,YAAYC,OAAmB,EAAEC,OAAgB;IACrE,MAAMC,MAAMC,QAAQD,GAAG;IACvB,MAAME,SAAS,MAAMC,IAAAA,iBAAS,EAACH;IAC/B,MAAMI,cAAcC,IAAAA,sBAAc,EAACP,QAAQM,WAAW,EAAEF,OAAOE,WAAW;IAE1E,mBAAmB;IACnB,MAAME,SAASC,IAAAA,eAAY;IAC3B,MAAMC,WAAW,IAAIC,sBAAW,CAAC;QAC/BC,UAAUC,gBAAQ,CAACb,QAAQY,QAAQ,CAAC;IACtC;IACAJ,OAAOM,WAAW,CAACJ;IAEnB,qBAAqB;IACrB,MAAMK,OAAOC,IAAAA,gCAAgB,EAACb,QAAQD,GAAG;IACzC,MAAMe,eAAe,MAAMC,IAAAA,oCAAoB,EAACH;IAEhD,MAAM,EAAEI,KAAK,EAAEC,QAAQ,EAAE,GAAGC,IAAAA,sCAAkB,EAACpB,QAAQqB,IAAI;IAE3D,MAAMC,cAAc,MAAMC,IAAAA,oCAAiB,EAAC;QAC1ChB;QACAO;QACAU,cAAczB,QAAQyB,YAAY;QAClCC,YAAY1B,QAAQ0B,UAAU,IAAI,CAAC1B,QAAQ2B,EAAE;QAC7CC,QAAQ5B,QAAQ4B,MAAM,CAACC,MAAM,CAACzB,OAAOwB,MAAM;QAC3CE,UAAU1B,OAAO0B,QAAQ;QACzBC,iBAAiB3B,OAAO2B,eAAe;QACvCC,OAAO,AAAChC,CAAAA,QAAQgC,KAAK,IAAI,EAAE,AAAD,EAAGH,MAAM,CAAC7B,QAAQ2B,EAAE,IAAI,EAAE;QACpDM,OAAOjC,QAAQiC,KAAK;QACpBC,SAAS9B,OAAO+B,YAAY,CAACC,UAAU;QACvCjB;QACAF;QACAoB,YAAYjC,OAAOiC,UAAU;
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/run/watchAction.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { createTargetGraph } from \"./createTargetGraph.js\";\nimport { filterArgsForTasks } from \"./filterArgsForTasks.js\";\nimport { getConfig, getMaxWorkersPerTask, getMaxWorkersPerTaskFromOptions, getConcurrency } from \"@lage-run/config\";\nimport { getPackageInfosAsync, getWorkspaceRoot } from \"workspace-tools\";\nimport { filterPipelineDefinitions } from \"./filterPipelineDefinitions.js\";\nimport { LogReporter } from \"@lage-run/reporters\";\nimport { SimpleScheduler } from \"@lage-run/scheduler\";\nimport { watch } from \"./watcher.js\";\n\nimport type { Reporter } from \"@lage-run/logger\";\nimport createLogger, { LogLevel } from \"@lage-run/logger\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { SchedulerRunSummary } from \"@lage-run/scheduler-types\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport type { FilterOptions } from \"../../types/FilterOptions.js\";\nimport { createCache } from \"../../cache/createCacheProvider.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\n\ninterface RunOptions extends ReporterInitOptions, FilterOptions {\n concurrency: number;\n maxWorkersPerTask: string[];\n profile: string | boolean | undefined;\n skipLocalCache: boolean;\n continue: boolean;\n cache: boolean;\n resetCache: boolean;\n nodeArg: string;\n allowNoTargetRuns: boolean;\n}\n\nexport async function watchAction(options: RunOptions, command: Command) {\n const cwd = process.cwd();\n const config = await getConfig(cwd);\n const concurrency = getConcurrency(options.concurrency, config.concurrency);\n\n // Configure logger\n const logger = createLogger();\n const reporter = new LogReporter({\n logLevel: LogLevel[options.logLevel],\n });\n logger.addReporter(reporter);\n\n // Build Target Graph\n const root = getWorkspaceRoot(process.cwd())!;\n const packageInfos = await getPackageInfosAsync(root);\n\n const { tasks, taskArgs } = filterArgsForTasks(command.args);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: options.dependencies,\n dependents: options.dependents && !options.to, // --to is a short hand for --scope + --no-dependents\n ignore: options.ignore.concat(config.ignore),\n pipeline: config.pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: (options.scope ?? []).concat(options.to ?? []), // --to is a short hand for --scope + --no-dependents\n since: options.since,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n enableTargetConfigMerging: config.enableTargetConfigMerging,\n });\n\n // Make sure we do not attempt writeRemoteCache in watch mode\n config.cacheOptions.writeRemoteCache = false;\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n const maxWorkersPerTaskMap = getMaxWorkersPerTaskFromOptions(options.maxWorkersPerTask);\n\n const { hasher } = await createCache({\n root,\n logger,\n cacheOptions: config.cacheOptions,\n cliArgs: taskArgs,\n skipLocalCache: options.skipLocalCache,\n });\n\n const scheduler = new SimpleScheduler({\n logger,\n concurrency,\n continueOnError: true,\n workerData: {\n root,\n taskArgs,\n skipLocalCache: options.skipLocalCache,\n cacheOptions: config.cacheOptions,\n runners: {\n ...runnerPickerOptions(options.nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n },\n },\n shouldCache: options.cache,\n shouldResetCache: options.resetCache,\n maxWorkersPerTask: new Map([...getMaxWorkersPerTask(filteredPipeline, concurrency), ...maxWorkersPerTaskMap]),\n hasher,\n workerIdleMemoryLimit: config.workerIdleMemoryLimit, // in bytes\n });\n\n // Initial run\n const summary = await scheduler.run(root, targetGraph);\n displaySummary(summary, logger.reporters);\n\n logger.info(\"Running scheduler in watch mode\");\n\n // Disables cache for subsequent runs\n // TODO: support updating hasher + write-only local cacheProvider for subsequent runs\n for (const targetRun of scheduler.targetRuns.values()) {\n targetRun.options.shouldCache = false;\n }\n\n // When initial run is done, disable fetching of caches on all targets, keep writing to the cache\n const watcher = await watch(root, packageInfos);\n watcher.on(\"change\", async (packageName) => {\n reporter.resetLogEntries();\n const targets = new Map<string, Target>();\n for (const target of targetGraph.targets.values()) {\n if (target.packageName === packageName) {\n targets.set(target.id, target);\n }\n }\n\n const deltaGraph = { targets };\n\n const summary = await scheduler.run(root, deltaGraph, true);\n displaySummary(summary, logger.reporters);\n });\n}\n\nfunction displaySummary(summary: SchedulerRunSummary, reporters: Reporter[]) {\n for (const reporter of reporters) {\n reporter.summarize(summary);\n reporter.cleanup?.();\n }\n}\n"],"names":["watchAction","options","command","cwd","process","config","getConfig","concurrency","getConcurrency","logger","createLogger","reporter","LogReporter","logLevel","LogLevel","addReporter","root","getWorkspaceRoot","packageInfos","getPackageInfosAsync","tasks","taskArgs","filterArgsForTasks","args","targetGraph","createTargetGraph","dependencies","dependents","to","ignore","concat","pipeline","repoWideChanges","scope","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","writeRemoteCache","filteredPipeline","filterPipelineDefinitions","targets","values","maxWorkersPerTaskMap","getMaxWorkersPerTaskFromOptions","maxWorkersPerTask","hasher","createCache","cliArgs","skipLocalCache","scheduler","SimpleScheduler","continueOnError","workerData","runners","runnerPickerOptions","nodeArg","npmClient","shouldCache","cache","shouldResetCache","resetCache","Map","getMaxWorkersPerTask","workerIdleMemoryLimit","summary","run","displaySummary","reporters","info","targetRun","targetRuns","watcher","watch","on","packageName","resetLogEntries","target","set","id","deltaGraph","summarize","cleanup"],"mappings":"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"}
|
|
@@ -56,7 +56,8 @@ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg,
|
|
|
56
56
|
outputs: config.cacheOptions.outputGlob,
|
|
57
57
|
tasks,
|
|
58
58
|
packageInfos,
|
|
59
|
-
priorities: config.priorities
|
|
59
|
+
priorities: config.priorities,
|
|
60
|
+
enableTargetConfigMerging: config.enableTargetConfigMerging
|
|
60
61
|
});
|
|
61
62
|
const targetHasher = new _hasher.TargetHasher({
|
|
62
63
|
root,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/server/lageService.ts"],"sourcesContent":["import { type ConfigOptions, getConfig, getConcurrency, getMaxWorkersPerTask } from \"@lage-run/config\";\nimport type { Logger } from \"@lage-run/logger\";\nimport { ConnectError, Code, type ILageService } from \"@lage-run/rpc\";\nimport { getStartTargetId, getTargetId, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, 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 { 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\";\nimport { getGlobalInputHashFilePath, getHashFilePath } from \"../targetHashFilePath.js\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n targetHasher: TargetHasher;\n}\n\nlet initializedPromise: Promise<LageServiceContext> | undefined;\ninterface ServiceControls {\n abortController: AbortController;\n countdownToShutdown: () => void;\n clearCountdown: () => void;\n}\ninterface InitializeOptions {\n cwd: string;\n logger: Logger;\n serverControls: ServiceControls;\n concurrency?: number;\n nodeArg?: string;\n taskArgs: string[];\n tasks: string[];\n}\n\nfunction formatBytes(bytes: number) {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nasync function createInitializedPromise({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }: InitializeOptions) {\n if (initializedPromise) {\n return initializedPromise;\n }\n\n const config = await getConfig(cwd);\n const root = 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 logger.info(\"done initializing\");\n return { config, targetGraph, packageTree, dependencyMap, root, pool, targetHasher };\n}\n\n/**\n * Initializes the lageService: the extra \"initializePromise\" ensures only one initialization is done at a time across threads\n * @param cwd\n * @param logger\n * @returns\n */\nasync function initialize(options: InitializeOptions): Promise<LageServiceContext> {\n initializedPromise = createInitializedPromise(options);\n return initializedPromise;\n}\n\ninterface CreateLageServiceOptions {\n cwd: string;\n serverControls: ServiceControls;\n logger: Logger;\n concurrency?: number;\n tasks: string[];\n}\n\nexport async function createLageService({\n cwd,\n serverControls,\n logger,\n concurrency,\n tasks,\n}: CreateLageServiceOptions): Promise<ILageService> {\n return {\n async ping() {\n return { pong: true };\n },\n\n async runTarget(request) {\n if (global.gc) {\n global.gc();\n }\n\n serverControls.clearCountdown();\n\n // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call\n // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same\n // `lage info` call\n const { config, targetGraph, dependencyMap, packageTree, root, pool, targetHasher } = await initialize({\n cwd,\n logger,\n nodeArg: request.nodeOptions,\n taskArgs: request.taskArgs,\n serverControls,\n concurrency,\n tasks,\n });\n\n const runners = 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 let results: {\n packageName?: string;\n task: string;\n cwd: string;\n exitCode: number;\n inputs: string[];\n outputs: string[];\n stdout: string;\n stderr: string;\n id: string;\n globalInputHashFile: string;\n };\n\n const inputs = getInputFiles(target, dependencyMap, packageTree);\n\n for (const dep of target.dependencies) {\n if (dep === getStartTargetId()) {\n continue;\n }\n\n const depTarget = targetGraph.targets.get(dep)!;\n inputs.push(path.join(path.relative(root, depTarget.cwd), getHashFilePath(depTarget)).replace(/\\\\/g, \"/\"));\n }\n\n // Write the target hash to a file for its dependants to use\n const targetHashFile = getHashFilePath(target);\n const targetHashFullPath = path.join(target.cwd, targetHashFile);\n\n try {\n if (!fs.existsSync(path.dirname(targetHashFullPath))) {\n fs.mkdirSync(path.dirname(targetHashFullPath), { recursive: true });\n }\n\n fs.writeFileSync(targetHashFullPath, await targetHasher.hash(target));\n } catch (e) {\n throw new ConnectError(`Error writing target hash file: ${targetHashFullPath}`, Code.Internal);\n }\n\n const targetGlobalInputHashRelativePath = getGlobalInputHashFilePath(target);\n\n try {\n await pool.exec(\n task,\n 0,\n (worker, stdout, stderr) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);\n\n pipedStdout = stdout;\n pipedStderr = stderr;\n\n stdout.pipe(writableStdout);\n stderr.pipe(writableStderr);\n\n targetRun.threadId = worker.threadId;\n targetRun.status = \"running\";\n targetRun.startTime = process.hrtime();\n },\n (worker) => {\n logger.info(`Max Worker Memory Usage: ${formatBytes(pool.stats().maxWorkerMemoryUsage)}`);\n\n // logger.info the main process memory usage\n const memoryUsage = process.memoryUsage();\n logger.info(\n `Main Process Memory Usage: RSS: ${formatBytes(memoryUsage.rss)} Heap Total: ${formatBytes(\n memoryUsage.heapTotal\n )} Heap Used: ${formatBytes(memoryUsage.heapUsed)}`\n );\n\n targetRun.status = \"success\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n logger.info(\n `[${worker.threadId}] ${request.packageName}#${request.task} end: ${formatDuration(hrToSeconds(targetRun.duration))}`\n );\n pipedStdout.unpipe(writableStdout);\n pipedStderr.unpipe(writableStderr);\n }\n );\n\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n const targetHashFileRelativePath = path.relative(root, targetHashFullPath).replace(/\\\\/g, \"/\");\n outputs.push(targetHashFileRelativePath);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n cwd: target.cwd,\n exitCode: 0,\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n const targetHashFileRelativePath = path.relative(root, targetHashFullPath).replace(/\\\\/g, \"/\");\n outputs.push(targetHashFileRelativePath);\n\n targetRun.status = \"failed\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n results = {\n packageName: request.packageName,\n task: request.task,\n cwd: target.cwd,\n exitCode: 1,\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\n };\n }\n\n logger.info(\n `${request.packageName}#${request.task} results: \\n${JSON.stringify(\n {\n packageName: results.packageName,\n task: results.task,\n cwd: results.cwd,\n exitCode: results.exitCode,\n inputs: results.inputs,\n outputs: results.outputs,\n id: results.id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\n },\n null,\n 2\n )}\\n------`,\n results\n );\n\n return results;\n },\n };\n}\n"],"names":["createLageService","initializedPromise","formatBytes","bytes","toFixed","createInitializedPromise","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","config","getConfig","root","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","options","ping","pong","runTarget","request","global","gc","clearCountdown","nodeOptions","id","getTargetId","packageName","has","exitCode","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","targetRun","queueTime","process","hrtime","duration","startTime","status","threadId","results","inputs","getInputFiles","dep","getStartTargetId","depTarget","push","path","relative","getHashFilePath","replace","targetHashFile","targetHashFullPath","fs","existsSync","dirname","mkdirSync","recursive","writeFileSync","hash","e","ConnectError","Code","Internal","targetGlobalInputHashRelativePath","getGlobalInputHashFilePath","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","targetHashFileRelativePath","toString","globalInputHashFile","Error","JSON","stringify"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/server/lageService.ts"],"sourcesContent":["import { type ConfigOptions, getConfig, getConcurrency, getMaxWorkersPerTask } from \"@lage-run/config\";\nimport type { Logger } from \"@lage-run/logger\";\nimport { ConnectError, Code, type ILageService } from \"@lage-run/rpc\";\nimport { getStartTargetId, getTargetId, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, 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 { 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\";\nimport { getGlobalInputHashFilePath, getHashFilePath } from \"../targetHashFilePath.js\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n targetHasher: TargetHasher;\n}\n\nlet initializedPromise: Promise<LageServiceContext> | undefined;\ninterface ServiceControls {\n abortController: AbortController;\n countdownToShutdown: () => void;\n clearCountdown: () => void;\n}\ninterface InitializeOptions {\n cwd: string;\n logger: Logger;\n serverControls: ServiceControls;\n concurrency?: number;\n nodeArg?: string;\n taskArgs: string[];\n tasks: string[];\n}\n\nfunction formatBytes(bytes: number) {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nasync function createInitializedPromise({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }: InitializeOptions) {\n if (initializedPromise) {\n return initializedPromise;\n }\n\n const config = await getConfig(cwd);\n const root = 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 enableTargetConfigMerging: config.enableTargetConfigMerging,\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 logger.info(\"done initializing\");\n return { config, targetGraph, packageTree, dependencyMap, root, pool, targetHasher };\n}\n\n/**\n * Initializes the lageService: the extra \"initializePromise\" ensures only one initialization is done at a time across threads\n * @param cwd\n * @param logger\n * @returns\n */\nasync function initialize(options: InitializeOptions): Promise<LageServiceContext> {\n initializedPromise = createInitializedPromise(options);\n return initializedPromise;\n}\n\ninterface CreateLageServiceOptions {\n cwd: string;\n serverControls: ServiceControls;\n logger: Logger;\n concurrency?: number;\n tasks: string[];\n}\n\nexport async function createLageService({\n cwd,\n serverControls,\n logger,\n concurrency,\n tasks,\n}: CreateLageServiceOptions): Promise<ILageService> {\n return {\n async ping() {\n return { pong: true };\n },\n\n async runTarget(request) {\n if (global.gc) {\n global.gc();\n }\n\n serverControls.clearCountdown();\n\n // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call\n // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same\n // `lage info` call\n const { config, targetGraph, dependencyMap, packageTree, root, pool, targetHasher } = await initialize({\n cwd,\n logger,\n nodeArg: request.nodeOptions,\n taskArgs: request.taskArgs,\n serverControls,\n concurrency,\n tasks,\n });\n\n const runners = 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 let results: {\n packageName?: string;\n task: string;\n cwd: string;\n exitCode: number;\n inputs: string[];\n outputs: string[];\n stdout: string;\n stderr: string;\n id: string;\n globalInputHashFile: string;\n };\n\n const inputs = getInputFiles(target, dependencyMap, packageTree);\n\n for (const dep of target.dependencies) {\n if (dep === getStartTargetId()) {\n continue;\n }\n\n const depTarget = targetGraph.targets.get(dep)!;\n inputs.push(path.join(path.relative(root, depTarget.cwd), getHashFilePath(depTarget)).replace(/\\\\/g, \"/\"));\n }\n\n // Write the target hash to a file for its dependants to use\n const targetHashFile = getHashFilePath(target);\n const targetHashFullPath = path.join(target.cwd, targetHashFile);\n\n try {\n if (!fs.existsSync(path.dirname(targetHashFullPath))) {\n fs.mkdirSync(path.dirname(targetHashFullPath), { recursive: true });\n }\n\n fs.writeFileSync(targetHashFullPath, await targetHasher.hash(target));\n } catch (e) {\n throw new ConnectError(`Error writing target hash file: ${targetHashFullPath}`, Code.Internal);\n }\n\n const targetGlobalInputHashRelativePath = getGlobalInputHashFilePath(target);\n\n try {\n await pool.exec(\n task,\n 0,\n (worker, stdout, stderr) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);\n\n pipedStdout = stdout;\n pipedStderr = stderr;\n\n stdout.pipe(writableStdout);\n stderr.pipe(writableStderr);\n\n targetRun.threadId = worker.threadId;\n targetRun.status = \"running\";\n targetRun.startTime = process.hrtime();\n },\n (worker) => {\n logger.info(`Max Worker Memory Usage: ${formatBytes(pool.stats().maxWorkerMemoryUsage)}`);\n\n // logger.info the main process memory usage\n const memoryUsage = process.memoryUsage();\n logger.info(\n `Main Process Memory Usage: RSS: ${formatBytes(memoryUsage.rss)} Heap Total: ${formatBytes(\n memoryUsage.heapTotal\n )} Heap Used: ${formatBytes(memoryUsage.heapUsed)}`\n );\n\n targetRun.status = \"success\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n logger.info(\n `[${worker.threadId}] ${request.packageName}#${request.task} end: ${formatDuration(hrToSeconds(targetRun.duration))}`\n );\n pipedStdout.unpipe(writableStdout);\n pipedStderr.unpipe(writableStderr);\n }\n );\n\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n const targetHashFileRelativePath = path.relative(root, targetHashFullPath).replace(/\\\\/g, \"/\");\n outputs.push(targetHashFileRelativePath);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n cwd: target.cwd,\n exitCode: 0,\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n const targetHashFileRelativePath = path.relative(root, targetHashFullPath).replace(/\\\\/g, \"/\");\n outputs.push(targetHashFileRelativePath);\n\n targetRun.status = \"failed\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n results = {\n packageName: request.packageName,\n task: request.task,\n cwd: target.cwd,\n exitCode: 1,\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\n };\n }\n\n logger.info(\n `${request.packageName}#${request.task} results: \\n${JSON.stringify(\n {\n packageName: results.packageName,\n task: results.task,\n cwd: results.cwd,\n exitCode: results.exitCode,\n inputs: results.inputs,\n outputs: results.outputs,\n id: results.id,\n globalInputHashFile: targetGlobalInputHashRelativePath,\n },\n null,\n 2\n )}\\n------`,\n results\n );\n\n return results;\n },\n };\n}\n"],"names":["createLageService","initializedPromise","formatBytes","bytes","toFixed","createInitializedPromise","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","config","getConfig","root","getWorkspaceRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","priorities","enableTargetConfigMerging","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","options","ping","pong","runTarget","request","global","gc","clearCountdown","nodeOptions","id","getTargetId","packageName","has","exitCode","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","targetRun","queueTime","process","hrtime","duration","startTime","status","threadId","results","inputs","getInputFiles","dep","getStartTargetId","depTarget","push","path","relative","getHashFilePath","replace","targetHashFile","targetHashFullPath","fs","existsSync","dirname","mkdirSync","recursive","writeFileSync","hash","e","ConnectError","Code","Internal","targetGlobalInputHashRelativePath","getGlobalInputHashFilePath","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","targetHashFileRelativePath","toString","globalInputHashFile","Error","JSON","stringify"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lage-run/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"description": "Command Line Interface for Lage",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -21,18 +21,18 @@
|
|
|
21
21
|
"lint": "monorepo-scripts lint"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@lage-run/cache": "^1.3.
|
|
25
|
-
"@lage-run/config": "^0.
|
|
24
|
+
"@lage-run/cache": "^1.3.16",
|
|
25
|
+
"@lage-run/config": "^0.5.0",
|
|
26
26
|
"@lage-run/format-hrtime": "^0.1.6",
|
|
27
27
|
"@lage-run/globby": "^14.2.1",
|
|
28
|
-
"@lage-run/hasher": "^1.
|
|
28
|
+
"@lage-run/hasher": "^1.9.0",
|
|
29
29
|
"@lage-run/logger": "^1.3.1",
|
|
30
|
-
"@lage-run/reporters": "^1.3.
|
|
30
|
+
"@lage-run/reporters": "^1.3.5",
|
|
31
31
|
"@lage-run/rpc": "^1.4.0",
|
|
32
|
-
"@lage-run/runners": "^1.2.
|
|
33
|
-
"@lage-run/scheduler": "^1.5.
|
|
34
|
-
"@lage-run/scheduler-types": "^0.3.
|
|
35
|
-
"@lage-run/target-graph": "^0.
|
|
32
|
+
"@lage-run/runners": "^1.2.4",
|
|
33
|
+
"@lage-run/scheduler": "^1.5.10",
|
|
34
|
+
"@lage-run/scheduler-types": "^0.3.26",
|
|
35
|
+
"@lage-run/target-graph": "^0.12.0",
|
|
36
36
|
"@lage-run/worker-threads-pool": "^0.9.0",
|
|
37
37
|
"chokidar": "3.6.0",
|
|
38
38
|
"commander": "9.5.0",
|