@lage-run/cli 0.24.3 → 0.24.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.
Files changed (36) hide show
  1. package/CHANGELOG.json +91 -1
  2. package/CHANGELOG.md +28 -2
  3. package/lib/commands/exec/action.d.ts +1 -0
  4. package/lib/commands/exec/action.js +3 -0
  5. package/lib/commands/exec/action.js.map +1 -1
  6. package/lib/commands/exec/executeRemotely.d.ts +3 -1
  7. package/lib/commands/exec/executeRemotely.js +12 -55
  8. package/lib/commands/exec/executeRemotely.js.map +1 -1
  9. package/lib/commands/exec/index.js +2 -1
  10. package/lib/commands/exec/index.js.map +1 -1
  11. package/lib/commands/info/action.js +8 -21
  12. package/lib/commands/info/action.js.map +1 -1
  13. package/lib/commands/launchServerInBackground.d.ts +11 -0
  14. package/lib/commands/launchServerInBackground.js +98 -0
  15. package/lib/commands/launchServerInBackground.js.map +1 -0
  16. package/lib/commands/run/createTargetGraph.js +26 -2
  17. package/lib/commands/run/createTargetGraph.js.map +1 -1
  18. package/lib/commands/run/runAction.js +9 -1
  19. package/lib/commands/run/runAction.js.map +1 -1
  20. package/lib/commands/server/action.d.ts +1 -0
  21. package/lib/commands/server/action.js +3 -2
  22. package/lib/commands/server/action.js.map +1 -1
  23. package/lib/commands/server/index.js +3 -8
  24. package/lib/commands/server/index.js.map +1 -1
  25. package/lib/commands/server/lageService.d.ts +5 -3
  26. package/lib/commands/server/lageService.js +49 -30
  27. package/lib/commands/server/lageService.js.map +1 -1
  28. package/lib/filter/getFilteredPackages.js +2 -65
  29. package/lib/filter/getFilteredPackages.js.map +1 -1
  30. package/lib/filter/hasRepoChanged.d.ts +2 -0
  31. package/lib/filter/hasRepoChanged.js +75 -0
  32. package/lib/filter/hasRepoChanged.js.map +1 -0
  33. package/lib/optimizeTargetGraph.d.ts +3 -0
  34. package/lib/optimizeTargetGraph.js +49 -0
  35. package/lib/optimizeTargetGraph.js.map +1 -0
  36. package/package.json +11 -10
@@ -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, {\n cache: true,\n dependsOn: definition,\n options: {},\n outputs,\n });\n } else {\n builder.addTargetConfig(id, definition);\n }\n }\n\n return await builder.build(tasks, packages);\n}\n"],"names":["createTargetGraph","options","logger","root","dependencies","dependents","since","scope","repoWideChanges","ignore","pipeline","outputs","tasks","packageInfos","builder","WorkspaceTargetGraphBuilder","packages","getFilteredPackages","includeDependencies","includeDependents","sinceIgnoreGlobs","id","definition","Object","entries","Array","isArray","addTargetConfig","cache","dependsOn","build"],"mappings":";;;;+BAqBsBA;;;eAAAA;;;6BApBsB;qCAER;AAkB7B,eAAeA,kBAAkBC,OAAiC;IACvE,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAEC,YAAY,EAAEC,UAAU,EAAEC,KAAK,EAAEC,KAAK,EAAEC,eAAe,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,KAAK,EAAEC,YAAY,EAAE,GAAGZ;IAElI,MAAMa,UAAU,IAAIC,wCAA2B,CAACZ,MAAMU;IAEtD,MAAMG,WAAWC,IAAAA,wCAAmB,EAAC;QACnCd;QACAD;QACAW;QACAK,qBAAqBd;QACrBe,mBAAmBd;QACnBC;QACAC;QACAC;QACAY,kBAAkBX;IACpB;IAEA,KAAK,MAAM,CAACY,IAAIC,WAAW,IAAIC,OAAOC,OAAO,CAACd,UAAW;QACvD,IAAIe,MAAMC,OAAO,CAACJ,aAAa;YAC7BR,QAAQa,eAAe,CAACN,IAAI;gBAC1BO,OAAO;gBACPC,WAAWP;gBACXrB,SAAS,CAAC;gBACVU;YACF;QACF,OAAO;YACLG,QAAQa,eAAe,CAACN,IAAIC;QAC9B;IACF;IAEA,OAAO,MAAMR,QAAQgB,KAAK,CAAClB,OAAOI;AACpC"}
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 summary = await scheduler.run(root, targetGraph);
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, targetGraph);\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","summary","run","cleanup","displaySummaryAndExit","reporter","results","exitCode","summarize","visibleTargets","Array","from","filter","target","hidden","length","NoTargetFoundError"],"mappings":"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"}
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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"}
@@ -5,6 +5,7 @@ interface WorkerOptions extends ReporterInitOptions {
5
5
  host?: string;
6
6
  timeout?: number;
7
7
  shutdown: boolean;
8
+ tasks: string[];
8
9
  }
9
10
  export declare function serverAction(options: WorkerOptions): Promise<void>;
10
11
  export {};
@@ -18,7 +18,7 @@ function _interop_require_default(obj) {
18
18
  };
19
19
  }
20
20
  async function serverAction(options) {
21
- const { port = 5332, host = "localhost", timeout = 1 } = options;
21
+ const { port = 5332, host = "localhost", timeout = 1, tasks } = options;
22
22
  const logger = (0, _logger.default)();
23
23
  options.logLevel = options.logLevel ?? "info";
24
24
  options.logFile = options.logFile ?? "node_modules/.cache/lage/server.log";
@@ -34,7 +34,8 @@ async function serverAction(options) {
34
34
  clearCountdown: clearTimer
35
35
  },
36
36
  logger,
37
- maxWorkers: options.concurrency
37
+ concurrency: options.concurrency,
38
+ tasks
38
39
  });
39
40
  const server = await (0, _rpc.createServer)(lageService, abortController);
40
41
  await server.listen({
@@ -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\";\n\ninterface WorkerOptions extends ReporterInitOptions {\n nodeArg?: string[];\n port?: number;\n host?: string;\n timeout?: number;\n shutdown: boolean;\n}\n\nexport async function serverAction(options: WorkerOptions) {\n const { port = 5332, host = \"localhost\", timeout = 1 } = options;\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, server),\n clearCountdown: clearTimer,\n },\n logger,\n maxWorkers: options.concurrency,\n });\n const server = await createServer(lageService, abortController);\n\n await server.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","port","host","timeout","logger","createLogger","logLevel","logFile","reporter","initializeReporters","info","abortController","AbortController","lageService","createLageService","cwd","process","serverControls","countdownToShutdown","resetTimer","server","clearCountdown","clearTimer","maxWorkers","concurrency","createServer","listen","timeoutHandle","globalThis","setTimeout","abort","close","clearTimeout"],"mappings":";;;;+BAcsBA;;;eAAAA;;;+DAdoB;qCAEN;6BACF;qBACL;;;;;;AAUtB,eAAeA,aAAaC,OAAsB;IACvD,MAAM,EAAEC,OAAO,IAAI,EAAEC,OAAO,WAAW,EAAEC,UAAU,CAAC,EAAE,GAAGH;IAEzD,MAAMI,SAASC,IAAAA,eAAY;IAC3BL,QAAQM,QAAQ,GAAGN,QAAQM,QAAQ,IAAI;IACvCN,QAAQO,OAAO,GAAGP,QAAQO,OAAO,IAAI;IACrCP,QAAQQ,QAAQ,GAAGR,QAAQQ,QAAQ,IAAI;IACvCC,IAAAA,wCAAmB,EAACL,QAAQJ;IAE5BI,OAAOM,IAAI,CAAC,CAAC,0BAA0B,EAAER,KAAK,CAAC,EAAED,MAAM;IAEvD,MAAMU,kBAAkB,IAAIC;IAE5B,MAAMC,cAAc,MAAMC,IAAAA,8BAAiB,EAAC;QAC1CC,KAAKC,QAAQD,GAAG;QAChBE,gBAAgB;YACdN;YACAO,qBAAqB,IAAMC,WAAWf,QAAQD,SAASQ,iBAAiBS;YACxEC,gBAAgBC;QAClB;QACAlB;QACAmB,YAAYvB,QAAQwB,WAAW;IACjC;IACA,MAAMJ,SAAS,MAAMK,IAAAA,iBAAY,EAACZ,aAAaF;IAE/C,MAAMS,OAAOM,MAAM,CAAC;QAAExB;QAAMD;IAAK;IACjCG,OAAOM,IAAI,CAAC,CAAC,2BAA2B,EAAER,KAAK,CAAC,EAAED,KAAK,aAAa,EAAEE,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAIwB;AACJ,SAASR,WAAWf,MAAc,EAAED,OAAe,EAAEQ,eAAgC,EAAES,MAAW;IAChGE;IAEAK,gBAAgBC,WAAWC,UAAU,CAAC;QACpCzB,OAAOM,IAAI,CAAC,CAAC,uBAAuB,EAAEP,QAAQ,QAAQ,CAAC;QACvDQ,gBAAgBmB,KAAK;QACrBV,OAAOW,KAAK;IACd,GAAG5B,UAAU;AACf;AAEA,SAASmB;IACP,IAAIK,eAAe;QACjBC,WAAWI,YAAY,CAACL;IAC1B;AACF"}
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\";\n\ninterface WorkerOptions extends ReporterInitOptions {\n nodeArg?: string[];\n port?: number;\n host?: string;\n timeout?: number;\n shutdown: boolean;\n tasks: string[];\n}\n\nexport async function serverAction(options: WorkerOptions) {\n const { port = 5332, host = \"localhost\", timeout = 1, tasks } = options;\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, server),\n clearCountdown: clearTimer,\n },\n logger,\n concurrency: options.concurrency,\n tasks,\n });\n const server = await createServer(lageService, abortController);\n\n await server.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","port","host","timeout","tasks","logger","createLogger","logLevel","logFile","reporter","initializeReporters","info","abortController","AbortController","lageService","createLageService","cwd","process","serverControls","countdownToShutdown","resetTimer","server","clearCountdown","clearTimer","concurrency","createServer","listen","timeoutHandle","globalThis","setTimeout","abort","close","clearTimeout"],"mappings":";;;;+BAesBA;;;eAAAA;;;+DAfoB;qCAEN;6BACF;qBACL;;;;;;AAWtB,eAAeA,aAAaC,OAAsB;IACvD,MAAM,EAAEC,OAAO,IAAI,EAAEC,OAAO,WAAW,EAAEC,UAAU,CAAC,EAAEC,KAAK,EAAE,GAAGJ;IAEhE,MAAMK,SAASC,IAAAA,eAAY;IAC3BN,QAAQO,QAAQ,GAAGP,QAAQO,QAAQ,IAAI;IACvCP,QAAQQ,OAAO,GAAGR,QAAQQ,OAAO,IAAI;IACrCR,QAAQS,QAAQ,GAAGT,QAAQS,QAAQ,IAAI;IACvCC,IAAAA,wCAAmB,EAACL,QAAQL;IAE5BK,OAAOM,IAAI,CAAC,CAAC,0BAA0B,EAAET,KAAK,CAAC,EAAED,MAAM;IAEvD,MAAMW,kBAAkB,IAAIC;IAE5B,MAAMC,cAAc,MAAMC,IAAAA,8BAAiB,EAAC;QAC1CC,KAAKC,QAAQD,GAAG;QAChBE,gBAAgB;YACdN;YACAO,qBAAqB,IAAMC,WAAWf,QAAQF,SAASS,iBAAiBS;YACxEC,gBAAgBC;QAClB;QACAlB;QACAmB,aAAaxB,QAAQwB,WAAW;QAChCpB;IACF;IACA,MAAMiB,SAAS,MAAMI,IAAAA,iBAAY,EAACX,aAAaF;IAE/C,MAAMS,OAAOK,MAAM,CAAC;QAAExB;QAAMD;IAAK;IACjCI,OAAOM,IAAI,CAAC,CAAC,2BAA2B,EAAET,KAAK,CAAC,EAAED,KAAK,aAAa,EAAEE,QAAQ,QAAQ,CAAC;AACzF;AAEA,IAAIwB;AACJ,SAASP,WAAWf,MAAc,EAAEF,OAAe,EAAES,eAAgC,EAAES,MAAW;IAChGE;IAEAI,gBAAgBC,WAAWC,UAAU,CAAC;QACpCxB,OAAOM,IAAI,CAAC,CAAC,uBAAuB,EAAER,QAAQ,QAAQ,CAAC;QACvDS,gBAAgBkB,KAAK;QACrBT,OAAOU,KAAK;IACd,GAAG5B,UAAU;AACf;AAEA,SAASoB;IACP,IAAII,eAAe;QACjBC,WAAWI,YAAY,CAACL;IAC1B;AACF"}
@@ -8,18 +8,13 @@ Object.defineProperty(exports, "serverCommand", {
8
8
  return serverCommand;
9
9
  }
10
10
  });
11
- const _os = /*#__PURE__*/ _interop_require_default(require("os"));
12
11
  const _commander = require("commander");
13
12
  const _action = require("./action.js");
14
13
  const _addLoggerOptions = require("../addLoggerOptions.js");
15
- function _interop_require_default(obj) {
16
- return obj && obj.__esModule ? obj : {
17
- default: obj
18
- };
19
- }
20
14
  const serverCommand = new _commander.Command("server");
21
- serverCommand.option("-c|--concurrency <number>", "max jobs to run at a time", (v)=>parseInt(v), _os.default.cpus().length - 1);
15
+ serverCommand.option("-c|--concurrency <number>", "max jobs to run at a time", (v)=>parseInt(v));
22
16
  serverCommand.option("-h|--host <host>", "lage server host", "localhost");
23
17
  serverCommand.option("-p|--port <port>", "lage worker server port", (v)=>parseInt(v), 5332);
24
- serverCommand.option("-t|--timeout <seconds>", "lage server autoshutoff timeout", (v)=>parseInt(v), 1 * 60);
18
+ serverCommand.option("-t|--timeout <seconds>", "lage server autoshutoff timeout", (v)=>parseInt(v), 5 * 60);
19
+ serverCommand.option("--tasks <tasks...>", "A list of tasks to run, separated by space e.g. 'build test'");
25
20
  (0, _addLoggerOptions.addLoggerOptions)(serverCommand).action(_action.serverAction);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/server/index.ts"],"sourcesContent":["import os from \"os\";\nimport { Command } from \"commander\";\nimport { serverAction } from \"./action.js\";\nimport { addLoggerOptions } from \"../addLoggerOptions.js\";\n\nconst serverCommand = new Command(\"server\");\nserverCommand.option(\"-c|--concurrency <number>\", \"max jobs to run at a time\", (v) => parseInt(v), os.cpus().length - 1);\nserverCommand.option(\"-h|--host <host>\", \"lage server host\", \"localhost\");\nserverCommand.option<number>(\"-p|--port <port>\", \"lage worker server port\", (v) => parseInt(v), 5332);\nserverCommand.option<number>(\"-t|--timeout <seconds>\", \"lage server autoshutoff timeout\", (v) => parseInt(v), 1 * 60);\n\naddLoggerOptions(serverCommand).action(serverAction);\n\nexport { serverCommand };\n"],"names":["serverCommand","Command","option","v","parseInt","os","cpus","length","addLoggerOptions","action","serverAction"],"mappings":";;;;+BAaSA;;;eAAAA;;;2DAbM;2BACS;wBACK;kCACI;;;;;;AAEjC,MAAMA,gBAAgB,IAAIC,kBAAO,CAAC;AAClCD,cAAcE,MAAM,CAAC,6BAA6B,6BAA6B,CAACC,IAAMC,SAASD,IAAIE,WAAE,CAACC,IAAI,GAAGC,MAAM,GAAG;AACtHP,cAAcE,MAAM,CAAC,oBAAoB,oBAAoB;AAC7DF,cAAcE,MAAM,CAAS,oBAAoB,2BAA2B,CAACC,IAAMC,SAASD,IAAI;AAChGH,cAAcE,MAAM,CAAS,0BAA0B,mCAAmC,CAACC,IAAMC,SAASD,IAAI,IAAI;AAElHK,IAAAA,kCAAgB,EAACR,eAAeS,MAAM,CAACC,oBAAY"}
1
+ {"version":3,"sources":["../../../src/commands/server/index.ts"],"sourcesContent":["import os from \"os\";\nimport { Command } from \"commander\";\nimport { serverAction } from \"./action.js\";\nimport { addLoggerOptions } from \"../addLoggerOptions.js\";\n\nconst serverCommand = new Command(\"server\");\nserverCommand.option(\"-c|--concurrency <number>\", \"max jobs to run at a time\", (v) => parseInt(v));\nserverCommand.option(\"-h|--host <host>\", \"lage server host\", \"localhost\");\nserverCommand.option<number>(\"-p|--port <port>\", \"lage worker server port\", (v) => parseInt(v), 5332);\nserverCommand.option<number>(\"-t|--timeout <seconds>\", \"lage server autoshutoff timeout\", (v) => parseInt(v), 5 * 60);\nserverCommand.option(\"--tasks <tasks...>\", \"A list of tasks to run, separated by space e.g. 'build test'\");\n\naddLoggerOptions(serverCommand).action(serverAction);\n\nexport { serverCommand };\n"],"names":["serverCommand","Command","option","v","parseInt","addLoggerOptions","action","serverAction"],"mappings":";;;;+BAcSA;;;eAAAA;;;2BAbe;wBACK;kCACI;AAEjC,MAAMA,gBAAgB,IAAIC,kBAAO,CAAC;AAClCD,cAAcE,MAAM,CAAC,6BAA6B,6BAA6B,CAACC,IAAMC,SAASD;AAC/FH,cAAcE,MAAM,CAAC,oBAAoB,oBAAoB;AAC7DF,cAAcE,MAAM,CAAS,oBAAoB,2BAA2B,CAACC,IAAMC,SAASD,IAAI;AAChGH,cAAcE,MAAM,CAAS,0BAA0B,mCAAmC,CAACC,IAAMC,SAASD,IAAI,IAAI;AAClHH,cAAcE,MAAM,CAAC,sBAAsB;AAE3CG,IAAAA,kCAAgB,EAACL,eAAeM,MAAM,CAACC,oBAAY"}
@@ -6,10 +6,12 @@ interface ServiceControls {
6
6
  countdownToShutdown: () => void;
7
7
  clearCountdown: () => void;
8
8
  }
9
- export declare function createLageService({ cwd, serverControls, logger, maxWorkers, }: {
9
+ interface CreateLageServiceOptions {
10
10
  cwd: string;
11
11
  serverControls: ServiceControls;
12
12
  logger: Logger;
13
- maxWorkers?: number;
14
- }): Promise<ILageService>;
13
+ concurrency?: number;
14
+ tasks: string[];
15
+ }
16
+ export declare function createLageService({ cwd, serverControls, logger, concurrency, tasks, }: CreateLageServiceOptions): Promise<ILageService>;
15
17
  export {};
@@ -18,35 +18,28 @@ const _getOutputFiles = require("./getOutputFiles.js");
18
18
  const _globby = require("@lage-run/globby");
19
19
  const _MemoryStream = require("./MemoryStream.js");
20
20
  const _runnerPickerOptions = require("../../runnerPickerOptions.js");
21
- function findAllTasks(pipeline) {
22
- const tasks = new Set();
23
- for (const key of Object.keys(pipeline)){
24
- if (key.includes("#") || key.startsWith("#") || key.endsWith("//")) {
25
- const { task } = (0, _targetgraph.getPackageAndTask)(key);
26
- tasks.add(task);
27
- } else {
28
- tasks.add(key);
29
- }
30
- }
31
- return Array.from(tasks);
32
- }
21
+ const _filterPipelineDefinitions = require("../run/filterPipelineDefinitions.js");
22
+ const _formathrtime = require("@lage-run/format-hrtime");
33
23
  let initializedPromise;
24
+ function formatBytes(bytes) {
25
+ return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
26
+ }
34
27
  /**
35
28
  * Initializes the lageService: the extra "initializePromise" ensures only one initialization is done at a time across threads
36
29
  * @param cwd
37
30
  * @param logger
38
31
  * @returns
39
- */ async function initialize({ cwd, logger, serverControls, nodeArg, taskArgs, maxWorkers }) {
40
- if (initializedPromise) {
41
- return await initializedPromise;
42
- }
32
+ */ async function initialize({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }) {
43
33
  async function createInitializedPromise() {
44
- logger.info("Initializing context");
34
+ if (initializedPromise) {
35
+ return initializedPromise;
36
+ }
45
37
  const config = await (0, _config.getConfig)(cwd);
46
38
  const root = (0, _workspacetools.getWorkspaceRoot)(cwd);
39
+ const maxWorkers = (0, _config.getConcurrency)(concurrency, config.concurrency);
40
+ logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(", ")}`);
47
41
  const { pipeline } = config;
48
42
  const packageInfos = (0, _workspacetools.getPackageInfos)(root);
49
- const tasks = findAllTasks(pipeline);
50
43
  const targetGraph = await (0, _createTargetGraph.createTargetGraph)({
51
44
  logger,
52
45
  root,
@@ -72,16 +65,24 @@ let initializedPromise;
72
65
  });
73
66
  logger.info("Initializing Package Tree");
74
67
  await packageTree.initialize();
75
- const pool = new _workerthreadspool.WorkerPool({
76
- script: require.resolve("./singleTargetWorker.js"),
68
+ const filteredPipeline = (0, _filterPipelineDefinitions.filterPipelineDefinitions)(targetGraph.targets.values(), config.pipeline);
69
+ const pool = new _workerthreadspool.AggregatedPool({
70
+ logger,
71
+ maxWorkersByGroup: new Map([
72
+ ...(0, _config.getMaxWorkersPerTask)(filteredPipeline, maxWorkers)
73
+ ]),
74
+ groupBy: ({ target })=>target.task,
77
75
  maxWorkers,
76
+ script: require.resolve("./singleTargetWorker.js"),
78
77
  workerOptions: {
79
- stderr: true,
80
78
  stdout: true,
79
+ stderr: true,
81
80
  workerData: {
82
81
  runners: {
83
82
  ...(0, _runnerPickerOptions.runnerPickerOptions)(nodeArg, config.npmClient, taskArgs),
84
- ...config.runners
83
+ ...config.runners,
84
+ shouldCache: false,
85
+ shouldResetCache: false
85
86
  }
86
87
  }
87
88
  }
@@ -89,6 +90,9 @@ let initializedPromise;
89
90
  serverControls.abortController.signal.addEventListener("abort", ()=>{
90
91
  pool?.close();
91
92
  });
93
+ pool?.on("freedWorker", ()=>{
94
+ logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);
95
+ });
92
96
  pool?.on("idle", ()=>{
93
97
  logger.info("All workers are idle, shutting down after timeout");
94
98
  serverControls.countdownToShutdown();
@@ -105,8 +109,7 @@ let initializedPromise;
105
109
  initializedPromise = createInitializedPromise();
106
110
  return await initializedPromise;
107
111
  }
108
- async function createLageService({ cwd, serverControls, logger, maxWorkers }) {
109
- logger.info(`Server started with ${maxWorkers} workers`);
112
+ async function createLageService({ cwd, serverControls, logger, concurrency, tasks }) {
110
113
  return {
111
114
  async ping () {
112
115
  return {
@@ -124,9 +127,9 @@ async function createLageService({ cwd, serverControls, logger, maxWorkers }) {
124
127
  nodeArg: request.nodeOptions,
125
128
  taskArgs: request.taskArgs,
126
129
  serverControls,
127
- maxWorkers
130
+ concurrency,
131
+ tasks
128
132
  });
129
- logger.info("Running target", request);
130
133
  const runners = (0, _runnerPickerOptions.runnerPickerOptions)(request.nodeOptions, config.npmClient, request.taskArgs);
131
134
  const id = (0, _targetgraph.getTargetId)(request.packageName, request.task);
132
135
  if (!targetGraph.targets.has(id)) {
@@ -137,9 +140,6 @@ async function createLageService({ cwd, serverControls, logger, maxWorkers }) {
137
140
  exitCode: 1
138
141
  };
139
142
  }
140
- logger.info("Target found", {
141
- id
142
- });
143
143
  const target = targetGraph.targets.get(id);
144
144
  const task = {
145
145
  target,
@@ -149,6 +149,20 @@ async function createLageService({ cwd, serverControls, logger, maxWorkers }) {
149
149
  const writableStderr = new _MemoryStream.MemoryStream();
150
150
  let pipedStdout;
151
151
  let pipedStderr;
152
+ const targetRun = {
153
+ queueTime: process.hrtime(),
154
+ target,
155
+ duration: [
156
+ 0,
157
+ 0
158
+ ],
159
+ startTime: [
160
+ 0,
161
+ 0
162
+ ],
163
+ status: "queued",
164
+ threadId: 0
165
+ };
152
166
  try {
153
167
  await pool.exec(task, 0, (worker, stdout, stderr)=>{
154
168
  logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);
@@ -156,8 +170,13 @@ async function createLageService({ cwd, serverControls, logger, maxWorkers }) {
156
170
  pipedStderr = stderr;
157
171
  stdout.pipe(writableStdout);
158
172
  stderr.pipe(writableStderr);
173
+ targetRun.threadId = worker.threadId;
174
+ targetRun.status = "running";
175
+ targetRun.startTime = process.hrtime();
159
176
  }, (worker)=>{
160
- logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} end`);
177
+ targetRun.status = "success";
178
+ targetRun.duration = (0, _formathrtime.hrtimeDiff)(targetRun.startTime, process.hrtime());
179
+ logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} end: ${(0, _formathrtime.formatDuration)((0, _formathrtime.hrToSeconds)(targetRun.duration))}`);
161
180
  pipedStdout.unpipe(writableStdout);
162
181
  pipedStderr.unpipe(writableStderr);
163
182
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/server/lageService.ts"],"sourcesContent":["import { type ConfigOptions, getConfig, type PipelineDefinition } from \"@lage-run/config\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { ILageService } from \"@lage-run/rpc\";\nimport { getTargetId, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { getPackageAndTask } from \"@lage-run/target-graph\";\nimport { type Readable } from \"stream\";\nimport { type Pool, WorkerPool } 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\";\n\nfunction findAllTasks(pipeline: PipelineDefinition) {\n const tasks = new Set<string>();\n for (const key of Object.keys(pipeline)) {\n if (key.includes(\"#\") || key.startsWith(\"#\") || key.endsWith(\"//\")) {\n const { task } = getPackageAndTask(key);\n tasks.add(task);\n } else {\n tasks.add(key);\n }\n }\n return Array.from(tasks);\n}\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\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 maxWorkers?: number;\n nodeArg?: string;\n taskArgs: string[];\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({ cwd, logger, serverControls, nodeArg, taskArgs, maxWorkers }: InitializeOptions): Promise<LageServiceContext> {\n if (initializedPromise) {\n return await initializedPromise;\n }\n\n async function createInitializedPromise() {\n logger.info(\"Initializing context\");\n const config = await getConfig(cwd);\n const root = getWorkspaceRoot(cwd)!;\n\n const { pipeline } = config;\n\n const packageInfos = getPackageInfos(root);\n const tasks = findAllTasks(pipeline);\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 });\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 pool = new WorkerPool({\n script: require.resolve(\"./singleTargetWorker.js\"),\n maxWorkers,\n workerOptions: {\n stderr: true,\n stdout: true,\n workerData: {\n runners: {\n ...runnerPickerOptions(nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n },\n },\n },\n });\n\n serverControls.abortController.signal.addEventListener(\"abort\", () => {\n pool?.close();\n });\n\n pool?.on(\"idle\", () => {\n logger.info(\"All workers are idle, shutting down after timeout\");\n serverControls.countdownToShutdown();\n });\n\n return { config, targetGraph, packageTree, dependencyMap, root, pool };\n }\n\n initializedPromise = createInitializedPromise();\n\n return await initializedPromise;\n}\n\nexport async function createLageService({\n cwd,\n serverControls,\n logger,\n maxWorkers,\n}: {\n cwd: string;\n serverControls: ServiceControls;\n logger: Logger;\n maxWorkers?: number;\n}): Promise<ILageService> {\n logger.info(`Server started with ${maxWorkers} workers`);\n\n return {\n async ping() {\n return { pong: true };\n },\n\n async runTarget(request) {\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 } = await initialize({\n cwd,\n logger,\n nodeArg: request.nodeOptions,\n taskArgs: request.taskArgs,\n serverControls,\n maxWorkers,\n });\n\n logger.info(\"Running target\", request);\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(\"Target found\", { id });\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 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 (worker) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} end`);\n pipedStdout.unpipe(writableStdout);\n pipedStderr.unpipe(writableStderr);\n }\n );\n\n const globalInputs = target.environmentGlob\n ? glob(target.environmentGlob, { cwd: root, gitignore: true })\n : config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n const inputs = (getInputFiles(target, dependencyMap, packageTree) ?? []).concat(globalInputs);\n\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n hash: \"\",\n inputs,\n outputs: getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree),\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n };\n } catch (e) {\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n hash: \"\",\n inputs: [],\n outputs: [],\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n };\n }\n },\n };\n}\n"],"names":["createLageService","findAllTasks","pipeline","tasks","Set","key","Object","keys","includes","startsWith","endsWith","task","getPackageAndTask","add","Array","from","initializedPromise","initialize","cwd","logger","serverControls","nodeArg","taskArgs","maxWorkers","createInitializedPromise","info","config","getConfig","root","getWorkspaceRoot","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","pool","WorkerPool","script","require","resolve","workerOptions","stderr","stdout","workerData","runners","runnerPickerOptions","npmClient","abortController","signal","addEventListener","close","on","countdownToShutdown","ping","pong","runTarget","request","clearCountdown","nodeOptions","id","getTargetId","packageName","targets","has","exitCode","target","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","exec","worker","threadId","pipe","unpipe","globalInputs","environmentGlob","glob","gitignore","inputs","getInputFiles","concat","hash","getOutputFiles","toString","e","Error"],"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 type { ILageService } from \"@lage-run/rpc\";\nimport { getTargetId, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { type Readable } from \"stream\";\nimport { type Pool, AggregatedPool } from \"@lage-run/worker-threads-pool\";\nimport { getInputFiles, 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\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\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\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({\n cwd,\n logger,\n serverControls,\n nodeArg,\n taskArgs,\n concurrency,\n tasks,\n}: InitializeOptions): Promise<LageServiceContext> {\n async function createInitializedPromise() {\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 });\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 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 });\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 return { config, targetGraph, packageTree, dependencyMap, root, pool };\n }\n\n initializedPromise = createInitializedPromise();\n\n return await 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 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 } = 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 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 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 globalInputs = target.environmentGlob\n ? glob(target.environmentGlob, { cwd: root, gitignore: true })\n : config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n const inputs = (getInputFiles(target, dependencyMap, packageTree) ?? []).concat(globalInputs);\n\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n hash: \"\",\n inputs,\n outputs: getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree),\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n };\n } catch (e) {\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n hash: \"\",\n inputs: [],\n outputs: [],\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n };\n }\n },\n };\n}\n"],"names":["createLageService","initializedPromise","formatBytes","bytes","toFixed","initialize","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","createInitializedPromise","config","getConfig","root","getWorkspaceRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","filteredPipeline","filterPipelineDefinitions","targets","values","pool","AggregatedPool","maxWorkersByGroup","Map","getMaxWorkersPerTask","groupBy","target","task","script","require","resolve","workerOptions","stdout","stderr","workerData","runners","runnerPickerOptions","npmClient","shouldCache","shouldResetCache","abortController","signal","addEventListener","close","on","silly","stats","maxWorkerMemoryUsage","countdownToShutdown","ping","pong","runTarget","request","clearCountdown","nodeOptions","id","getTargetId","packageName","has","exitCode","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","targetRun","queueTime","process","hrtime","duration","startTime","status","threadId","exec","worker","pipe","hrtimeDiff","formatDuration","hrToSeconds","unpipe","globalInputs","environmentGlob","glob","gitignore","inputs","getInputFiles","concat","hash","getOutputFiles","toString","e","Error"],"mappings":"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"}
@@ -17,48 +17,7 @@ _export(exports, {
17
17
  }
18
18
  });
19
19
  const _workspacetools = require("workspace-tools");
20
- const _fastglob = /*#__PURE__*/ _interop_require_wildcard(require("fast-glob"));
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 {\n getScopedPackages,\n getChangedPackages,\n getBranchChanges,\n getTransitiveDependents,\n getTransitiveDependencies,\n} from \"workspace-tools\";\nimport * as fg from \"fast-glob\";\nimport type { Logger } from \"@lage-run/logger\";\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\nfunction 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\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","environmentGlob","changedFiles","getBranchChanges","envFiles","fg","sync","cwd","repoWideChanged","change","includes","filtered","filter","pkg","getTransitiveDependents","getTransitiveDependencies","unique"],"mappings":"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"}
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,2 @@
1
+ import type { Logger } from "@lage-run/logger";
2
+ export declare function hasRepoChanged(since: string, root: string, environmentGlob: string[], logger: Logger): boolean;