@lage-run/cli 0.24.3 → 0.24.4
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 +64 -1
- package/CHANGELOG.md +18 -2
- package/lib/commands/info/action.js +2 -17
- package/lib/commands/info/action.js.map +1 -1
- package/lib/commands/run/createTargetGraph.js +26 -2
- package/lib/commands/run/createTargetGraph.js.map +1 -1
- package/lib/commands/run/runAction.js +9 -1
- package/lib/commands/run/runAction.js.map +1 -1
- package/lib/filter/getFilteredPackages.js +2 -65
- package/lib/filter/getFilteredPackages.js.map +1 -1
- package/lib/filter/hasRepoChanged.d.ts +2 -0
- package/lib/filter/hasRepoChanged.js +75 -0
- package/lib/filter/hasRepoChanged.js.map +1 -0
- package/lib/optimizeTargetGraph.d.ts +3 -0
- package/lib/optimizeTargetGraph.js +49 -0
- package/lib/optimizeTargetGraph.js.map +1 -0
- package/package.json +9 -9
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,70 @@
|
|
|
2
2
|
"name": "@lage-run/cli",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "
|
|
5
|
+
"date": "Mon, 02 Dec 2024 17:22:51 GMT",
|
|
6
|
+
"version": "0.24.4",
|
|
7
|
+
"tag": "@lage-run/cli_v0.24.4",
|
|
8
|
+
"comments": {
|
|
9
|
+
"patch": [
|
|
10
|
+
{
|
|
11
|
+
"author": "kchau@microsoft.com",
|
|
12
|
+
"package": "@lage-run/cli",
|
|
13
|
+
"commit": "51d453bb81eb36a37656502fb716f611860d910e",
|
|
14
|
+
"comment": "adds the ability to create stagedTargets"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"author": "beachball",
|
|
18
|
+
"package": "@lage-run/cli",
|
|
19
|
+
"comment": "Bump @lage-run/cache to v1.3.10",
|
|
20
|
+
"commit": "not available"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"author": "beachball",
|
|
24
|
+
"package": "@lage-run/cli",
|
|
25
|
+
"comment": "Bump @lage-run/config to v0.4.11",
|
|
26
|
+
"commit": "not available"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"author": "beachball",
|
|
30
|
+
"package": "@lage-run/cli",
|
|
31
|
+
"comment": "Bump @lage-run/hasher to v1.6.7",
|
|
32
|
+
"commit": "not available"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"author": "beachball",
|
|
36
|
+
"package": "@lage-run/cli",
|
|
37
|
+
"comment": "Bump @lage-run/reporters to v1.2.18",
|
|
38
|
+
"commit": "not available"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"author": "beachball",
|
|
42
|
+
"package": "@lage-run/cli",
|
|
43
|
+
"comment": "Bump @lage-run/runners to v1.2.0",
|
|
44
|
+
"commit": "not available"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"author": "beachball",
|
|
48
|
+
"package": "@lage-run/cli",
|
|
49
|
+
"comment": "Bump @lage-run/scheduler to v1.4.0",
|
|
50
|
+
"commit": "not available"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"author": "beachball",
|
|
54
|
+
"package": "@lage-run/cli",
|
|
55
|
+
"comment": "Bump @lage-run/scheduler-types to v0.3.22",
|
|
56
|
+
"commit": "not available"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"author": "beachball",
|
|
60
|
+
"package": "@lage-run/cli",
|
|
61
|
+
"comment": "Bump @lage-run/target-graph to v0.11.0",
|
|
62
|
+
"commit": "not available"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"date": "Wed, 20 Nov 2024 08:12:37 GMT",
|
|
6
69
|
"version": "0.24.3",
|
|
7
70
|
"tag": "@lage-run/cli_v0.24.3",
|
|
8
71
|
"comments": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
# Change Log - @lage-run/cli
|
|
2
2
|
|
|
3
|
-
<!-- This log was last generated on
|
|
3
|
+
<!-- This log was last generated on Mon, 02 Dec 2024 17:22:51 GMT and should not be manually modified. -->
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 0.24.4
|
|
8
|
+
|
|
9
|
+
Mon, 02 Dec 2024 17:22:51 GMT
|
|
10
|
+
|
|
11
|
+
### Patches
|
|
12
|
+
|
|
13
|
+
- adds the ability to create stagedTargets (kchau@microsoft.com)
|
|
14
|
+
- Bump @lage-run/cache to v1.3.10
|
|
15
|
+
- Bump @lage-run/config to v0.4.11
|
|
16
|
+
- Bump @lage-run/hasher to v1.6.7
|
|
17
|
+
- Bump @lage-run/reporters to v1.2.18
|
|
18
|
+
- Bump @lage-run/runners to v1.2.0
|
|
19
|
+
- Bump @lage-run/scheduler to v1.4.0
|
|
20
|
+
- Bump @lage-run/scheduler-types to v0.3.22
|
|
21
|
+
- Bump @lage-run/target-graph to v0.11.0
|
|
22
|
+
|
|
7
23
|
## 0.24.3
|
|
8
24
|
|
|
9
|
-
Wed, 20 Nov 2024 08:12:
|
|
25
|
+
Wed, 20 Nov 2024 08:12:37 GMT
|
|
10
26
|
|
|
11
27
|
### Patches
|
|
12
28
|
|
|
@@ -14,7 +14,6 @@ const _config = require("@lage-run/config");
|
|
|
14
14
|
const _workspacetools = require("workspace-tools");
|
|
15
15
|
const _getFilteredPackages = require("../../filter/getFilteredPackages.js");
|
|
16
16
|
const _logger = /*#__PURE__*/ _interop_require_default(require("@lage-run/logger"));
|
|
17
|
-
const _targetgraph = require("@lage-run/target-graph");
|
|
18
17
|
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
19
18
|
const _shellquote = require("shell-quote");
|
|
20
19
|
const _initializeReporters = require("../initializeReporters.js");
|
|
@@ -22,6 +21,7 @@ const _runners = require("@lage-run/runners");
|
|
|
22
21
|
const _getBinPaths = require("../../getBinPaths.js");
|
|
23
22
|
const _runnerPickerOptions = require("../../runnerPickerOptions.js");
|
|
24
23
|
const _parseServerOption = require("../parseServerOption.js");
|
|
24
|
+
const _optimizeTargetGraph = require("../../optimizeTargetGraph.js");
|
|
25
25
|
function _interop_require_default(obj) {
|
|
26
26
|
return obj && obj.__esModule ? obj : {
|
|
27
27
|
default: obj
|
|
@@ -65,7 +65,7 @@ async function infoAction(options, command) {
|
|
|
65
65
|
});
|
|
66
66
|
const pickerOptions = (0, _runnerPickerOptions.runnerPickerOptions)(options.nodeArg, config.npmClient, taskArgs);
|
|
67
67
|
const runnerPicker = new _runners.TargetRunnerPicker(pickerOptions);
|
|
68
|
-
const optimizedTargets = await optimizeTargetGraph(targetGraph, runnerPicker);
|
|
68
|
+
const optimizedTargets = await (0, _optimizeTargetGraph.optimizeTargetGraph)(targetGraph, runnerPicker);
|
|
69
69
|
const binPaths = (0, _getBinPaths.getBinPaths)();
|
|
70
70
|
const packageTasks = optimizedTargets.map((target)=>generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos));
|
|
71
71
|
logger.info("info", {
|
|
@@ -74,21 +74,6 @@ async function infoAction(options, command) {
|
|
|
74
74
|
packageTasks
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
|
-
async function optimizeTargetGraph(graph, runnerPicker) {
|
|
78
|
-
const targetMinimizedNodes = await (0, _targetgraph.removeNodes)([
|
|
79
|
-
...graph.targets.values()
|
|
80
|
-
], async (target)=>{
|
|
81
|
-
if (target.type === "noop") {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
const runner = await runnerPicker.pick(target);
|
|
85
|
-
if (!await runner.shouldRun(target)) {
|
|
86
|
-
return true;
|
|
87
|
-
}
|
|
88
|
-
return false;
|
|
89
|
-
});
|
|
90
|
-
return (0, _targetgraph.transitiveReduction)(targetMinimizedNodes);
|
|
91
|
-
}
|
|
92
77
|
function generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos) {
|
|
93
78
|
const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos);
|
|
94
79
|
const workingDirectory = getWorkingDirectory(target);
|
|
@@ -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 { removeNodes, transitiveReduction } from \"@lage-run/target-graph\";\nimport path from \"path\";\nimport { parse } from \"shell-quote\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { TargetGraph, Target } 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\";\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}\n\ninterface PackageTask {\n id: string;\n command: string[];\n dependencies: string[];\n workingDirectory: string;\n package: string;\n task: string;\n}\n\n/**\n * The info command displays information about a target graph in a workspace.\n * The generated output can be read and used by other task runners, such as BuildXL.\n *\n * Expected format:\n * [\n * {\n * \"id\": \"bar##build\",\n * \"package\": \"bar\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/bar\",\n * \"dependencies\": []\n * },\n * {\n * \"id\": \"foo##build\",\n * \"package\": \"foo\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"bar##build\"\n * ]\n * },\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 });\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 const optimizedTargets = await optimizeTargetGraph(targetGraph, runnerPicker);\n const binPaths = getBinPaths();\n const packageTasks = optimizedTargets.map((target) => generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos));\n\n logger.info(\"info\", {\n command: command.args,\n scope,\n packageTasks,\n });\n}\n\nasync function optimizeTargetGraph(graph: TargetGraph, runnerPicker: TargetRunnerPicker) {\n const targetMinimizedNodes = await removeNodes([...graph.targets.values()], async (target) => {\n if (target.type === \"noop\") {\n return true;\n }\n\n const runner = await runnerPicker.pick(target);\n if (!(await runner.shouldRun(target))) {\n return true;\n }\n\n return false;\n });\n\n return transitiveReduction(targetMinimizedNodes);\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): PackageTask {\n const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos);\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 };\n\n return packageTask;\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) {\n const shouldRunWorkersAsService =\n (typeof process.env.LAGE_WORKER_SERVER === \"string\" && process.env.LAGE_WORKER_SERVER !== \"false\") || !!options.server;\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) {\n const { host, port } = parseServerOption(options.server);\n const command = [binPaths[\"lage\"], \"exec\", \"--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","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","pickerOptions","runnerPickerOptions","nodeArg","npmClient","runnerPicker","TargetRunnerPicker","optimizedTargets","optimizeTargetGraph","binPaths","getBinPaths","packageTasks","map","target","generatePackageTask","info","graph","targetMinimizedNodes","removeNodes","targets","values","type","runner","pick","shouldRun","transitiveReduction","generateCommand","workingDirectory","getWorkingDirectory","packageTask","id","package","packageName","task","shouldRunWorkersAsService","env","LAGE_WORKER_SERVER","script","undefined","scripts","startsWith","parsed","parse","length","every","entry","getNpmArgs","host","port","parseServerOption","concurrency","push","toString","lage","path","relative","replace","taskTargs","extraArgs"],"mappings":";;;;+BA8EsBA;;;eAAAA;;;mCA7EY;oCACC;wBAET;gCAC2C;qCACjC;+DACX;6BACwB;6DAChC;4BACK;qCAIc;yBACD;6BACP;qCACQ;mCACF;;;;;;AA4D3B,eAAeA,WAAWC,OAA0B,EAAEC,OAAgB;IAC3E,MAAMC,MAAMC,QAAQD,GAAG;IACvB,MAAME,SAAS,MAAMC,IAAAA,iBAAS,EAACH;IAC/B,MAAMI,SAASC,IAAAA,eAAY;IAC3BP,QAAQQ,QAAQ,GAAGR,QAAQQ,QAAQ,IAAI;IACvCR,QAAQS,QAAQ,GAAGT,QAAQS,QAAQ,IAAI;IACvCT,QAAQU,MAAM,GAAG,OAAOV,QAAQU,MAAM,KAAK,aAAaV,QAAQU,MAAM,GAAG,mBAAmBV,QAAQU,MAAM;IAC1GC,IAAAA,wCAAmB,EAACL,QAAQN;IAC5B,MAAMY,OAAOC,IAAAA,gCAAgB,EAACX;IAE9B,MAAMY,eAAeC,IAAAA,+BAAe,EAACH;IAErC,MAAM,EAAEI,KAAK,EAAEC,QAAQ,EAAE,GAAGC,IAAAA,sCAAkB,EAACjB,QAAQkB,IAAI;IAE3D,MAAMC,cAAc,MAAMC,IAAAA,oCAAiB,EAAC;QAC1Cf;QACAM;QACAU,cAActB,QAAQsB,YAAY;QAClCC,YAAYvB,QAAQuB,UAAU,IAAI,CAACvB,QAAQwB,EAAE;QAC7CC,QAAQzB,QAAQyB,MAAM,CAACC,MAAM,CAACtB,OAAOqB,MAAM;QAC3CE,UAAUvB,OAAOuB,QAAQ;QACzBC,iBAAiBxB,OAAOwB,eAAe;QACvCC,OAAO,AAAC7B,CAAAA,QAAQ6B,KAAK,IAAI,EAAE,AAAD,EAAGH,MAAM,CAAC1B,QAAQwB,EAAE,IAAI,EAAE;QACpDM,OAAO9B,QAAQ8B,KAAK;QACpBC,SAAS3B,OAAO4B,YAAY,CAACC,UAAU;QACvCjB;QACAF;IACF;IAEA,MAAMe,QAAQK,IAAAA,wCAAmB,EAAC;QAChCtB;QACAE;QACAR;QACA6B,qBAAqBnC,QAAQsB,YAAY;QACzCc,mBAAmBpC,QAAQuB,UAAU,IAAI,CAACvB,QAAQwB,EAAE;QACpDM,OAAO9B,QAAQ8B,KAAK;QACpBD,OAAO,AAAC7B,CAAAA,QAAQ6B,KAAK,IAAI,EAAE,AAAD,EAAGH,MAAM,CAAC1B,QAAQwB,EAAE,IAAI,EAAE;QACpDI,iBAAiBxB,OAAOwB,eAAe;QACvCS,kBAAkBrC,QAAQyB,MAAM,CAACC,MAAM,CAACtB,OAAOqB,MAAM;IACvD;IAEA,MAAMa,gBAAgBC,IAAAA,wCAAmB,EAACvC,QAAQwC,OAAO,EAAEpC,OAAOqC,SAAS,EAAExB;IAE7E,MAAMyB,eAAe,IAAIC,2BAAkB,CAACL;IAE5C,MAAMM,mBAAmB,MAAMC,oBAAoBzB,aAAasB;IAChE,MAAMI,WAAWC,IAAAA,wBAAW;IAC5B,MAAMC,eAAeJ,iBAAiBK,GAAG,CAAC,CAACC,SAAWC,oBAAoBD,QAAQjC,UAAUb,QAAQJ,SAAS8C,UAAUhC;IAEvHR,OAAO8C,IAAI,CAAC,QAAQ;QAClBnD,SAASA,QAAQkB,IAAI;QACrBU;QACAmB;IACF;AACF;AAEA,eAAeH,oBAAoBQ,KAAkB,EAAEX,YAAgC;IACrF,MAAMY,uBAAuB,MAAMC,IAAAA,wBAAW,EAAC;WAAIF,MAAMG,OAAO,CAACC,MAAM;KAAG,EAAE,OAAOP;QACjF,IAAIA,OAAOQ,IAAI,KAAK,QAAQ;YAC1B,OAAO;QACT;QAEA,MAAMC,SAAS,MAAMjB,aAAakB,IAAI,CAACV;QACvC,IAAI,CAAE,MAAMS,OAAOE,SAAS,CAACX,SAAU;YACrC,OAAO;QACT;QAEA,OAAO;IACT;IAEA,OAAOY,IAAAA,gCAAmB,EAACR;AAC7B;AAEA,SAASH,oBACPD,MAAc,EACdjC,QAAkB,EAClBb,MAAqB,EACrBJ,OAA0B,EAC1B8C,QAAiD,EACjDhC,YAA0B;IAE1B,MAAMb,UAAU8D,gBAAgBb,QAAQjC,UAAUb,QAAQJ,SAAS8C,UAAUhC;IAC7E,MAAMkD,mBAAmBC,oBAAoBf;IAE7C,MAAMgB,cAA2B;QAC/BC,IAAIjB,OAAOiB,EAAE;QACblE;QACAqB,cAAc4B,OAAO5B,YAAY;QACjC0C;QACAI,SAASlB,OAAOmB,WAAW,IAAI;QAC/BC,MAAMpB,OAAOoB,IAAI;IACnB;IAEA,OAAOJ;AACT;AAEA,SAASH,gBACPb,MAAc,EACdjC,QAAkB,EAClBb,MAAqB,EACrBJ,OAA0B,EAC1B8C,QAAiD,EACjDhC,YAA0B;IAE1B,MAAMyD,4BACJ,AAAC,OAAOpE,QAAQqE,GAAG,CAACC,kBAAkB,KAAK,YAAYtE,QAAQqE,GAAG,CAACC,kBAAkB,KAAK,WAAY,CAAC,CAACzE,QAAQU,MAAM;IAExH,IAAIwC,OAAOQ,IAAI,KAAK,aAAa;QAC/B,MAAMgB,SAASxB,OAAOmB,WAAW,KAAKM,YAAY7D,YAAY,CAACoC,OAAOmB,WAAW,CAAC,EAAEO,SAAS,CAAC1B,OAAOoB,IAAI,CAAC,GAAGK;QAE7G,8FAA8F;QAC9F,6FAA6F;QAC7F,IAAID,UAAUA,OAAOG,UAAU,CAAC,SAAS;YACvC,MAAMC,SAASC,IAAAA,iBAAK,EAACL;YACrB,IAAII,OAAOE,MAAM,GAAG,KAAKF,OAAOG,KAAK,CAAC,CAACC,QAAU,OAAOA,UAAU,WAAW;gBAC3E,OAAO;uBAAKJ;uBAAwB7D;iBAAS;YAC/C;QACF;QAEA,MAAMwB,YAAYrC,OAAOqC,SAAS,IAAI;QACtC,MAAMxC,UAAU;YAACwC;eAAc0C,WAAWjC,OAAOoB,IAAI,EAAErD;SAAU;QACjE,OAAOhB;IACT,OAAO,IAAIiD,OAAOQ,IAAI,KAAK,YAAYa,2BAA2B;QAChE,MAAM,EAAEa,IAAI,EAAEC,IAAI,EAAE,GAAGC,IAAAA,oCAAiB,EAACtF,QAAQU,MAAM;QACvD,MAAMT,UAAU;YAAC6C,QAAQ,CAAC,OAAO;YAAE;YAAQ;YAAY,GAAGsC,KAAK,CAAC,EAAEC,MAAM;SAAC;QACzE,IAAIrF,QAAQuF,WAAW,EAAE;YACvBtF,QAAQuF,IAAI,CAAC,iBAAiBxF,QAAQuF,WAAW,CAACE,QAAQ;QAC5D;QAEA,IAAIvC,OAAOmB,WAAW,EAAE;YACtBpE,QAAQuF,IAAI,CAACtC,OAAOmB,WAAW;QACjC;QAEA,IAAInB,OAAOoB,IAAI,EAAE;YACfrE,QAAQuF,IAAI,CAACtC,OAAOoB,IAAI;QAC1B;QAEArE,QAAQuF,IAAI,IAAIvE;QAChB,OAAOhB;IACT,OAAO,IAAIiD,OAAOQ,IAAI,KAAK,UAAU;QACnC,MAAMzD,UAAU;YAAC6C,SAAS4C,IAAI;YAAE;SAAO;QACvCzF,QAAQuF,IAAI,CAACtC,OAAOmB,WAAW,IAAI;QACnCpE,QAAQuF,IAAI,CAACtC,OAAOoB,IAAI;QACxBrE,QAAQuF,IAAI,IAAIvE;QAChB,OAAOhB;IACT;IAEA,OAAO,EAAE;AACX;AAEA,SAASgE,oBAAoBf,MAAM;IACjC,MAAMhD,MAAMC,QAAQD,GAAG;IACvB,MAAM8D,mBAAmB2B,aAAI,CAACC,QAAQ,CAAC/E,IAAAA,gCAAgB,EAACX,QAAQ,IAAIgD,OAAOhD,GAAG,EAAE2F,OAAO,CAAC,OAAO;IAC/F,OAAO7B;AACT;AAEA,SAASmB,WAAWb,IAAY,EAAEwB,SAAmB;IACnD,MAAMC,YAAYD,aAAanB,aAAamB,UAAUd,MAAM,GAAG,IAAI;QAAC;WAASc;KAAU,GAAG,EAAE;IAC5F,OAAO;QAAC;QAAOxB;WAASyB;KAAU;AACpC"}
|
|
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 { parse } from \"shell-quote\";\n\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { Target } 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\";\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}\n\ninterface PackageTask {\n id: string;\n command: string[];\n dependencies: string[];\n workingDirectory: string;\n package: string;\n task: string;\n}\n\n/**\n * The info command displays information about a target graph in a workspace.\n * The generated output can be read and used by other task runners, such as BuildXL.\n *\n * Expected format:\n * [\n * {\n * \"id\": \"bar##build\",\n * \"package\": \"bar\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/bar\",\n * \"dependencies\": []\n * },\n * {\n * \"id\": \"foo##build\",\n * \"package\": \"foo\",\n * \"task\": \"build\",\n * \"command\": \"npm run build --blah\",\n * \"workingDirectory\": \"packages/foo\",\n * \"dependencies\": [\n * \"bar##build\"\n * ]\n * },\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 });\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 const optimizedTargets = await optimizeTargetGraph(targetGraph, runnerPicker);\n const binPaths = getBinPaths();\n const packageTasks = optimizedTargets.map((target) => generatePackageTask(target, taskArgs, config, options, binPaths, packageInfos));\n\n logger.info(\"info\", {\n command: command.args,\n scope,\n packageTasks,\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): PackageTask {\n const command = generateCommand(target, taskArgs, config, options, binPaths, packageInfos);\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 };\n\n return packageTask;\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) {\n const shouldRunWorkersAsService =\n (typeof process.env.LAGE_WORKER_SERVER === \"string\" && process.env.LAGE_WORKER_SERVER !== \"false\") || !!options.server;\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) {\n const { host, port } = parseServerOption(options.server);\n const command = [binPaths[\"lage\"], \"exec\", \"--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","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","pickerOptions","runnerPickerOptions","nodeArg","npmClient","runnerPicker","TargetRunnerPicker","optimizedTargets","optimizeTargetGraph","binPaths","getBinPaths","packageTasks","map","target","generatePackageTask","info","generateCommand","workingDirectory","getWorkingDirectory","packageTask","id","package","packageName","task","shouldRunWorkersAsService","env","LAGE_WORKER_SERVER","type","script","undefined","scripts","startsWith","parsed","parse","length","every","entry","getNpmArgs","host","port","parseServerOption","concurrency","push","toString","lage","path","relative","replace","taskTargs","extraArgs"],"mappings":"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"}
|
|
@@ -9,7 +9,23 @@ Object.defineProperty(exports, "createTargetGraph", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
const _targetgraph = require("@lage-run/target-graph");
|
|
12
|
+
const _workspacetools = require("workspace-tools");
|
|
12
13
|
const _getFilteredPackages = require("../../filter/getFilteredPackages.js");
|
|
14
|
+
const _hasRepoChanged = require("../../filter/hasRepoChanged.js");
|
|
15
|
+
function getChangedFiles(since, cwd) {
|
|
16
|
+
const targetBranch = since || (0, _workspacetools.getDefaultRemoteBranch)({
|
|
17
|
+
cwd
|
|
18
|
+
});
|
|
19
|
+
const changes = [
|
|
20
|
+
...new Set([
|
|
21
|
+
...(0, _workspacetools.getUntrackedChanges)(cwd) || [],
|
|
22
|
+
...(0, _workspacetools.getUnstagedChanges)(cwd) || [],
|
|
23
|
+
...(0, _workspacetools.getBranchChanges)(targetBranch, cwd) || [],
|
|
24
|
+
...(0, _workspacetools.getStagedChanges)(cwd) || []
|
|
25
|
+
])
|
|
26
|
+
];
|
|
27
|
+
return changes;
|
|
28
|
+
}
|
|
13
29
|
async function createTargetGraph(options) {
|
|
14
30
|
const { logger, root, dependencies, dependents, since, scope, repoWideChanges, ignore, pipeline, outputs, tasks, packageInfos } = options;
|
|
15
31
|
const builder = new _targetgraph.WorkspaceTargetGraphBuilder(root, packageInfos);
|
|
@@ -24,6 +40,14 @@ async function createTargetGraph(options) {
|
|
|
24
40
|
repoWideChanges,
|
|
25
41
|
sinceIgnoreGlobs: ignore
|
|
26
42
|
});
|
|
43
|
+
let changedFiles = [];
|
|
44
|
+
// TODO: enhancement would be for workspace-tools to implement a "getChangedPackageFromChangedFiles()" type function
|
|
45
|
+
// TODO: optimize this so that we don't double up the work to determine if repo has changed
|
|
46
|
+
if (since) {
|
|
47
|
+
if (!(0, _hasRepoChanged.hasRepoChanged)(since, root, repoWideChanges, logger)) {
|
|
48
|
+
changedFiles = getChangedFiles(since, root);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
27
51
|
for (const [id, definition] of Object.entries(pipeline)){
|
|
28
52
|
if (Array.isArray(definition)) {
|
|
29
53
|
builder.addTargetConfig(id, {
|
|
@@ -31,9 +55,9 @@ async function createTargetGraph(options) {
|
|
|
31
55
|
dependsOn: definition,
|
|
32
56
|
options: {},
|
|
33
57
|
outputs
|
|
34
|
-
});
|
|
58
|
+
}, changedFiles);
|
|
35
59
|
} else {
|
|
36
|
-
builder.addTargetConfig(id, definition);
|
|
60
|
+
builder.addTargetConfig(id, definition, changedFiles);
|
|
37
61
|
}
|
|
38
62
|
}
|
|
39
63
|
return await builder.build(tasks, packages);
|
|
@@ -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 { getFilteredPackages } from \"../../filter/getFilteredPackages.js\";\nimport type { PipelineDefinition } from \"@lage-run/config\";\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}\n\nexport async function createTargetGraph(options: CreateTargetGraphOptions) {\n const { logger, root, dependencies, dependents, since, scope, repoWideChanges, ignore, pipeline, outputs, tasks, packageInfos } = 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 for (const [id, definition] of Object.entries(pipeline)) {\n if (Array.isArray(definition)) {\n builder.addTargetConfig(id
|
|
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 } 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}\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 { logger, root, dependencies, dependents, since, scope, repoWideChanges, ignore, pipeline, outputs, tasks, packageInfos } = 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(pipeline)) {\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);\n}\n"],"names":["createTargetGraph","getChangedFiles","since","cwd","targetBranch","getDefaultRemoteBranch","changes","Set","getUntrackedChanges","getUnstagedChanges","getBranchChanges","getStagedChanges","options","logger","root","dependencies","dependents","scope","repoWideChanges","ignore","pipeline","outputs","tasks","packageInfos","builder","WorkspaceTargetGraphBuilder","packages","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","changedFiles","hasRepoChanged","id","definition","Object","entries","Array","isArray","addTargetConfig","cache","dependsOn","build"],"mappings":";;;;+BAsCsBA;;;eAAAA;;;6BArCsB;gCAEwE;qCAChF;gCAEL;AAiB/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,EAAEC,MAAM,EAAEC,IAAI,EAAEC,YAAY,EAAEC,UAAU,EAAEd,KAAK,EAAEe,KAAK,EAAEC,eAAe,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,KAAK,EAAEC,YAAY,EAAE,GAAGX;IAElI,MAAMY,UAAU,IAAIC,wCAA2B,CAACX,MAAMS;IAEtD,MAAMG,WAAWC,IAAAA,wCAAmB,EAAC;QACnCb;QACAD;QACAU;QACAK,qBAAqBb;QACrBc,mBAAmBb;QACnBd;QACAe;QACAC;QACAY,kBAAkBX;IACpB;IAEA,IAAIY,eAAyB,EAAE;IAE/B,oHAAoH;IACpH,2FAA2F;IAC3F,IAAI7B,OAAO;QACT,IAAI,CAAC8B,IAAAA,8BAAc,EAAC9B,OAAOY,MAAMI,iBAAiBL,SAAS;YACzDkB,eAAe9B,gBAAgBC,OAAOY;QACxC;IACF;IAEA,KAAK,MAAM,CAACmB,IAAIC,WAAW,IAAIC,OAAOC,OAAO,CAAChB,UAAW;QACvD,IAAIiB,MAAMC,OAAO,CAACJ,aAAa;YAC7BV,QAAQe,eAAe,CACrBN,IACA;gBACEO,OAAO;gBACPC,WAAWP;gBACXtB,SAAS,CAAC;gBACVS;YACF,GACAU;QAEJ,OAAO;YACLP,QAAQe,eAAe,CAACN,IAAIC,YAAYH;QAC1C;IACF;IAEA,OAAO,MAAMP,QAAQkB,KAAK,CAACpB,OAAOI;AACpC"}
|
|
@@ -19,6 +19,7 @@ const _logger = /*#__PURE__*/ _interop_require_default(require("@lage-run/logger
|
|
|
19
19
|
const _errors = require("../../types/errors.js");
|
|
20
20
|
const _createCacheProvider = require("../../cache/createCacheProvider.js");
|
|
21
21
|
const _runnerPickerOptions = require("../../runnerPickerOptions.js");
|
|
22
|
+
const _optimizeTargetGraph = require("../../optimizeTargetGraph.js");
|
|
22
23
|
function _interop_require_default(obj) {
|
|
23
24
|
return obj && obj.__esModule ? obj : {
|
|
24
25
|
default: obj
|
|
@@ -88,7 +89,14 @@ async function runAction(options, command) {
|
|
|
88
89
|
hasher,
|
|
89
90
|
workerIdleMemoryLimit: config.workerIdleMemoryLimit
|
|
90
91
|
});
|
|
91
|
-
const
|
|
92
|
+
const optimizedTargets = await (0, _optimizeTargetGraph.optimizeTargetGraph)(targetGraph, scheduler.runnerPicker);
|
|
93
|
+
const optimizedGraph = {
|
|
94
|
+
targets: new Map(optimizedTargets.map((target)=>[
|
|
95
|
+
target.id,
|
|
96
|
+
target
|
|
97
|
+
]))
|
|
98
|
+
};
|
|
99
|
+
const summary = await scheduler.run(root, optimizedGraph);
|
|
92
100
|
await scheduler.cleanup();
|
|
93
101
|
displaySummaryAndExit(summary, logger.reporters);
|
|
94
102
|
for (const reporter of reporters){
|
|
@@ -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\";\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 });\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 summary = await scheduler.run(root,
|
|
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 });\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);\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","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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"}
|
|
@@ -17,48 +17,7 @@ _export(exports, {
|
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
19
|
const _workspacetools = require("workspace-tools");
|
|
20
|
-
const
|
|
21
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
22
|
-
if (typeof WeakMap !== "function") return null;
|
|
23
|
-
var cacheBabelInterop = new WeakMap();
|
|
24
|
-
var cacheNodeInterop = new WeakMap();
|
|
25
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
26
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
27
|
-
})(nodeInterop);
|
|
28
|
-
}
|
|
29
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
30
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
31
|
-
return obj;
|
|
32
|
-
}
|
|
33
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
34
|
-
return {
|
|
35
|
-
default: obj
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
39
|
-
if (cache && cache.has(obj)) {
|
|
40
|
-
return cache.get(obj);
|
|
41
|
-
}
|
|
42
|
-
var newObj = {
|
|
43
|
-
__proto__: null
|
|
44
|
-
};
|
|
45
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
46
|
-
for(var key in obj){
|
|
47
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
48
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
49
|
-
if (desc && (desc.get || desc.set)) {
|
|
50
|
-
Object.defineProperty(newObj, key, desc);
|
|
51
|
-
} else {
|
|
52
|
-
newObj[key] = obj[key];
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
newObj.default = obj;
|
|
57
|
-
if (cache) {
|
|
58
|
-
cache.set(obj, newObj);
|
|
59
|
-
}
|
|
60
|
-
return newObj;
|
|
61
|
-
}
|
|
20
|
+
const _hasRepoChanged = require("./hasRepoChanged.js");
|
|
62
21
|
function getFilteredPackages(options) {
|
|
63
22
|
const { scope, since, sinceIgnoreGlobs, repoWideChanges, includeDependents, includeDependencies, logger, packageInfos, root } = options;
|
|
64
23
|
// If scoped is defined, get scoped packages
|
|
@@ -96,7 +55,7 @@ function getFilteredPackages(options) {
|
|
|
96
55
|
});
|
|
97
56
|
// If the defined repo-wide changes are detected the get all packages and append to the filtered packages.
|
|
98
57
|
// This alo ensures that the modified packages are always run first.
|
|
99
|
-
if (hasRepoChanged(since, root, repoWideChanges, logger)) {
|
|
58
|
+
if ((0, _hasRepoChanged.hasRepoChanged)(since, root, repoWideChanges, logger)) {
|
|
100
59
|
logger.verbose(`Repo-wide changes detected, running all packages. The following changed packages and their deps (if specified) will be run first: ${filteredPackages.join(",")}`);
|
|
101
60
|
filteredPackages = [
|
|
102
61
|
...new Set(filteredPackages.concat(Object.keys(packageInfos)))
|
|
@@ -108,28 +67,6 @@ function getFilteredPackages(options) {
|
|
|
108
67
|
return Object.keys(packageInfos);
|
|
109
68
|
}
|
|
110
69
|
}
|
|
111
|
-
function hasRepoChanged(since, root, environmentGlob, logger) {
|
|
112
|
-
try {
|
|
113
|
-
const changedFiles = (0, _workspacetools.getBranchChanges)(since, root);
|
|
114
|
-
const envFiles = _fastglob.sync(environmentGlob, {
|
|
115
|
-
cwd: root
|
|
116
|
-
});
|
|
117
|
-
let repoWideChanged = false;
|
|
118
|
-
if (changedFiles) {
|
|
119
|
-
for (const change of changedFiles){
|
|
120
|
-
if (envFiles.includes(change)) {
|
|
121
|
-
repoWideChanged = true;
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return repoWideChanged;
|
|
127
|
-
} catch (e) {
|
|
128
|
-
// if this fails, let's assume repo has changed
|
|
129
|
-
logger.warn(`An error in the git command has caused this to consider the repo has changed\n${e}`);
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
70
|
function filterPackages(options) {
|
|
134
71
|
const { scopedPackages, changedPackages, packageInfos, includeDependents, includeDependencies, logger } = options;
|
|
135
72
|
let filtered = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/filter/getFilteredPackages.ts"],"sourcesContent":["import type { PackageInfos } from \"workspace-tools\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/filter/getFilteredPackages.ts"],"sourcesContent":["import type { PackageInfos } from \"workspace-tools\";\nimport { getScopedPackages, getChangedPackages, getTransitiveDependents, getTransitiveDependencies } from \"workspace-tools\";\n\nimport type { Logger } from \"@lage-run/logger\";\nimport { hasRepoChanged } from \"./hasRepoChanged.js\";\n\nexport function getFilteredPackages(options: {\n root: string;\n packageInfos: PackageInfos;\n logger: Logger;\n scope: string[] | undefined;\n since: string | undefined;\n sinceIgnoreGlobs: string[] | undefined;\n repoWideChanges: string[];\n includeDependents: boolean;\n includeDependencies: boolean;\n}) {\n const { scope, since, sinceIgnoreGlobs, repoWideChanges, includeDependents, includeDependencies, logger, packageInfos, root } = options;\n\n // If scoped is defined, get scoped packages\n const hasScopes = Array.isArray(scope) && scope.length > 0;\n let scopedPackages: string[] | undefined = undefined;\n let filteredPackages: string[] | undefined = undefined;\n let changedPackages: string[] | undefined = undefined;\n const hasSince = typeof since !== \"undefined\";\n\n // If scope is defined, get scoped packages and return\n if (hasScopes) {\n scopedPackages = getScopedPackages(scope!, packageInfos);\n // return filteredPackages;\n return filterPackages({\n logger,\n packageInfos,\n scopedPackages,\n changedPackages,\n includeDependencies,\n includeDependents,\n });\n }\n // If since is defined, get changed packages.\n else if (hasSince) {\n try {\n changedPackages = getChangedPackages(root, since, sinceIgnoreGlobs);\n } catch (e) {\n logger.warn(`An error in the git command has caused this scope run to include every package\\n${e}`);\n // if getChangedPackages throws, we will assume all have changed (using changedPackage = undefined)\n }\n filteredPackages = filterPackages({\n logger,\n packageInfos,\n scopedPackages,\n changedPackages,\n includeDependencies,\n includeDependents,\n });\n\n // If the defined repo-wide changes are detected the get all packages and append to the filtered packages.\n // This alo ensures that the modified packages are always run first.\n if (hasRepoChanged(since, root, repoWideChanges, logger)) {\n logger.verbose(\n `Repo-wide changes detected, running all packages. The following changed packages and their deps (if specified) will be run first: ${filteredPackages.join(\n \",\"\n )}`\n );\n filteredPackages = [...new Set(filteredPackages.concat(Object.keys(packageInfos)))];\n }\n return filteredPackages;\n } else {\n // If neither scope or since is defined, return all packages\n return Object.keys(packageInfos);\n }\n}\n\nexport function filterPackages(options: {\n logger: Logger;\n packageInfos: PackageInfos;\n includeDependents: boolean;\n includeDependencies: boolean;\n scopedPackages: string[] | undefined;\n changedPackages: string[] | undefined;\n}) {\n const { scopedPackages, changedPackages, packageInfos, includeDependents, includeDependencies, logger } = options;\n\n let filtered: string[] = [];\n\n // If scope is defined, use the transitive providers of the since packages up to the scope\n if (typeof scopedPackages !== \"undefined\" && typeof changedPackages !== \"undefined\") {\n // If both scoped and since are specified, we have to merge two lists:\n // 1. changed packages that ARE themselves the scoped packages\n // 2. changed package consumers (package dependents) that are within the scoped subgraph\n filtered = changedPackages\n .filter((pkg) => scopedPackages.includes(pkg))\n .concat(getTransitiveDependents(changedPackages, packageInfos, scopedPackages));\n\n logger.verbose(`filterPackages changed within scope: ${filtered.join(\",\")}`);\n } else if (typeof changedPackages !== \"undefined\") {\n filtered = [...changedPackages];\n logger.verbose(`filterPackages changed: ${changedPackages.join(\",\")}`);\n } else if (typeof scopedPackages !== \"undefined\") {\n filtered = [...scopedPackages];\n logger.verbose(`filterPackages scope: ${scopedPackages.join(\",\")}`);\n } else {\n filtered = Object.keys(packageInfos);\n }\n\n // adds dependents (consumers) of all filtered package thus far\n if (includeDependents) {\n logger.verbose(`filterPackages running with dependents`);\n filtered = filtered.concat(getTransitiveDependents(filtered, packageInfos));\n }\n\n // adds dependencies of all filtered package thus far\n if (includeDependencies) {\n logger.verbose(`filterPackages running with dependencies`);\n filtered = filtered.concat(getTransitiveDependencies(filtered, packageInfos));\n }\n\n const unique = new Set(filtered);\n\n return [...unique];\n}\n"],"names":["filterPackages","getFilteredPackages","options","scope","since","sinceIgnoreGlobs","repoWideChanges","includeDependents","includeDependencies","logger","packageInfos","root","hasScopes","Array","isArray","length","scopedPackages","undefined","filteredPackages","changedPackages","hasSince","getScopedPackages","getChangedPackages","e","warn","hasRepoChanged","verbose","join","Set","concat","Object","keys","filtered","filter","pkg","includes","getTransitiveDependents","getTransitiveDependencies","unique"],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "hasRepoChanged", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return hasRepoChanged;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _workspacetools = require("workspace-tools");
|
|
12
|
+
const _fastglob = /*#__PURE__*/ _interop_require_wildcard(require("fast-glob"));
|
|
13
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
14
|
+
if (typeof WeakMap !== "function") return null;
|
|
15
|
+
var cacheBabelInterop = new WeakMap();
|
|
16
|
+
var cacheNodeInterop = new WeakMap();
|
|
17
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
18
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
19
|
+
})(nodeInterop);
|
|
20
|
+
}
|
|
21
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
22
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
23
|
+
return obj;
|
|
24
|
+
}
|
|
25
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
26
|
+
return {
|
|
27
|
+
default: obj
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
31
|
+
if (cache && cache.has(obj)) {
|
|
32
|
+
return cache.get(obj);
|
|
33
|
+
}
|
|
34
|
+
var newObj = {
|
|
35
|
+
__proto__: null
|
|
36
|
+
};
|
|
37
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
38
|
+
for(var key in obj){
|
|
39
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
40
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
41
|
+
if (desc && (desc.get || desc.set)) {
|
|
42
|
+
Object.defineProperty(newObj, key, desc);
|
|
43
|
+
} else {
|
|
44
|
+
newObj[key] = obj[key];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
newObj.default = obj;
|
|
49
|
+
if (cache) {
|
|
50
|
+
cache.set(obj, newObj);
|
|
51
|
+
}
|
|
52
|
+
return newObj;
|
|
53
|
+
}
|
|
54
|
+
function hasRepoChanged(since, root, environmentGlob, logger) {
|
|
55
|
+
try {
|
|
56
|
+
const changedFiles = (0, _workspacetools.getBranchChanges)(since, root);
|
|
57
|
+
const envFiles = _fastglob.sync(environmentGlob, {
|
|
58
|
+
cwd: root
|
|
59
|
+
});
|
|
60
|
+
let repoWideChanged = false;
|
|
61
|
+
if (changedFiles) {
|
|
62
|
+
for (const change of changedFiles){
|
|
63
|
+
if (envFiles.includes(change)) {
|
|
64
|
+
repoWideChanged = true;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return repoWideChanged;
|
|
70
|
+
} catch (e) {
|
|
71
|
+
// if this fails, let's assume repo has changed
|
|
72
|
+
logger.warn(`An error in the git command has caused this to consider the repo has changed\n${e}`);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/filter/hasRepoChanged.ts"],"sourcesContent":["import { getBranchChanges } from \"workspace-tools\";\nimport * as fg from \"fast-glob\";\nimport type { Logger } from \"@lage-run/logger\";\n\nexport function hasRepoChanged(since: string, root: string, environmentGlob: string[], logger: Logger) {\n try {\n const changedFiles = getBranchChanges(since, root);\n const envFiles = fg.sync(environmentGlob, { cwd: root });\n let repoWideChanged = false;\n\n if (changedFiles) {\n for (const change of changedFiles) {\n if (envFiles.includes(change)) {\n repoWideChanged = true;\n break;\n }\n }\n }\n\n return repoWideChanged;\n } catch (e) {\n // if this fails, let's assume repo has changed\n logger.warn(`An error in the git command has caused this to consider the repo has changed\\n${e}`);\n return true;\n }\n}\n"],"names":["hasRepoChanged","since","root","environmentGlob","logger","changedFiles","getBranchChanges","envFiles","fg","sync","cwd","repoWideChanged","change","includes","e","warn"],"mappings":";;;;+BAIgBA;;;eAAAA;;;gCAJiB;kEACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGb,SAASA,eAAeC,KAAa,EAAEC,IAAY,EAAEC,eAAyB,EAAEC,MAAc;IACnG,IAAI;QACF,MAAMC,eAAeC,IAAAA,gCAAgB,EAACL,OAAOC;QAC7C,MAAMK,WAAWC,UAAGC,IAAI,CAACN,iBAAiB;YAAEO,KAAKR;QAAK;QACtD,IAAIS,kBAAkB;QAEtB,IAAIN,cAAc;YAChB,KAAK,MAAMO,UAAUP,aAAc;gBACjC,IAAIE,SAASM,QAAQ,CAACD,SAAS;oBAC7BD,kBAAkB;oBAClB;gBACF;YACF;QACF;QAEA,OAAOA;IACT,EAAE,OAAOG,GAAG;QACV,+CAA+C;QAC/CV,OAAOW,IAAI,CAAC,CAAC,8EAA8E,EAAED,GAAG;QAChG,OAAO;IACT;AACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "optimizeTargetGraph", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return optimizeTargetGraph;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _targetgraph = require("@lage-run/target-graph");
|
|
12
|
+
async function optimizeTargetGraph(graph, runnerPicker) {
|
|
13
|
+
const targetMinimizedNodes = await (0, _targetgraph.removeNodes)([
|
|
14
|
+
...graph.targets.values()
|
|
15
|
+
], async (target)=>{
|
|
16
|
+
if (target.type === "noop") {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
if (target.id === (0, _targetgraph.getStartTargetId)()) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const runner = await runnerPicker.pick(target);
|
|
23
|
+
if (await runner.shouldRun(target)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
});
|
|
28
|
+
const reduced = (0, _targetgraph.transitiveReduction)(targetMinimizedNodes);
|
|
29
|
+
// Update the dependents of nodes based on the new set of dependencies
|
|
30
|
+
// first build up a dependency map for quick lookup
|
|
31
|
+
const dependencyMap = new Map();
|
|
32
|
+
for (const node of reduced){
|
|
33
|
+
for (const depId of node.dependencies){
|
|
34
|
+
if (!dependencyMap.has(depId)) {
|
|
35
|
+
dependencyMap.set(depId, new Set());
|
|
36
|
+
}
|
|
37
|
+
dependencyMap.get(depId).add(node.id);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// update the dependents of each node
|
|
41
|
+
for (const node of reduced){
|
|
42
|
+
const dependents = new Set();
|
|
43
|
+
if (dependencyMap.has(node.id)) {
|
|
44
|
+
dependencyMap.get(node.id).forEach((dependentId)=>dependents.add(dependentId));
|
|
45
|
+
}
|
|
46
|
+
node.dependents = Array.from(dependents);
|
|
47
|
+
}
|
|
48
|
+
return reduced;
|
|
49
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/optimizeTargetGraph.ts"],"sourcesContent":["import type { TargetRunnerPicker } from \"@lage-run/runners\";\nimport { type TargetGraph, removeNodes, transitiveReduction, getStartTargetId } from \"@lage-run/target-graph\";\n\nexport async function optimizeTargetGraph(graph: TargetGraph, runnerPicker: TargetRunnerPicker) {\n const targetMinimizedNodes = await removeNodes([...graph.targets.values()], async (target) => {\n if (target.type === \"noop\") {\n return true;\n }\n\n if (target.id === getStartTargetId()) {\n return false;\n }\n\n const runner = await runnerPicker.pick(target);\n if (await runner.shouldRun(target)) {\n return false;\n }\n\n return true;\n });\n\n const reduced = transitiveReduction(targetMinimizedNodes);\n\n // Update the dependents of nodes based on the new set of dependencies\n // first build up a dependency map for quick lookup\n const dependencyMap = new Map<string, Set<string>>();\n for (const node of reduced) {\n for (const depId of node.dependencies) {\n if (!dependencyMap.has(depId)) {\n dependencyMap.set(depId, new Set<string>());\n }\n dependencyMap.get(depId)!.add(node.id);\n }\n }\n\n // update the dependents of each node\n for (const node of reduced) {\n const dependents = new Set<string>();\n if (dependencyMap.has(node.id)) {\n dependencyMap.get(node.id)!.forEach((dependentId) => dependents.add(dependentId));\n }\n\n node.dependents = Array.from(dependents);\n }\n\n return reduced;\n}\n"],"names":["optimizeTargetGraph","graph","runnerPicker","targetMinimizedNodes","removeNodes","targets","values","target","type","id","getStartTargetId","runner","pick","shouldRun","reduced","transitiveReduction","dependencyMap","Map","node","depId","dependencies","has","set","Set","get","add","dependents","forEach","dependentId","Array","from"],"mappings":";;;;+BAGsBA;;;eAAAA;;;6BAF+D;AAE9E,eAAeA,oBAAoBC,KAAkB,EAAEC,YAAgC;IAC5F,MAAMC,uBAAuB,MAAMC,IAAAA,wBAAW,EAAC;WAAIH,MAAMI,OAAO,CAACC,MAAM;KAAG,EAAE,OAAOC;QACjF,IAAIA,OAAOC,IAAI,KAAK,QAAQ;YAC1B,OAAO;QACT;QAEA,IAAID,OAAOE,EAAE,KAAKC,IAAAA,6BAAgB,KAAI;YACpC,OAAO;QACT;QAEA,MAAMC,SAAS,MAAMT,aAAaU,IAAI,CAACL;QACvC,IAAI,MAAMI,OAAOE,SAAS,CAACN,SAAS;YAClC,OAAO;QACT;QAEA,OAAO;IACT;IAEA,MAAMO,UAAUC,IAAAA,gCAAmB,EAACZ;IAEpC,sEAAsE;IACtE,mDAAmD;IACnD,MAAMa,gBAAgB,IAAIC;IAC1B,KAAK,MAAMC,QAAQJ,QAAS;QAC1B,KAAK,MAAMK,SAASD,KAAKE,YAAY,CAAE;YACrC,IAAI,CAACJ,cAAcK,GAAG,CAACF,QAAQ;gBAC7BH,cAAcM,GAAG,CAACH,OAAO,IAAII;YAC/B;YACAP,cAAcQ,GAAG,CAACL,OAAQM,GAAG,CAACP,KAAKT,EAAE;QACvC;IACF;IAEA,qCAAqC;IACrC,KAAK,MAAMS,QAAQJ,QAAS;QAC1B,MAAMY,aAAa,IAAIH;QACvB,IAAIP,cAAcK,GAAG,CAACH,KAAKT,EAAE,GAAG;YAC9BO,cAAcQ,GAAG,CAACN,KAAKT,EAAE,EAAGkB,OAAO,CAAC,CAACC,cAAgBF,WAAWD,GAAG,CAACG;QACtE;QAEAV,KAAKQ,UAAU,GAAGG,MAAMC,IAAI,CAACJ;IAC/B;IAEA,OAAOZ;AACT"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lage-run/cli",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.4",
|
|
4
4
|
"description": "Command Line Interface for Lage",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -21,17 +21,17 @@
|
|
|
21
21
|
"lint": "monorepo-scripts lint"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@lage-run/cache": "^1.3.
|
|
25
|
-
"@lage-run/config": "^0.4.
|
|
24
|
+
"@lage-run/cache": "^1.3.10",
|
|
25
|
+
"@lage-run/config": "^0.4.11",
|
|
26
26
|
"@lage-run/globby": "^14.2.0",
|
|
27
|
-
"@lage-run/hasher": "^1.6.
|
|
27
|
+
"@lage-run/hasher": "^1.6.7",
|
|
28
28
|
"@lage-run/logger": "^1.3.1",
|
|
29
|
-
"@lage-run/reporters": "^1.2.
|
|
29
|
+
"@lage-run/reporters": "^1.2.18",
|
|
30
30
|
"@lage-run/rpc": "^1.2.3",
|
|
31
|
-
"@lage-run/runners": "^1.
|
|
32
|
-
"@lage-run/scheduler": "^1.
|
|
33
|
-
"@lage-run/scheduler-types": "^0.3.
|
|
34
|
-
"@lage-run/target-graph": "^0.
|
|
31
|
+
"@lage-run/runners": "^1.2.0",
|
|
32
|
+
"@lage-run/scheduler": "^1.4.0",
|
|
33
|
+
"@lage-run/scheduler-types": "^0.3.22",
|
|
34
|
+
"@lage-run/target-graph": "^0.11.0",
|
|
35
35
|
"@lage-run/worker-threads-pool": "^0.8.4",
|
|
36
36
|
"chokidar": "3.5.3",
|
|
37
37
|
"commander": "9.5.0",
|