@lage-run/cli 0.25.3 → 0.25.5
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 +11 -5
- package/CHANGELOG.md +5 -4
- package/lib/commands/exec/simulateFileAccess.js +12 -4
- package/lib/commands/exec/simulateFileAccess.js.map +1 -1
- package/lib/commands/server/action.js +1 -1
- package/lib/commands/server/action.js.map +1 -1
- package/lib/commands/server/lageService.d.ts +1 -1
- package/lib/commands/server/lageService.js +50 -13
- package/lib/commands/server/lageService.js.map +1 -1
- package/package.json +2 -2
- package/lib/commands/server/getTransitiveTargetInputs.d.ts +0 -4
- package/lib/commands/server/getTransitiveTargetInputs.js +0 -38
- package/lib/commands/server/getTransitiveTargetInputs.js.map +0 -1
package/CHANGELOG.json
CHANGED
|
@@ -2,21 +2,27 @@
|
|
|
2
2
|
"name": "@lage-run/cli",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "
|
|
6
|
-
"version": "0.25.
|
|
7
|
-
"tag": "@lage-run/cli_v0.25.
|
|
5
|
+
"date": "Mon, 10 Feb 2025 00:22:13 GMT",
|
|
6
|
+
"version": "0.25.5",
|
|
7
|
+
"tag": "@lage-run/cli_v0.25.5",
|
|
8
8
|
"comments": {
|
|
9
9
|
"patch": [
|
|
10
10
|
{
|
|
11
11
|
"author": "kchau@microsoft.com",
|
|
12
12
|
"package": "@lage-run/cli",
|
|
13
|
-
"commit": "
|
|
13
|
+
"commit": "8a6b737e047d90594e524bcce458d2ed3cac74e4",
|
|
14
14
|
"comment": "tracks the transitive inputs rather just one level deep"
|
|
15
15
|
},
|
|
16
|
+
{
|
|
17
|
+
"author": "kchau@microsoft.com",
|
|
18
|
+
"package": "@lage-run/cli",
|
|
19
|
+
"commit": "8a6b737e047d90594e524bcce458d2ed3cac74e4",
|
|
20
|
+
"comment": "simulate transitives by doing our own hashing"
|
|
21
|
+
},
|
|
16
22
|
{
|
|
17
23
|
"author": "beachball",
|
|
18
24
|
"package": "@lage-run/cli",
|
|
19
|
-
"comment": "Bump @lage-run/rpc to v1.2.
|
|
25
|
+
"comment": "Bump @lage-run/rpc to v1.2.6",
|
|
20
26
|
"commit": "not available"
|
|
21
27
|
}
|
|
22
28
|
]
|
package/CHANGELOG.md
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
# Change Log - @lage-run/cli
|
|
2
2
|
|
|
3
|
-
<!-- This log was last generated on
|
|
3
|
+
<!-- This log was last generated on Mon, 10 Feb 2025 00:22:13 GMT and should not be manually modified. -->
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
-
## 0.25.
|
|
7
|
+
## 0.25.5
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Mon, 10 Feb 2025 00:22:13 GMT
|
|
10
10
|
|
|
11
11
|
### Patches
|
|
12
12
|
|
|
13
13
|
- tracks the transitive inputs rather just one level deep (kchau@microsoft.com)
|
|
14
|
-
-
|
|
14
|
+
- simulate transitives by doing our own hashing (kchau@microsoft.com)
|
|
15
|
+
- Bump @lage-run/rpc to v1.2.6
|
|
15
16
|
|
|
16
17
|
## 0.25.2
|
|
17
18
|
|
|
@@ -23,13 +23,21 @@ async function simulateFileAccess(logger, inputs, outputs) {
|
|
|
23
23
|
// probe input files
|
|
24
24
|
let fd;
|
|
25
25
|
for (const input of inputs){
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
try {
|
|
27
|
+
fd = _fs.default.openSync(_path.default.join(root, input), "r");
|
|
28
|
+
_fs.default.closeSync(fd);
|
|
29
|
+
} catch (e) {
|
|
30
|
+
// ignore
|
|
31
|
+
}
|
|
28
32
|
inputDirectories.add(_path.default.dirname(input));
|
|
29
33
|
}
|
|
30
34
|
for (const directory of inputDirectories){
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
try {
|
|
36
|
+
fd = _fs.default.openSync(_path.default.join(root, directory), "r");
|
|
37
|
+
_fs.default.closeSync(fd);
|
|
38
|
+
} catch (e) {
|
|
39
|
+
// ignore
|
|
40
|
+
}
|
|
33
41
|
}
|
|
34
42
|
// touch output files
|
|
35
43
|
const time = new Date();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/exec/simulateFileAccess.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { getWorkspaceRoot } from \"workspace-tools\";\n\nexport async function simulateFileAccess(logger: Logger, inputs: string[], outputs: string[]) {\n const root = getWorkspaceRoot(process.cwd())!;\n logger.silly(\"Now probing and touching inputs and outputs\");\n\n const inputDirectories = new Set<string>();\n\n // probe input files\n let fd: number;\n for (const input of inputs) {\n fd = fs.openSync(path.join(root, input), \"r\");\n
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/exec/simulateFileAccess.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { getWorkspaceRoot } from \"workspace-tools\";\n\nexport async function simulateFileAccess(logger: Logger, inputs: string[], outputs: string[]) {\n const root = getWorkspaceRoot(process.cwd())!;\n logger.silly(\"Now probing and touching inputs and outputs\");\n\n const inputDirectories = new Set<string>();\n\n // probe input files\n let fd: number;\n for (const input of inputs) {\n try {\n fd = fs.openSync(path.join(root, input), \"r\");\n fs.closeSync(fd);\n } catch (e) {\n // ignore\n }\n\n inputDirectories.add(path.dirname(input));\n }\n\n for (const directory of inputDirectories) {\n try {\n fd = fs.openSync(path.join(root, directory), \"r\");\n fs.closeSync(fd);\n } catch (e) {\n // ignore\n }\n }\n\n // touch output files\n const time = new Date();\n const outputDirectories = new Set<string>();\n for (const output of outputs) {\n outputDirectories.add(path.dirname(output));\n\n try {\n fs.utimesSync(path.join(root, output), time, time);\n } catch (e) {\n // ignore\n }\n }\n\n for (const directory of outputDirectories) {\n try {\n fs.utimesSync(path.join(root, directory), time, time);\n } catch (e) {\n // ignore\n }\n }\n}\n"],"names":["simulateFileAccess","logger","inputs","outputs","root","getWorkspaceRoot","process","cwd","silly","inputDirectories","Set","fd","input","fs","openSync","path","join","closeSync","e","add","dirname","directory","time","Date","outputDirectories","output","utimesSync"],"mappings":";;;;+BAKsBA;;;eAAAA;;;6DAJL;2DACF;gCACkB;;;;;;AAE1B,eAAeA,mBAAmBC,MAAc,EAAEC,MAAgB,EAAEC,OAAiB;IAC1F,MAAMC,OAAOC,IAAAA,gCAAgB,EAACC,QAAQC,GAAG;IACzCN,OAAOO,KAAK,CAAC;IAEb,MAAMC,mBAAmB,IAAIC;IAE7B,oBAAoB;IACpB,IAAIC;IACJ,KAAK,MAAMC,SAASV,OAAQ;QAC1B,IAAI;YACFS,KAAKE,WAAE,CAACC,QAAQ,CAACC,aAAI,CAACC,IAAI,CAACZ,MAAMQ,QAAQ;YACzCC,WAAE,CAACI,SAAS,CAACN;QACf,EAAE,OAAOO,GAAG;QACV,SAAS;QACX;QAEAT,iBAAiBU,GAAG,CAACJ,aAAI,CAACK,OAAO,CAACR;IACpC;IAEA,KAAK,MAAMS,aAAaZ,iBAAkB;QACxC,IAAI;YACFE,KAAKE,WAAE,CAACC,QAAQ,CAACC,aAAI,CAACC,IAAI,CAACZ,MAAMiB,YAAY;YAC7CR,WAAE,CAACI,SAAS,CAACN;QACf,EAAE,OAAOO,GAAG;QACV,SAAS;QACX;IACF;IAEA,qBAAqB;IACrB,MAAMI,OAAO,IAAIC;IACjB,MAAMC,oBAAoB,IAAId;IAC9B,KAAK,MAAMe,UAAUtB,QAAS;QAC5BqB,kBAAkBL,GAAG,CAACJ,aAAI,CAACK,OAAO,CAACK;QAEnC,IAAI;YACFZ,WAAE,CAACa,UAAU,CAACX,aAAI,CAACC,IAAI,CAACZ,MAAMqB,SAASH,MAAMA;QAC/C,EAAE,OAAOJ,GAAG;QACV,SAAS;QACX;IACF;IAEA,KAAK,MAAMG,aAAaG,kBAAmB;QACzC,IAAI;YACFX,WAAE,CAACa,UAAU,CAACX,aAAI,CAACC,IAAI,CAACZ,MAAMiB,YAAYC,MAAMA;QAClD,EAAE,OAAOJ,GAAG;QACV,SAAS;QACX;IACF;AACF"}
|
|
@@ -32,7 +32,7 @@ async function serverAction(options) {
|
|
|
32
32
|
cwd: process.cwd(),
|
|
33
33
|
serverControls: {
|
|
34
34
|
abortController,
|
|
35
|
-
countdownToShutdown: ()=>resetTimer(logger, timeout, abortController,
|
|
35
|
+
countdownToShutdown: ()=>resetTimer(logger, timeout, abortController, lageServer),
|
|
36
36
|
clearCountdown: clearTimer
|
|
37
37
|
},
|
|
38
38
|
logger,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/server/action.ts"],"sourcesContent":["import createLogger, { type Logger } from \"@lage-run/logger\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { createLageService } from \"./lageService.js\";\nimport { createServer } from \"@lage-run/rpc\";\nimport { parseServerOption } from \"../parseServerOption.js\";\n\ninterface WorkerOptions extends ReporterInitOptions {\n nodeArg?: string[];\n server?: string;\n timeout?: number;\n shutdown: boolean;\n tasks: string[];\n}\n\nexport async function serverAction(options: WorkerOptions) {\n const { server = \"localhost:5332\", timeout = 1, tasks } = options;\n\n const { host, port } = parseServerOption(server);\n\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.logFile = options.logFile ?? \"node_modules/.cache/lage/server.log\";\n options.reporter = options.reporter ?? \"verboseFileLog\";\n initializeReporters(logger, options);\n\n logger.info(`Starting server on http://${host}:${port}`);\n\n const abortController = new AbortController();\n\n const lageService = await createLageService({\n cwd: process.cwd(),\n serverControls: {\n abortController,\n countdownToShutdown: () => resetTimer(logger, timeout, abortController,
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/server/action.ts"],"sourcesContent":["import createLogger, { type Logger } from \"@lage-run/logger\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport { createLageService } from \"./lageService.js\";\nimport { createServer } from \"@lage-run/rpc\";\nimport { parseServerOption } from \"../parseServerOption.js\";\n\ninterface WorkerOptions extends ReporterInitOptions {\n nodeArg?: string[];\n server?: string;\n timeout?: number;\n shutdown: boolean;\n tasks: string[];\n}\n\nexport async function serverAction(options: WorkerOptions) {\n const { server = \"localhost:5332\", timeout = 1, tasks } = options;\n\n const { host, port } = parseServerOption(server);\n\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.logFile = options.logFile ?? \"node_modules/.cache/lage/server.log\";\n options.reporter = options.reporter ?? \"verboseFileLog\";\n initializeReporters(logger, options);\n\n logger.info(`Starting server on http://${host}:${port}`);\n\n const abortController = new AbortController();\n\n const lageService = await createLageService({\n cwd: process.cwd(),\n serverControls: {\n abortController,\n countdownToShutdown: () => resetTimer(logger, timeout, abortController, lageServer),\n clearCountdown: clearTimer,\n },\n logger,\n concurrency: options.concurrency,\n tasks,\n });\n const lageServer = await createServer(lageService, abortController);\n\n await lageServer.listen({ host, port });\n logger.info(`Server listening on http://${host}:${port}, timeout in ${timeout} seconds`);\n}\n\nlet timeoutHandle: NodeJS.Timeout | undefined;\nfunction resetTimer(logger: Logger, timeout: number, abortController: AbortController, server: any) {\n clearTimer();\n\n timeoutHandle = globalThis.setTimeout(() => {\n logger.info(`Server timed out after ${timeout} seconds`);\n abortController.abort();\n server.close();\n }, timeout * 1000);\n}\n\nfunction clearTimer() {\n if (timeoutHandle) {\n globalThis.clearTimeout(timeoutHandle);\n }\n}\n"],"names":["serverAction","options","server","timeout","tasks","host","port","parseServerOption","logger","createLogger","logLevel","logFile","reporter","initializeReporters","info","abortController","AbortController","lageService","createLageService","cwd","process","serverControls","countdownToShutdown","resetTimer","lageServer","clearCountdown","clearTimer","concurrency","createServer","listen","timeoutHandle","globalThis","setTimeout","abort","close","clearTimeout"],"mappings":";;;;+BAesBA;;;eAAAA;;;+DAfoB;qCAEN;6BACF;qBACL;mCACK;;;;;;AAU3B,eAAeA,aAAaC,OAAsB;IACvD,MAAM,EAAEC,SAAS,gBAAgB,EAAEC,UAAU,CAAC,EAAEC,KAAK,EAAE,GAAGH;IAE1D,MAAM,EAAEI,IAAI,EAAEC,IAAI,EAAE,GAAGC,IAAAA,oCAAiB,EAACL;IAEzC,MAAMM,SAASC,IAAAA,eAAY;IAC3BR,QAAQS,QAAQ,GAAGT,QAAQS,QAAQ,IAAI;IACvCT,QAAQU,OAAO,GAAGV,QAAQU,OAAO,IAAI;IACrCV,QAAQW,QAAQ,GAAGX,QAAQW,QAAQ,IAAI;IACvCC,IAAAA,wCAAmB,EAACL,QAAQP;IAE5BO,OAAOM,IAAI,CAAC,CAAC,0BAA0B,EAAET,KAAK,CAAC,EAAEC,MAAM;IAEvD,MAAMS,kBAAkB,IAAIC;IAE5B,MAAMC,cAAc,MAAMC,IAAAA,8BAAiB,EAAC;QAC1CC,KAAKC,QAAQD,GAAG;QAChBE,gBAAgB;YACdN;YACAO,qBAAqB,IAAMC,WAAWf,QAAQL,SAASY,iBAAiBS;YACxEC,gBAAgBC;QAClB;QACAlB;QACAmB,aAAa1B,QAAQ0B,WAAW;QAChCvB;IACF;IACA,MAAMoB,aAAa,MAAMI,IAAAA,iBAAY,EAACX,aAAaF;IAEnD,MAAMS,WAAWK,MAAM,CAAC;QAAExB;QAAMC;IAAK;IACrCE,OAAOM,IAAI,CAAC,CAAC,2BAA2B,EAAET,KAAK,CAAC,EAAEC,KAAK,aAAa,EAAEH,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAI2B;AACJ,SAASP,WAAWf,MAAc,EAAEL,OAAe,EAAEY,eAAgC,EAAEb,MAAW;IAChGwB;IAEAI,gBAAgBC,WAAWC,UAAU,CAAC;QACpCxB,OAAOM,IAAI,CAAC,CAAC,uBAAuB,EAAEX,QAAQ,QAAQ,CAAC;QACvDY,gBAAgBkB,KAAK;QACrB/B,OAAOgC,KAAK;IACd,GAAG/B,UAAU;AACf;AAEA,SAASuB;IACP,IAAII,eAAe;QACjBC,WAAWI,YAAY,CAACL;IAC1B;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import type { Logger } from "@lage-run/logger";
|
|
3
|
-
import type
|
|
3
|
+
import { type ILageService } from "@lage-run/rpc";
|
|
4
4
|
interface ServiceControls {
|
|
5
5
|
abortController: AbortController;
|
|
6
6
|
countdownToShutdown: () => void;
|
|
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "createLageService", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
const _config = require("@lage-run/config");
|
|
12
|
+
const _rpc = require("@lage-run/rpc");
|
|
12
13
|
const _targetgraph = require("@lage-run/target-graph");
|
|
13
14
|
const _workspacetools = require("workspace-tools");
|
|
14
15
|
const _createTargetGraph = require("../run/createTargetGraph.js");
|
|
@@ -20,7 +21,13 @@ const _MemoryStream = require("./MemoryStream.js");
|
|
|
20
21
|
const _runnerPickerOptions = require("../../runnerPickerOptions.js");
|
|
21
22
|
const _filterPipelineDefinitions = require("../run/filterPipelineDefinitions.js");
|
|
22
23
|
const _formathrtime = require("@lage-run/format-hrtime");
|
|
23
|
-
const
|
|
24
|
+
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
25
|
+
const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
26
|
+
function _interop_require_default(obj) {
|
|
27
|
+
return obj && obj.__esModule ? obj : {
|
|
28
|
+
default: obj
|
|
29
|
+
};
|
|
30
|
+
}
|
|
24
31
|
let initializedPromise;
|
|
25
32
|
function formatBytes(bytes) {
|
|
26
33
|
return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
|
|
@@ -35,6 +42,7 @@ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg,
|
|
|
35
42
|
logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(", ")}`);
|
|
36
43
|
const { pipeline } = config;
|
|
37
44
|
const packageInfos = (0, _workspacetools.getPackageInfos)(root);
|
|
45
|
+
logger.info("Initializing target graph");
|
|
38
46
|
const targetGraph = await (0, _createTargetGraph.createTargetGraph)({
|
|
39
47
|
logger,
|
|
40
48
|
root,
|
|
@@ -50,17 +58,18 @@ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg,
|
|
|
50
58
|
packageInfos,
|
|
51
59
|
priorities: config.priorities
|
|
52
60
|
});
|
|
53
|
-
const
|
|
54
|
-
withDevDependencies: true,
|
|
55
|
-
withPeerDependencies: false
|
|
56
|
-
});
|
|
57
|
-
const packageTree = new _hasher.PackageTree({
|
|
61
|
+
const targetHasher = new _hasher.TargetHasher({
|
|
58
62
|
root,
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
environmentGlob: config.cacheOptions?.environmentGlob ?? [],
|
|
64
|
+
logger,
|
|
65
|
+
cacheKey: config.cacheOptions?.cacheKey,
|
|
66
|
+
cliArgs: taskArgs
|
|
61
67
|
});
|
|
62
|
-
logger.info("Initializing
|
|
63
|
-
await
|
|
68
|
+
logger.info("Initializing hasher");
|
|
69
|
+
await targetHasher.initialize();
|
|
70
|
+
logger.info("Initializing dependency map");
|
|
71
|
+
const packageTree = targetHasher.packageTree;
|
|
72
|
+
const dependencyMap = targetHasher.dependencyMap;
|
|
64
73
|
const filteredPipeline = (0, _filterPipelineDefinitions.filterPipelineDefinitions)(targetGraph.targets.values(), config.pipeline);
|
|
65
74
|
logger.info("Initializing Pool");
|
|
66
75
|
const pool = new _workerthreadspool.AggregatedPool({
|
|
@@ -110,7 +119,8 @@ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg,
|
|
|
110
119
|
dependencyMap,
|
|
111
120
|
root,
|
|
112
121
|
pool,
|
|
113
|
-
globalInputs
|
|
122
|
+
globalInputs,
|
|
123
|
+
targetHasher
|
|
114
124
|
};
|
|
115
125
|
}
|
|
116
126
|
/**
|
|
@@ -122,6 +132,9 @@ async function createInitializedPromise({ cwd, logger, serverControls, nodeArg,
|
|
|
122
132
|
initializedPromise = createInitializedPromise(options);
|
|
123
133
|
return initializedPromise;
|
|
124
134
|
}
|
|
135
|
+
function getHashFilePath(target) {
|
|
136
|
+
return _path.default.join(`node_modules/.lage/hash_${target.task}`);
|
|
137
|
+
}
|
|
125
138
|
async function createLageService({ cwd, serverControls, logger, concurrency, tasks }) {
|
|
126
139
|
return {
|
|
127
140
|
async ping () {
|
|
@@ -137,7 +150,7 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
|
|
|
137
150
|
// THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call
|
|
138
151
|
// The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same
|
|
139
152
|
// `lage info` call
|
|
140
|
-
const { config, targetGraph, dependencyMap, packageTree, root, pool, globalInputs } = await initialize({
|
|
153
|
+
const { config, targetGraph, dependencyMap, packageTree, root, pool, globalInputs, targetHasher } = await initialize({
|
|
141
154
|
cwd,
|
|
142
155
|
logger,
|
|
143
156
|
nodeArg: request.nodeOptions,
|
|
@@ -156,6 +169,7 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
|
|
|
156
169
|
exitCode: 1
|
|
157
170
|
};
|
|
158
171
|
}
|
|
172
|
+
logger.info(`Running target: ${request.packageName}#${request.task}`);
|
|
159
173
|
const target = targetGraph.targets.get(id);
|
|
160
174
|
const task = {
|
|
161
175
|
target,
|
|
@@ -183,8 +197,27 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
|
|
|
183
197
|
cwd: root,
|
|
184
198
|
gitignore: true
|
|
185
199
|
}) : globalInputs;
|
|
186
|
-
const inputs = (0, _getTransitiveTargetInputs.getTransitiveTargetInputs)(target, targetGraph, dependencyMap, packageTree);
|
|
187
200
|
let results;
|
|
201
|
+
const inputs = (0, _hasher.getInputFiles)(target, dependencyMap, packageTree);
|
|
202
|
+
for (const dep of target.dependencies){
|
|
203
|
+
if (dep === (0, _targetgraph.getStartTargetId)()) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
const depTarget = targetGraph.targets.get(dep);
|
|
207
|
+
inputs.push(_path.default.join(_path.default.relative(root, depTarget.cwd), getHashFilePath(depTarget)).replace(/\\/g, "/"));
|
|
208
|
+
}
|
|
209
|
+
const targetHashFile = getHashFilePath(target);
|
|
210
|
+
const targetHashFullPath = _path.default.join(target.cwd, targetHashFile);
|
|
211
|
+
try {
|
|
212
|
+
if (!_fs.default.existsSync(_path.default.dirname(targetHashFullPath))) {
|
|
213
|
+
_fs.default.mkdirSync(_path.default.dirname(targetHashFullPath), {
|
|
214
|
+
recursive: true
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
_fs.default.writeFileSync(targetHashFullPath, await targetHasher.hash(target));
|
|
218
|
+
} catch (e) {
|
|
219
|
+
throw new _rpc.ConnectError(`Error writing target hash file: ${targetHashFullPath}`, _rpc.Code.Internal);
|
|
220
|
+
}
|
|
188
221
|
try {
|
|
189
222
|
await pool.exec(task, 0, (worker, stdout, stderr)=>{
|
|
190
223
|
logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);
|
|
@@ -207,6 +240,7 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
|
|
|
207
240
|
pipedStderr.unpipe(writableStderr);
|
|
208
241
|
});
|
|
209
242
|
const outputs = (0, _getOutputFiles.getOutputFiles)(root, target, config.cacheOptions?.outputGlob, packageTree);
|
|
243
|
+
outputs.push(targetHashFile);
|
|
210
244
|
results = {
|
|
211
245
|
packageName: request.packageName,
|
|
212
246
|
task: request.task,
|
|
@@ -220,6 +254,9 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
|
|
|
220
254
|
};
|
|
221
255
|
} catch (e) {
|
|
222
256
|
const outputs = (0, _getOutputFiles.getOutputFiles)(root, target, config.cacheOptions?.outputGlob, packageTree);
|
|
257
|
+
outputs.push(targetHashFile);
|
|
258
|
+
targetRun.status = "failed";
|
|
259
|
+
targetRun.duration = (0, _formathrtime.hrtimeDiff)(targetRun.startTime, process.hrtime());
|
|
223
260
|
results = {
|
|
224
261
|
packageName: request.packageName,
|
|
225
262
|
task: request.task,
|
|
@@ -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 type { ILageService } from \"@lage-run/rpc\";\nimport { getStartTargetId, getTargetId, type Target, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { type Readable } from \"stream\";\nimport { type Pool, AggregatedPool } from \"@lage-run/worker-threads-pool\";\nimport { getInputFiles, PackageTree } from \"@lage-run/hasher\";\nimport { createDependencyMap } from \"workspace-tools\";\nimport { getOutputFiles } from \"./getOutputFiles.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { MemoryStream } from \"./MemoryStream.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { filterPipelineDefinitions } from \"../run/filterPipelineDefinitions.js\";\nimport type { TargetRun } from \"@lage-run/scheduler-types\";\nimport { formatDuration, hrToSeconds, hrtimeDiff } from \"@lage-run/format-hrtime\";\nimport { getTransitiveTargetInputs } from \"./getTransitiveTargetInputs.js\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n globalInputs: string[];\n}\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 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 dependencyMap = createDependencyMap(packageInfos, { withDevDependencies: true, withPeerDependencies: false });\n const packageTree = new PackageTree({\n root,\n packageInfos,\n includeUntracked: true,\n });\n\n logger.info(\"Initializing Package Tree\");\n await packageTree.initialize();\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n logger.info(\"Initializing Pool\");\n const pool = new AggregatedPool({\n logger,\n maxWorkersByGroup: new Map([...getMaxWorkersPerTask(filteredPipeline, maxWorkers)]),\n groupBy: ({ target }) => target.task,\n maxWorkers,\n script: require.resolve(\"./singleTargetWorker.js\"),\n workerOptions: {\n stdout: true,\n stderr: true,\n workerData: {\n runners: {\n ...runnerPickerOptions(nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n shouldCache: false,\n shouldResetCache: false,\n },\n },\n },\n workerIdleMemoryLimit: config.workerIdleMemoryLimit,\n });\n\n serverControls.abortController.signal.addEventListener(\"abort\", () => {\n pool?.close();\n });\n\n pool?.on(\"freedWorker\", () => {\n logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);\n });\n\n pool?.on(\"idle\", () => {\n logger.info(\"All workers are idle, shutting down after timeout\");\n serverControls.countdownToShutdown();\n });\n\n const globalInputs = config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n\n logger.info(`Environment glob inputs: \\n${JSON.stringify(globalInputs)}\\n-------`);\n\n logger.info(\"done initializing\");\n return { config, targetGraph, packageTree, dependencyMap, root, pool, globalInputs };\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, globalInputs } = 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 const target = targetGraph.targets.get(id)!;\n const task = {\n target,\n runners,\n };\n\n const writableStdout = new MemoryStream();\n const writableStderr = new MemoryStream();\n let pipedStdout: Readable;\n let pipedStderr: Readable;\n\n const targetRun: TargetRun = {\n queueTime: process.hrtime(),\n target,\n duration: [0, 0],\n startTime: [0, 0],\n status: \"queued\",\n threadId: 0,\n };\n\n const targetGlobalInputs = target.environmentGlob ? glob(target.environmentGlob, { cwd: root, gitignore: true }) : globalInputs;\n\n const inputs = getTransitiveTargetInputs(target, targetGraph, dependencyMap, packageTree);\n\n let results: {\n packageName?: string;\n task: string;\n exitCode: number;\n inputs: string[];\n outputs: string[];\n stdout: string;\n stderr: string;\n id: string;\n globalInputs: string[];\n };\n\n 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\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n globalInputs: targetGlobalInputs,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n globalInputs: targetGlobalInputs,\n };\n }\n\n logger.info(\n `${request.packageName}#${request.task} results: \\n${JSON.stringify(\n {\n packageName: results.packageName,\n task: results.task,\n exitCode: results.exitCode,\n inputs: results.inputs,\n outputs: results.outputs,\n id: results.id,\n globalInputs: `(${target.environmentGlob ? \"custom target env glob used\" : \"general global inputs used\"}): ${\n results.globalInputs.length\n } files`,\n },\n null,\n 2\n )}\\n------`,\n results\n );\n\n return results;\n },\n };\n}\n"],"names":["createLageService","initializedPromise","formatBytes","bytes","toFixed","createInitializedPromise","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","config","getConfig","root","getWorkspaceRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","priorities","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","initialize","filteredPipeline","filterPipelineDefinitions","targets","values","pool","AggregatedPool","maxWorkersByGroup","Map","getMaxWorkersPerTask","groupBy","target","task","script","require","resolve","workerOptions","stdout","stderr","workerData","runners","runnerPickerOptions","npmClient","shouldCache","shouldResetCache","workerIdleMemoryLimit","abortController","signal","addEventListener","close","on","silly","stats","maxWorkerMemoryUsage","countdownToShutdown","globalInputs","environmentGlob","glob","gitignore","JSON","stringify","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","targetGlobalInputs","inputs","getTransitiveTargetInputs","results","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","toString","e","Error","length"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/server/lageService.ts"],"sourcesContent":["import { type ConfigOptions, getConfig, getConcurrency, getMaxWorkersPerTask } from \"@lage-run/config\";\nimport type { Logger } from \"@lage-run/logger\";\nimport { ConnectError, Code, type ILageService } from \"@lage-run/rpc\";\nimport { getStartTargetId, getTargetId, type Target, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { type Readable } from \"stream\";\nimport { type Pool, AggregatedPool } from \"@lage-run/worker-threads-pool\";\nimport { getInputFiles, type PackageTree, TargetHasher } from \"@lage-run/hasher\";\nimport { getOutputFiles } from \"./getOutputFiles.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { MemoryStream } from \"./MemoryStream.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { filterPipelineDefinitions } from \"../run/filterPipelineDefinitions.js\";\nimport type { TargetRun } from \"@lage-run/scheduler-types\";\nimport { formatDuration, hrToSeconds, hrtimeDiff } from \"@lage-run/format-hrtime\";\nimport path from \"path\";\nimport fs from \"fs\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n globalInputs: string[];\n targetHasher: TargetHasher;\n}\n\nlet initializedPromise: Promise<LageServiceContext> | undefined;\ninterface ServiceControls {\n abortController: AbortController;\n countdownToShutdown: () => void;\n clearCountdown: () => void;\n}\ninterface InitializeOptions {\n cwd: string;\n logger: Logger;\n serverControls: ServiceControls;\n concurrency?: number;\n nodeArg?: string;\n taskArgs: string[];\n tasks: string[];\n}\n\nfunction formatBytes(bytes: number) {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nasync function createInitializedPromise({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }: InitializeOptions) {\n if (initializedPromise) {\n return initializedPromise;\n }\n\n const config = await getConfig(cwd);\n const root = getWorkspaceRoot(cwd)!;\n const maxWorkers = getConcurrency(concurrency, config.concurrency);\n\n logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(\", \")}`);\n\n const { pipeline } = config;\n\n const packageInfos = getPackageInfos(root);\n\n logger.info(\"Initializing target graph\");\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: false,\n dependents: false,\n ignore: [],\n pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: undefined,\n since: undefined,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n priorities: config.priorities,\n });\n\n const targetHasher = new TargetHasher({\n root,\n environmentGlob: config.cacheOptions?.environmentGlob ?? [],\n logger,\n cacheKey: config.cacheOptions?.cacheKey,\n cliArgs: taskArgs,\n });\n\n logger.info(\"Initializing hasher\");\n await targetHasher.initialize();\n\n logger.info(\"Initializing dependency map\");\n\n const packageTree = targetHasher.packageTree!;\n const dependencyMap = targetHasher.dependencyMap;\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n logger.info(\"Initializing Pool\");\n const pool = new AggregatedPool({\n logger,\n maxWorkersByGroup: new Map([...getMaxWorkersPerTask(filteredPipeline, maxWorkers)]),\n groupBy: ({ target }) => target.task,\n maxWorkers,\n script: require.resolve(\"./singleTargetWorker.js\"),\n workerOptions: {\n stdout: true,\n stderr: true,\n workerData: {\n runners: {\n ...runnerPickerOptions(nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n shouldCache: false,\n shouldResetCache: false,\n },\n },\n },\n workerIdleMemoryLimit: config.workerIdleMemoryLimit,\n });\n\n serverControls.abortController.signal.addEventListener(\"abort\", () => {\n pool?.close();\n });\n\n pool?.on(\"freedWorker\", () => {\n logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);\n });\n\n pool?.on(\"idle\", () => {\n logger.info(\"All workers are idle, shutting down after timeout\");\n serverControls.countdownToShutdown();\n });\n\n const globalInputs = config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n\n logger.info(`Environment glob inputs: \\n${JSON.stringify(globalInputs)}\\n-------`);\n\n logger.info(\"done initializing\");\n return { config, targetGraph, packageTree, dependencyMap, root, pool, globalInputs, targetHasher };\n}\n\n/**\n * Initializes the lageService: the extra \"initializePromise\" ensures only one initialization is done at a time across threads\n * @param cwd\n * @param logger\n * @returns\n */\nasync function initialize(options: InitializeOptions): Promise<LageServiceContext> {\n initializedPromise = createInitializedPromise(options);\n return initializedPromise;\n}\n\ninterface CreateLageServiceOptions {\n cwd: string;\n serverControls: ServiceControls;\n logger: Logger;\n concurrency?: number;\n tasks: string[];\n}\n\nfunction getHashFilePath(target: Target) {\n return path.join(`node_modules/.lage/hash_${target.task}`);\n}\n\nexport async function createLageService({\n cwd,\n serverControls,\n logger,\n concurrency,\n tasks,\n}: CreateLageServiceOptions): Promise<ILageService> {\n return {\n async ping() {\n return { pong: true };\n },\n\n async runTarget(request) {\n if (global.gc) {\n global.gc();\n }\n\n serverControls.clearCountdown();\n\n // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call\n // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same\n // `lage info` call\n const { config, targetGraph, dependencyMap, packageTree, root, pool, globalInputs, targetHasher } = await initialize({\n cwd,\n logger,\n nodeArg: request.nodeOptions,\n taskArgs: request.taskArgs,\n serverControls,\n concurrency,\n tasks,\n });\n\n const runners = runnerPickerOptions(request.nodeOptions, config.npmClient, request.taskArgs);\n\n const id = getTargetId(request.packageName, request.task);\n\n if (!targetGraph.targets.has(id)) {\n logger.info(`Target not found: ${request.packageName}#${request.task}`);\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n };\n }\n\n logger.info(`Running target: ${request.packageName}#${request.task}`);\n\n const target = targetGraph.targets.get(id)!;\n const task = {\n target,\n runners,\n };\n\n const writableStdout = new MemoryStream();\n const writableStderr = new MemoryStream();\n let pipedStdout: Readable;\n let pipedStderr: Readable;\n\n const targetRun: TargetRun = {\n queueTime: process.hrtime(),\n target,\n duration: [0, 0],\n startTime: [0, 0],\n status: \"queued\",\n threadId: 0,\n };\n\n const targetGlobalInputs = target.environmentGlob ? glob(target.environmentGlob, { cwd: root, gitignore: true }) : globalInputs;\n\n let results: {\n packageName?: string;\n task: string;\n exitCode: number;\n inputs: string[];\n outputs: string[];\n stdout: string;\n stderr: string;\n id: string;\n globalInputs: string[];\n };\n\n const inputs = getInputFiles(target, dependencyMap, packageTree);\n\n for (const dep of target.dependencies) {\n if (dep === getStartTargetId()) {\n continue;\n }\n\n const depTarget = targetGraph.targets.get(dep)!;\n inputs.push(path.join(path.relative(root, depTarget.cwd), getHashFilePath(depTarget)).replace(/\\\\/g, \"/\"));\n }\n\n const targetHashFile = getHashFilePath(target);\n const targetHashFullPath = path.join(target.cwd, targetHashFile);\n\n try {\n if (!fs.existsSync(path.dirname(targetHashFullPath))) {\n fs.mkdirSync(path.dirname(targetHashFullPath), { recursive: true });\n }\n\n fs.writeFileSync(targetHashFullPath, await targetHasher.hash(target));\n } catch (e) {\n throw new ConnectError(`Error writing target hash file: ${targetHashFullPath}`, Code.Internal);\n }\n\n try {\n await pool.exec(\n task,\n 0,\n (worker, stdout, stderr) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);\n\n pipedStdout = stdout;\n pipedStderr = stderr;\n\n stdout.pipe(writableStdout);\n stderr.pipe(writableStderr);\n\n targetRun.threadId = worker.threadId;\n targetRun.status = \"running\";\n targetRun.startTime = process.hrtime();\n },\n (worker) => {\n logger.info(`Max Worker Memory Usage: ${formatBytes(pool.stats().maxWorkerMemoryUsage)}`);\n\n // logger.info the main process memory usage\n const memoryUsage = process.memoryUsage();\n logger.info(\n `Main Process Memory Usage: RSS: ${formatBytes(memoryUsage.rss)} Heap Total: ${formatBytes(\n memoryUsage.heapTotal\n )} Heap Used: ${formatBytes(memoryUsage.heapUsed)}`\n );\n\n targetRun.status = \"success\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n logger.info(\n `[${worker.threadId}] ${request.packageName}#${request.task} end: ${formatDuration(hrToSeconds(targetRun.duration))}`\n );\n pipedStdout.unpipe(writableStdout);\n pipedStderr.unpipe(writableStderr);\n }\n );\n\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n outputs.push(targetHashFile);\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n globalInputs: targetGlobalInputs,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n outputs.push(targetHashFile);\n\n targetRun.status = \"failed\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n results = {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n globalInputs: targetGlobalInputs,\n };\n }\n\n logger.info(\n `${request.packageName}#${request.task} results: \\n${JSON.stringify(\n {\n packageName: results.packageName,\n task: results.task,\n exitCode: results.exitCode,\n inputs: results.inputs,\n outputs: results.outputs,\n id: results.id,\n globalInputs: `(${target.environmentGlob ? \"custom target env glob used\" : \"general global inputs used\"}): ${\n results.globalInputs.length\n } files`,\n },\n null,\n 2\n )}\\n------`,\n results\n );\n\n return results;\n },\n };\n}\n"],"names":["createLageService","initializedPromise","formatBytes","bytes","toFixed","createInitializedPromise","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","config","getConfig","root","getWorkspaceRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","priorities","targetHasher","TargetHasher","environmentGlob","cacheKey","cliArgs","initialize","packageTree","dependencyMap","filteredPipeline","filterPipelineDefinitions","targets","values","pool","AggregatedPool","maxWorkersByGroup","Map","getMaxWorkersPerTask","groupBy","target","task","script","require","resolve","workerOptions","stdout","stderr","workerData","runners","runnerPickerOptions","npmClient","shouldCache","shouldResetCache","workerIdleMemoryLimit","abortController","signal","addEventListener","close","on","silly","stats","maxWorkerMemoryUsage","countdownToShutdown","globalInputs","glob","gitignore","JSON","stringify","options","getHashFilePath","path","ping","pong","runTarget","request","global","gc","clearCountdown","nodeOptions","id","getTargetId","packageName","has","exitCode","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","targetRun","queueTime","process","hrtime","duration","startTime","status","threadId","targetGlobalInputs","results","inputs","getInputFiles","dep","getStartTargetId","depTarget","push","relative","replace","targetHashFile","targetHashFullPath","fs","existsSync","dirname","mkdirSync","recursive","writeFileSync","hash","e","ConnectError","Code","Internal","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","toString","Error","length"],"mappings":";;;;+BAwKsBA;;;eAAAA;;;wBAxK8D;qBAE9B;6BACuB;gCACP;mCACpC;mCAEQ;wBACoB;gCAC/B;wBACV;8BACQ;qCACO;2CACM;8BAEc;6DACvC;2DACF;;;;;;AAaf,IAAIC;AAgBJ,SAASC,YAAYC,KAAa;IAChC,OAAO,GAAG,AAACA,CAAAA,QAAQ,OAAO,IAAG,EAAGC,OAAO,CAAC,GAAG,GAAG,CAAC;AACjD;AAEA,eAAeC,yBAAyB,EAAEC,GAAG,EAAEC,MAAM,EAAEC,cAAc,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,KAAK,EAAqB;IAC/H,IAAIX,oBAAoB;QACtB,OAAOA;IACT;IAEA,MAAMY,SAAS,MAAMC,IAAAA,iBAAS,EAACR;IAC/B,MAAMS,OAAOC,IAAAA,gCAAgB,EAACV;IAC9B,MAAMW,aAAaC,IAAAA,sBAAc,EAACP,aAAaE,OAAOF,WAAW;IAEjEJ,OAAOY,IAAI,CAAC,CAAC,kBAAkB,EAAEF,WAAW,iBAAiB,EAAEL,MAAMQ,IAAI,CAAC,OAAO;IAEjF,MAAM,EAAEC,QAAQ,EAAE,GAAGR;IAErB,MAAMS,eAAeC,IAAAA,+BAAe,EAACR;IAErCR,OAAOY,IAAI,CAAC;IACZ,MAAMK,cAAc,MAAMC,IAAAA,oCAAiB,EAAC;QAC1ClB;QACAQ;QACAW,cAAc;QACdC,YAAY;QACZC,QAAQ,EAAE;QACVP;QACAQ,iBAAiBhB,OAAOgB,eAAe;QACvCC,OAAOC;QACPC,OAAOD;QACPE,SAASpB,OAAOqB,YAAY,CAACC,UAAU;QACvCvB;QACAU;QACAc,YAAYvB,OAAOuB,UAAU;IAC/B;IAEA,MAAMC,eAAe,IAAIC,oBAAY,CAAC;QACpCvB;QACAwB,iBAAiB1B,OAAOqB,YAAY,EAAEK,mBAAmB,EAAE;QAC3DhC;QACAiC,UAAU3B,OAAOqB,YAAY,EAAEM;QAC/BC,SAAS/B;IACX;IAEAH,OAAOY,IAAI,CAAC;IACZ,MAAMkB,aAAaK,UAAU;IAE7BnC,OAAOY,IAAI,CAAC;IAEZ,MAAMwB,cAAcN,aAAaM,WAAW;IAC5C,MAAMC,gBAAgBP,aAAaO,aAAa;IAEhD,MAAMC,mBAAmBC,IAAAA,oDAAyB,EAACtB,YAAYuB,OAAO,CAACC,MAAM,IAAInC,OAAOQ,QAAQ;IAEhGd,OAAOY,IAAI,CAAC;IACZ,MAAM8B,OAAO,IAAIC,iCAAc,CAAC;QAC9B3C;QACA4C,mBAAmB,IAAIC,IAAI;eAAIC,IAAAA,4BAAoB,EAACR,kBAAkB5B;SAAY;QAClFqC,SAAS,CAAC,EAAEC,MAAM,EAAE,GAAKA,OAAOC,IAAI;QACpCvC;QACAwC,QAAQC,QAAQC,OAAO,CAAC;QACxBC,eAAe;YACbC,QAAQ;YACRC,QAAQ;YACRC,YAAY;gBACVC,SAAS;oBACP,GAAGC,IAAAA,wCAAmB,EAACxD,SAASI,OAAOqD,SAAS,EAAExD,SAAS;oBAC3D,GAAGG,OAAOmD,OAAO;oBACjBG,aAAa;oBACbC,kBAAkB;gBACpB;YACF;QACF;QACAC,uBAAuBxD,OAAOwD,qBAAqB;IACrD;IAEA7D,eAAe8D,eAAe,CAACC,MAAM,CAACC,gBAAgB,CAAC,SAAS;QAC9DvB,MAAMwB;IACR;IAEAxB,MAAMyB,GAAG,eAAe;QACtBnE,OAAOoE,KAAK,CAAC,CAAC,yBAAyB,EAAEzE,YAAY+C,MAAM2B,QAAQC,uBAAuB;IAC5F;IAEA5B,MAAMyB,GAAG,QAAQ;QACfnE,OAAOY,IAAI,CAAC;QACZX,eAAesE,mBAAmB;IACpC;IAEA,MAAMC,eAAelE,OAAOqB,YAAY,EAAEK,kBACtCyC,IAAAA,YAAI,EAACnE,OAAOqB,YAAY,EAAEK,iBAAiB;QAAEjC,KAAKS;QAAMkE,WAAW;IAAK,KACxE;QAAC;KAAiB;IAEtB1E,OAAOY,IAAI,CAAC,CAAC,2BAA2B,EAAE+D,KAAKC,SAAS,CAACJ,cAAc,SAAS,CAAC;IAEjFxE,OAAOY,IAAI,CAAC;IACZ,OAAO;QAAEN;QAAQW;QAAamB;QAAaC;QAAe7B;QAAMkC;QAAM8B;QAAc1C;IAAa;AACnG;AAEA;;;;;CAKC,GACD,eAAeK,WAAW0C,OAA0B;IAClDnF,qBAAqBI,yBAAyB+E;IAC9C,OAAOnF;AACT;AAUA,SAASoF,gBAAgB9B,MAAc;IACrC,OAAO+B,aAAI,CAAClE,IAAI,CAAC,CAAC,wBAAwB,EAAEmC,OAAOC,IAAI,EAAE;AAC3D;AAEO,eAAexD,kBAAkB,EACtCM,GAAG,EACHE,cAAc,EACdD,MAAM,EACNI,WAAW,EACXC,KAAK,EACoB;IACzB,OAAO;QACL,MAAM2E;YACJ,OAAO;gBAAEC,MAAM;YAAK;QACtB;QAEA,MAAMC,WAAUC,OAAO;YACrB,IAAIC,OAAOC,EAAE,EAAE;gBACbD,OAAOC,EAAE;YACX;YAEApF,eAAeqF,cAAc;YAE7B,2FAA2F;YAC3F,qIAAqI;YACrI,mBAAmB;YACnB,MAAM,EAAEhF,MAAM,EAAEW,WAAW,EAAEoB,aAAa,EAAED,WAAW,EAAE5B,IAAI,EAAEkC,IAAI,EAAE8B,YAAY,EAAE1C,YAAY,EAAE,GAAG,MAAMK,WAAW;gBACnHpC;gBACAC;gBACAE,SAASiF,QAAQI,WAAW;gBAC5BpF,UAAUgF,QAAQhF,QAAQ;gBAC1BF;gBACAG;gBACAC;YACF;YAEA,MAAMoD,UAAUC,IAAAA,wCAAmB,EAACyB,QAAQI,WAAW,EAAEjF,OAAOqD,SAAS,EAAEwB,QAAQhF,QAAQ;YAE3F,MAAMqF,KAAKC,IAAAA,wBAAW,EAACN,QAAQO,WAAW,EAAEP,QAAQlC,IAAI;YAExD,IAAI,CAAChC,YAAYuB,OAAO,CAACmD,GAAG,CAACH,KAAK;gBAChCxF,OAAOY,IAAI,CAAC,CAAC,kBAAkB,EAAEuE,QAAQO,WAAW,CAAC,CAAC,EAAEP,QAAQlC,IAAI,EAAE;gBACtE,OAAO;oBACLyC,aAAaP,QAAQO,WAAW;oBAChCzC,MAAMkC,QAAQlC,IAAI;oBAClB2C,UAAU;gBACZ;YACF;YAEA5F,OAAOY,IAAI,CAAC,CAAC,gBAAgB,EAAEuE,QAAQO,WAAW,CAAC,CAAC,EAAEP,QAAQlC,IAAI,EAAE;YAEpE,MAAMD,SAAS/B,YAAYuB,OAAO,CAACqD,GAAG,CAACL;YACvC,MAAMvC,OAAO;gBACXD;gBACAS;YACF;YAEA,MAAMqC,iBAAiB,IAAIC,0BAAY;YACvC,MAAMC,iBAAiB,IAAID,0BAAY;YACvC,IAAIE;YACJ,IAAIC;YAEJ,MAAMC,YAAuB;gBAC3BC,WAAWC,QAAQC,MAAM;gBACzBtD;gBACAuD,UAAU;oBAAC;oBAAG;iBAAE;gBAChBC,WAAW;oBAAC;oBAAG;iBAAE;gBACjBC,QAAQ;gBACRC,UAAU;YACZ;YAEA,MAAMC,qBAAqB3D,OAAOhB,eAAe,GAAGyC,IAAAA,YAAI,EAACzB,OAAOhB,eAAe,EAAE;gBAAEjC,KAAKS;gBAAMkE,WAAW;YAAK,KAAKF;YAEnH,IAAIoC;YAYJ,MAAMC,SAASC,IAAAA,qBAAa,EAAC9D,QAAQX,eAAeD;YAEpD,KAAK,MAAM2E,OAAO/D,OAAO7B,YAAY,CAAE;gBACrC,IAAI4F,QAAQC,IAAAA,6BAAgB,KAAI;oBAC9B;gBACF;gBAEA,MAAMC,YAAYhG,YAAYuB,OAAO,CAACqD,GAAG,CAACkB;gBAC1CF,OAAOK,IAAI,CAACnC,aAAI,CAAClE,IAAI,CAACkE,aAAI,CAACoC,QAAQ,CAAC3G,MAAMyG,UAAUlH,GAAG,GAAG+E,gBAAgBmC,YAAYG,OAAO,CAAC,OAAO;YACvG;YAEA,MAAMC,iBAAiBvC,gBAAgB9B;YACvC,MAAMsE,qBAAqBvC,aAAI,CAAClE,IAAI,CAACmC,OAAOjD,GAAG,EAAEsH;YAEjD,IAAI;gBACF,IAAI,CAACE,WAAE,CAACC,UAAU,CAACzC,aAAI,CAAC0C,OAAO,CAACH,sBAAsB;oBACpDC,WAAE,CAACG,SAAS,CAAC3C,aAAI,CAAC0C,OAAO,CAACH,qBAAqB;wBAAEK,WAAW;oBAAK;gBACnE;gBAEAJ,WAAE,CAACK,aAAa,CAACN,oBAAoB,MAAMxF,aAAa+F,IAAI,CAAC7E;YAC/D,EAAE,OAAO8E,GAAG;gBACV,MAAM,IAAIC,iBAAY,CAAC,CAAC,gCAAgC,EAAET,oBAAoB,EAAEU,SAAI,CAACC,QAAQ;YAC/F;YAEA,IAAI;gBACF,MAAMvF,KAAKwF,IAAI,CACbjF,MACA,GACA,CAACkF,QAAQ7E,QAAQC;oBACfvD,OAAOY,IAAI,CAAC,CAAC,CAAC,EAAEuH,OAAOzB,QAAQ,CAAC,EAAE,EAAEvB,QAAQO,WAAW,CAAC,CAAC,EAAEP,QAAQlC,IAAI,CAAC,MAAM,CAAC;oBAE/EgD,cAAc3C;oBACd4C,cAAc3C;oBAEdD,OAAO8E,IAAI,CAACtC;oBACZvC,OAAO6E,IAAI,CAACpC;oBAEZG,UAAUO,QAAQ,GAAGyB,OAAOzB,QAAQ;oBACpCP,UAAUM,MAAM,GAAG;oBACnBN,UAAUK,SAAS,GAAGH,QAAQC,MAAM;gBACtC,GACA,CAAC6B;oBACCnI,OAAOY,IAAI,CAAC,CAAC,yBAAyB,EAAEjB,YAAY+C,KAAK2B,KAAK,GAAGC,oBAAoB,GAAG;oBAExF,4CAA4C;oBAC5C,MAAM+D,cAAchC,QAAQgC,WAAW;oBACvCrI,OAAOY,IAAI,CACT,CAAC,gCAAgC,EAAEjB,YAAY0I,YAAYC,GAAG,EAAE,aAAa,EAAE3I,YAC7E0I,YAAYE,SAAS,EACrB,YAAY,EAAE5I,YAAY0I,YAAYG,QAAQ,GAAG;oBAGrDrC,UAAUM,MAAM,GAAG;oBACnBN,UAAUI,QAAQ,GAAGkC,IAAAA,wBAAU,EAACtC,UAAUK,SAAS,EAAEH,QAAQC,MAAM;oBAEnEtG,OAAOY,IAAI,CACT,CAAC,CAAC,EAAEuH,OAAOzB,QAAQ,CAAC,EAAE,EAAEvB,QAAQO,WAAW,CAAC,CAAC,EAAEP,QAAQlC,IAAI,CAAC,MAAM,EAAEyF,IAAAA,4BAAc,EAACC,IAAAA,yBAAW,EAACxC,UAAUI,QAAQ,IAAI;oBAEvHN,YAAY2C,MAAM,CAAC9C;oBACnBI,YAAY0C,MAAM,CAAC5C;gBACrB;gBAGF,MAAMtE,UAAUmH,IAAAA,8BAAc,EAACrI,MAAMwC,QAAQ1C,OAAOqB,YAAY,EAAEC,YAAYQ;gBAC9EV,QAAQwF,IAAI,CAACG;gBAEbT,UAAU;oBACRlB,aAAaP,QAAQO,WAAW;oBAChCzC,MAAMkC,QAAQlC,IAAI;oBAClB2C,UAAU;oBACViB;oBACAnF;oBACA4B,QAAQwC,eAAegD,QAAQ;oBAC/BvF,QAAQyC,eAAe8C,QAAQ;oBAC/BtD;oBACAhB,cAAcmC;gBAChB;YACF,EAAE,OAAOmB,GAAG;gBACV,MAAMpG,UAAUmH,IAAAA,8BAAc,EAACrI,MAAMwC,QAAQ1C,OAAOqB,YAAY,EAAEC,YAAYQ;gBAC9EV,QAAQwF,IAAI,CAACG;gBAEblB,UAAUM,MAAM,GAAG;gBACnBN,UAAUI,QAAQ,GAAGkC,IAAAA,wBAAU,EAACtC,UAAUK,SAAS,EAAEH,QAAQC,MAAM;gBAEnEM,UAAU;oBACRlB,aAAaP,QAAQO,WAAW;oBAChCzC,MAAMkC,QAAQlC,IAAI;oBAClB2C,UAAU;oBACViB;oBACAnF;oBACA4B,QAAQ;oBACRC,QAAQuE,aAAaiB,QAAQjB,EAAEgB,QAAQ,KAAK;oBAC5CtD;oBACAhB,cAAcmC;gBAChB;YACF;YAEA3G,OAAOY,IAAI,CACT,GAAGuE,QAAQO,WAAW,CAAC,CAAC,EAAEP,QAAQlC,IAAI,CAAC,YAAY,EAAE0B,KAAKC,SAAS,CACjE;gBACEc,aAAakB,QAAQlB,WAAW;gBAChCzC,MAAM2D,QAAQ3D,IAAI;gBAClB2C,UAAUgB,QAAQhB,QAAQ;gBAC1BiB,QAAQD,QAAQC,MAAM;gBACtBnF,SAASkF,QAAQlF,OAAO;gBACxB8D,IAAIoB,QAAQpB,EAAE;gBACdhB,cAAc,CAAC,CAAC,EAAExB,OAAOhB,eAAe,GAAG,gCAAgC,6BAA6B,GAAG,EACzG4E,QAAQpC,YAAY,CAACwE,MAAM,CAC5B,MAAM,CAAC;YACV,GACA,MACA,GACA,QAAQ,CAAC,EACXpC;YAGF,OAAOA;QACT;IACF;AACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lage-run/cli",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.5",
|
|
4
4
|
"description": "Command Line Interface for Lage",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@lage-run/hasher": "^1.6.9",
|
|
29
29
|
"@lage-run/logger": "^1.3.1",
|
|
30
30
|
"@lage-run/reporters": "^1.2.19",
|
|
31
|
-
"@lage-run/rpc": "^1.2.
|
|
31
|
+
"@lage-run/rpc": "^1.2.6",
|
|
32
32
|
"@lage-run/runners": "^1.2.1",
|
|
33
33
|
"@lage-run/scheduler": "^1.5.1",
|
|
34
34
|
"@lage-run/scheduler-types": "^0.3.23",
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { type PackageTree } from "@lage-run/hasher";
|
|
2
|
-
import { type Target, type TargetGraph } from "@lage-run/target-graph";
|
|
3
|
-
import type { DependencyMap } from "workspace-tools";
|
|
4
|
-
export declare function getTransitiveTargetInputs(target: Target, targetGraph: TargetGraph, dependencyMap: DependencyMap, packageTree: PackageTree): string[];
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "getTransitiveTargetInputs", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return getTransitiveTargetInputs;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _hasher = require("@lage-run/hasher");
|
|
12
|
-
const _targetgraph = require("@lage-run/target-graph");
|
|
13
|
-
function getTransitiveTargetInputs(target, targetGraph, dependencyMap, packageTree) {
|
|
14
|
-
const inputsSet = new Set((0, _hasher.getInputFiles)(target, dependencyMap, packageTree) ?? []);
|
|
15
|
-
// iteratively add all transitive dependencies in a breath-first manner using a queue
|
|
16
|
-
const queue = target.dependencies.slice();
|
|
17
|
-
const visited = new Set();
|
|
18
|
-
while(queue.length > 0){
|
|
19
|
-
const dependency = queue.shift();
|
|
20
|
-
if (dependency === (0, _targetgraph.getStartTargetId)()) {
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
// skip if already visited
|
|
24
|
-
if (visited.has(dependency)) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
visited.add(dependency);
|
|
28
|
-
// now add the inputs of the dependency
|
|
29
|
-
const depTarget = targetGraph.targets.get(dependency);
|
|
30
|
-
const depInputs = (0, _hasher.getInputFiles)(depTarget, dependencyMap, packageTree);
|
|
31
|
-
if (depInputs) {
|
|
32
|
-
depInputs.forEach((file)=>inputsSet.add(file));
|
|
33
|
-
}
|
|
34
|
-
// add the dependencies of the dependency to the queue
|
|
35
|
-
queue.push(...depTarget.dependencies);
|
|
36
|
-
}
|
|
37
|
-
return Array.from(inputsSet);
|
|
38
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/server/getTransitiveTargetInputs.ts"],"sourcesContent":["import { type PackageTree, getInputFiles } from \"@lage-run/hasher\";\nimport { type Target, type TargetGraph, getStartTargetId } from \"@lage-run/target-graph\";\nimport type { DependencyMap } from \"workspace-tools\";\n\nexport function getTransitiveTargetInputs(\n target: Target,\n targetGraph: TargetGraph,\n dependencyMap: DependencyMap,\n packageTree: PackageTree\n) {\n const inputsSet = new Set<string>(getInputFiles(target, dependencyMap, packageTree) ?? []);\n\n // iteratively add all transitive dependencies in a breath-first manner using a queue\n const queue = target.dependencies.slice();\n const visited = new Set<string>();\n while (queue.length > 0) {\n const dependency = queue.shift()!;\n if (dependency === getStartTargetId()) {\n continue;\n }\n\n // skip if already visited\n if (visited.has(dependency)) {\n continue;\n }\n visited.add(dependency);\n\n // now add the inputs of the dependency\n const depTarget = targetGraph.targets.get(dependency)!;\n const depInputs = getInputFiles(depTarget, dependencyMap, packageTree);\n if (depInputs) {\n depInputs.forEach((file) => inputsSet.add(file));\n }\n\n // add the dependencies of the dependency to the queue\n queue.push(...depTarget.dependencies);\n }\n\n return Array.from(inputsSet);\n}\n"],"names":["getTransitiveTargetInputs","target","targetGraph","dependencyMap","packageTree","inputsSet","Set","getInputFiles","queue","dependencies","slice","visited","length","dependency","shift","getStartTargetId","has","add","depTarget","targets","get","depInputs","forEach","file","push","Array","from"],"mappings":";;;;+BAIgBA;;;eAAAA;;;wBAJgC;6BACgB;AAGzD,SAASA,0BACdC,MAAc,EACdC,WAAwB,EACxBC,aAA4B,EAC5BC,WAAwB;IAExB,MAAMC,YAAY,IAAIC,IAAYC,IAAAA,qBAAa,EAACN,QAAQE,eAAeC,gBAAgB,EAAE;IAEzF,qFAAqF;IACrF,MAAMI,QAAQP,OAAOQ,YAAY,CAACC,KAAK;IACvC,MAAMC,UAAU,IAAIL;IACpB,MAAOE,MAAMI,MAAM,GAAG,EAAG;QACvB,MAAMC,aAAaL,MAAMM,KAAK;QAC9B,IAAID,eAAeE,IAAAA,6BAAgB,KAAI;YACrC;QACF;QAEA,0BAA0B;QAC1B,IAAIJ,QAAQK,GAAG,CAACH,aAAa;YAC3B;QACF;QACAF,QAAQM,GAAG,CAACJ;QAEZ,uCAAuC;QACvC,MAAMK,YAAYhB,YAAYiB,OAAO,CAACC,GAAG,CAACP;QAC1C,MAAMQ,YAAYd,IAAAA,qBAAa,EAACW,WAAWf,eAAeC;QAC1D,IAAIiB,WAAW;YACbA,UAAUC,OAAO,CAAC,CAACC,OAASlB,UAAUY,GAAG,CAACM;QAC5C;QAEA,sDAAsD;QACtDf,MAAMgB,IAAI,IAAIN,UAAUT,YAAY;IACtC;IAEA,OAAOgB,MAAMC,IAAI,CAACrB;AACpB"}
|