From 1475fc5b088cc3cb2d086ff90e6ada7b0835a252 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 19:59:17 +0000 Subject: [PATCH 01/36] beginning to do ts-fix --- package.json | 2 +- packages/globby/package.json | 2 +- packages/logger/src/Logger.ts | 16 ++++++++-------- packages/logger/src/index.ts | 2 +- packages/tsconfig.lage2.json | 4 +++- yarn.lock | 20 ++++++++++---------- 6 files changed, 24 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 91fd096c1..f7c787815 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "prettier": "^2.8.6", "syncpack": "^9.0.0", "ts-node": "^10.9.1", - "typescript": "~5.0.3" + "typescript": "~5.7.3" }, "lint-staged": { "!(*test).{ts,js}": "eslint --fix", diff --git a/packages/globby/package.json b/packages/globby/package.json index 7af27baae..df8f92b05 100644 --- a/packages/globby/package.json +++ b/packages/globby/package.json @@ -11,7 +11,7 @@ "dts-bundle-generator": "^9.5.1", "esbuild": "^0.21.5", "globby": "^14.0.2", - "typescript": "~5.0.3" + "typescript": "~5.7.3" }, "exports": { ".": { diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index 69af3842d..ba1395aab 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -6,7 +6,7 @@ import { createInterface } from "readline"; export class Logger { reporters: Reporter[] = []; - log(level: LogLevel, msg: string, data?: TLogStructuredData) { + log(level: LogLevel, msg: string, data?: TLogStructuredData): void { const entry = { timestamp: Date.now(), level, @@ -19,23 +19,23 @@ export class Logger { + return (): void => { readline.off("line", lineLogger); readline.close(); }; } - addReporter(reporter: Reporter) { + addReporter(reporter: Rep: voidorter:: void any:: void any:: void any:: void any:: void any) { this.reporters.push(reporter); } } diff --git a/packages/logger/src/index.ts b/packages/logger/src/index.ts index 55e587043..5c76b78df 100644 --- a/packages/logger/src/index.ts +++ b/packages/logger/src/index.ts @@ -1,7 +1,7 @@ import type { LogStructuredData } from "./interfaces/LogStructuredData.js"; import { Logger } from "./Logger.js"; -export default function createLogger() { +export default function createLogger(): Logger { return new Logger(); } diff --git a/packages/tsconfig.lage2.json b/packages/tsconfig.lage2.json index 0ddab5100..dac7a0cb0 100644 --- a/packages/tsconfig.lage2.json +++ b/packages/tsconfig.lage2.json @@ -14,6 +14,8 @@ "skipLibCheck": true, "noUnusedLocals": false, "sourceMap": true, - "typeRoots": ["../node_modules/@types", "../types", "node_modules/@types"] + "typeRoots": ["../node_modules/@types", "../types", "node_modules/@types"], + "isolatedDeclarations": true, + "isolatedModules": true } } diff --git a/yarn.lock b/yarn.lock index 47214f6a2..95da36995 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1776,7 +1776,7 @@ __metadata: dts-bundle-generator: "npm:^9.5.1" esbuild: "npm:^0.21.5" globby: "npm:^14.0.2" - typescript: "npm:~5.0.3" + typescript: "npm:~5.7.3" languageName: unknown linkType: soft @@ -1814,7 +1814,7 @@ __metadata: prettier: "npm:^2.8.6" syncpack: "npm:^9.0.0" ts-node: "npm:^10.9.1" - typescript: "npm:~5.0.3" + typescript: "npm:~5.7.3" languageName: unknown linkType: soft @@ -8359,13 +8359,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~5.0.3": - version: 5.0.4 - resolution: "typescript@npm:5.0.4" +"typescript@npm:~5.7.3": + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/2f5bd1cead194905957cb34e220b1d6ff1662399adef8ec1864f74620922d860ee35b6e50eafb3b636ea6fd437195e454e1146cb630a4236b5095ed7617395c2 + checksum: 10c0/b7580d716cf1824736cc6e628ab4cd8b51877408ba2be0869d2866da35ef8366dd6ae9eb9d0851470a39be17cbd61df1126f9e211d8799d764ea7431d5435afa languageName: node linkType: hard @@ -8389,13 +8389,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A~5.0.3#optional!builtin": - version: 5.0.4 - resolution: "typescript@patch:typescript@npm%3A5.0.4#optional!builtin::version=5.0.4&hash=b5f058" +"typescript@patch:typescript@npm%3A~5.7.3#optional!builtin": + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=8c6c40" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/c3f7b80577bddf6fab202a7925131ac733bfc414aec298c2404afcddc7a6f242cfa8395cf2d48192265052e11a7577c27f6e5fac8d8fe6a6602023c83d6b3292 + checksum: 10c0/3b56d6afa03d9f6172d0b9cdb10e6b1efc9abc1608efd7a3d2f38773d5d8cfb9bbc68dfb72f0a7de5e8db04fc847f4e4baeddcd5ad9c9feda072234f0d788896 languageName: node linkType: hard From a7562832cc8883f54133f1d5e9b498bc3b0d3108 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 20:32:40 +0000 Subject: [PATCH 02/36] fixing up the logger ts --- packages/logger/src/Logger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index ba1395aab..45054b1e2 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -58,7 +58,7 @@ export class Logger Date: Wed, 15 Jan 2025 20:35:33 +0000 Subject: [PATCH 03/36] add return types to format-hrtime package --- packages/format-hrtime/src/formatDuration.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/format-hrtime/src/formatDuration.ts b/packages/format-hrtime/src/formatDuration.ts index 99df72c9c..7cd3e48cf 100644 --- a/packages/format-hrtime/src/formatDuration.ts +++ b/packages/format-hrtime/src/formatDuration.ts @@ -1,4 +1,4 @@ -export function formatDuration(seconds: string) { +export function formatDuration(seconds: string): string { const raw = parseFloat(seconds); if (raw > 60) { const minutes = Math.floor(raw / 60); @@ -10,7 +10,7 @@ export function formatDuration(seconds: string) { } } -export function hrToSeconds(hrtime: [number, number]) { +export function hrToSeconds(hrtime: [number, number]): string { const raw = hrtime[0] + hrtime[1] / 1e9; return raw.toFixed(2); } From 89e748c682d67babb885a567f6640705c7d8d82f Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 20:38:47 +0000 Subject: [PATCH 04/36] fixing globby --- packages/globby/src/index.mts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/globby/src/index.mts b/packages/globby/src/index.mts index 4e152ca67..571349eea 100644 --- a/packages/globby/src/index.mts +++ b/packages/globby/src/index.mts @@ -6,7 +6,7 @@ function cacheKey(patterns: string[], options: Options = {}) { return JSON.stringify({ patterns, options }); } -export async function globAsync(patterns: string[], options?: Options) { +export async function globAsync(patterns: string[], options?: Options): Promise { const key = cacheKey(patterns, options); if (!cache.has(key)) { cache.set(key, await globby(patterns, options)); @@ -14,7 +14,7 @@ export async function globAsync(patterns: string[], options?: Options) { return cache.get(key) || []; } -export function glob(patterns: string[], options?: Options) { +export function glob(patterns: string[], options?: Options): string[] { const key = cacheKey(patterns, options); if (!cache.has(key)) { cache.set(key, globbySync(patterns, options)); From 15c151d84dec044c8ccc45d1080cfb691a5c88f7 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 20:39:07 +0000 Subject: [PATCH 05/36] cannot have both allowJs and isolatedDecl at the same time --- packages/tsconfig.lage2.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/tsconfig.lage2.json b/packages/tsconfig.lage2.json index dac7a0cb0..ce74812f7 100644 --- a/packages/tsconfig.lage2.json +++ b/packages/tsconfig.lage2.json @@ -5,7 +5,6 @@ "moduleResolution": "Node16", "declaration": true, "lib": ["ES2020"], - "allowJs": true, "strict": true, "noImplicitAny": false, "allowSyntheticDefaultImports": true, From 2db9ff31bcb2e3744a17303a652824fc59f128b2 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 20:40:01 +0000 Subject: [PATCH 06/36] return types added for monorepo-fixture --- packages/monorepo-fixture/src/monorepo.ts | 30 +++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/monorepo-fixture/src/monorepo.ts b/packages/monorepo-fixture/src/monorepo.ts index 9bb7182e2..1fe9126f3 100644 --- a/packages/monorepo-fixture/src/monorepo.ts +++ b/packages/monorepo-fixture/src/monorepo.ts @@ -5,13 +5,13 @@ import * as path from "path"; import execa from "execa"; export class Monorepo { - static tmpdir = os.tmpdir(); + static tmpdir: string = os.tmpdir(); root: string; lagePath: string; - get nodeModulesPath() { + get nodeModulesPath(): string { return path.join(this.root, "node_modules"); } @@ -20,7 +20,7 @@ export class Monorepo { this.lagePath = path.join(this.nodeModulesPath, "@lage-run"); } - async init(fixturePath?: string) { + async init(fixturePath?: string): Promise { const options = { cwd: this.root }; const cwd = this.root; await execa("git", ["init"], options); @@ -39,7 +39,7 @@ export class Monorepo { } } - async install() { + async install(): Promise { if (!existsSync(this.nodeModulesPath)) { await fs.mkdir(this.nodeModulesPath, { recursive: true }); } @@ -66,7 +66,7 @@ export class Monorepo { /** * Simulates a "yarn" call by linking internal packages and generates a yarn.lock file */ - async linkPackages() { + async linkPackages(): Promise { const pkgs = await fs.readdir(path.join(this.root, "packages")); if (!existsSync(this.nodeModulesPath)) { @@ -94,7 +94,7 @@ export class Monorepo { await this.commitFiles({ "yarn.lock": yarnYaml }); } - async generateRepoFiles() { + async generateRepoFiles(): Promise { const lagePath = path.join(this.nodeModulesPath, "lage/lib/cli"); await this.commitFiles({ @@ -127,13 +127,13 @@ export class Monorepo { }); } - async setLageConfig(contents: string) { + async setLageConfig(contents: string): Promise { await this.commitFiles({ "lage.config.js": contents, }); } - async addPackage(name: string, internalDeps: string[] = [], scripts?: { [script: string]: string }) { + async addPackage(name: string, internalDeps: string[] = [], scripts?: { [script: string]: string }): Promise { return await this.commitFiles({ [`packages/${name}/build.js`]: `console.log('building ${name}');`, [`packages/${name}/test.js`]: `console.log('building ${name}');`, @@ -156,15 +156,15 @@ export class Monorepo { }); } - clone(origin: string) { + clone(origin: string): execa.ExecaChildProcess { return execa("git", ["clone", origin], { cwd: this.root }); } - push(origin: string, branch: string) { + push(origin: string, branch: string): execa.ExecaChildProcess { return execa("git", ["push", origin, branch], { cwd: this.root }); } - async writeFiles(files: { [file: string]: string | object }, options: { executable?: boolean } = {}) { + async writeFiles(files: { [file: string]: string | object }, options: { executable?: boolean } = {}): Promise { for (const [file, contents] of Object.entries(files)) { let out = ""; if (typeof contents !== "string") { @@ -187,7 +187,7 @@ export class Monorepo { } } - async readFiles(files: string[]) { + async readFiles(files: string[]): Promise<{}> { const contents = {}; for (const file of files) { const fullPath = path.isAbsolute(file) ? file : path.join(this.root, file); @@ -200,7 +200,7 @@ export class Monorepo { return contents; } - async commitFiles(files: { [name: string]: string | object }, options: { executable?: boolean } = {}) { + async commitFiles(files: { [name: string]: string | object }, options: { executable?: boolean } = {}): Promise { await this.writeFiles(files, options); await execa("git", ["add", "--", ...Object.keys(files)], { cwd: this.root, @@ -208,14 +208,14 @@ export class Monorepo { await execa("git", ["commit", "-m", "commit files"], { cwd: this.root }); } - run(command: string, args?: string[], silent?: boolean) { + run(command: string, args?: string[], silent?: boolean): execa.ExecaChildProcess { return execa("yarn", [...(silent === true ? ["--silent"] : []), command, ...(args || [])], { cwd: this.root, shell: true, }); } - async cleanup() { + async cleanup(): Promise { const maxRetries = 5; let attempts = 0; From 80e4ddca9109e5187e04a8128917fd94fcb67a85 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 20:50:18 +0000 Subject: [PATCH 07/36] adding return types to target-graph --- packages/target-graph/src/TargetFactory.ts | 4 ++-- packages/target-graph/src/TargetGraphBuilder.ts | 12 ++++++++---- .../target-graph/src/WorkspaceTargetGraphBuilder.ts | 10 ++++++---- packages/target-graph/src/detectCycles.ts | 8 +++++++- packages/target-graph/src/expandDepSpecs.ts | 2 +- packages/target-graph/src/prioritize.ts | 2 +- packages/target-graph/src/sortTargetsByPriority.ts | 2 +- packages/target-graph/src/targetId.ts | 10 ++++++++-- 8 files changed, 34 insertions(+), 16 deletions(-) diff --git a/packages/target-graph/src/TargetFactory.ts b/packages/target-graph/src/TargetFactory.ts index e8359d119..817000064 100644 --- a/packages/target-graph/src/TargetFactory.ts +++ b/packages/target-graph/src/TargetFactory.ts @@ -12,7 +12,7 @@ export interface TargetFactoryOptions { } export class TargetFactory { - packageScripts = new Set(); + packageScripts: Set = new Set(); constructor(private options: TargetFactoryOptions) { const { packageInfos } = options; @@ -23,7 +23,7 @@ export class TargetFactory { } } - getTargetType(task: string, config: TargetConfig) { + getTargetType(task: string, config: TargetConfig): string { if (!config.type) { if (this.packageScripts.has(task)) { return "npmScript"; diff --git a/packages/target-graph/src/TargetGraphBuilder.ts b/packages/target-graph/src/TargetGraphBuilder.ts index 58caefbf9..45a6a5eac 100644 --- a/packages/target-graph/src/TargetGraphBuilder.ts +++ b/packages/target-graph/src/TargetGraphBuilder.ts @@ -62,13 +62,13 @@ export class TargetGraphBuilder { } as Target); } - addTarget(target: Target) { + addTarget(target: Target): Target { this.targets.set(target.id, target); this.addDependency(getStartTargetId(), target.id); return target; } - addDependency(dependency: string, dependent: string) { + addDependency(dependency: string, dependent: string): void { if (this.targets.has(dependent)) { const target = this.targets.get(dependent)!; @@ -89,7 +89,9 @@ export class TargetGraphBuilder { /** * Builds a target graph for given tasks and packages */ - build() { + build(): { + targets: Map; + } { // Ensure we do not have cycles in the subgraph const cycleInfo = detectCycles(this.targets); if (cycleInfo.hasCycle) { @@ -104,7 +106,9 @@ export class TargetGraphBuilder { }; } - subgraph(entriesTargetIds: string[]) { + subgraph(entriesTargetIds: string[]): { + targets: Map; + } { const subgraphBuilder = new TargetGraphBuilder(); const visited: Set = new Set(); const queue: string[] = []; diff --git a/packages/target-graph/src/WorkspaceTargetGraphBuilder.ts b/packages/target-graph/src/WorkspaceTargetGraphBuilder.ts index 9a5ec3b48..9b746375e 100644 --- a/packages/target-graph/src/WorkspaceTargetGraphBuilder.ts +++ b/packages/target-graph/src/WorkspaceTargetGraphBuilder.ts @@ -67,7 +67,7 @@ export class WorkspaceTargetGraphBuilder { * @param id * @param targetDefinition */ - async addTargetConfig(id: string, config: TargetConfig = {}, changedFiles?: string[]) { + async addTargetConfig(id: string, config: TargetConfig = {}, changedFiles?: string[]): Promise { // Generates a target definition from the target config if (id.startsWith("//") || id.startsWith("#")) { const target = this.targetFactory.createGlobalTarget(id, config); @@ -101,7 +101,7 @@ export class WorkspaceTargetGraphBuilder { * @param parentTarget * @param config */ - async processStagedConfig(parentTarget: Target, config: TargetConfig, changedFiles?: string[]) { + async processStagedConfig(parentTarget: Target, config: TargetConfig, changedFiles?: string[]): Promise { if (typeof config.stagedTarget === "undefined") { return; } @@ -145,7 +145,7 @@ export class WorkspaceTargetGraphBuilder { } } - shouldRun(config: TargetConfig, target: Target) { + shouldRun(config: TargetConfig, target: Target): boolean | Promise { if (typeof config.shouldRun === "function") { return config.shouldRun(target); } @@ -166,7 +166,9 @@ export class WorkspaceTargetGraphBuilder { * @param scope * @param priorities the set of global priorities for the workspace. */ - async build(tasks: string[], scope?: string[], priorities?: { package?: string; task: string; priority: number }[]) { + async build(tasks: string[], scope?: string[], priorities?: { package?: string; task: string; priority: number }[]): Promise<{ + targets: Map; + }> { // Expands the dependency specs from the target definitions const fullDependencies = expandDepSpecs(this.graphBuilder.targets, this.dependencyMap); diff --git a/packages/target-graph/src/detectCycles.ts b/packages/target-graph/src/detectCycles.ts index 23cdc1648..8ea34be31 100644 --- a/packages/target-graph/src/detectCycles.ts +++ b/packages/target-graph/src/detectCycles.ts @@ -4,7 +4,13 @@ import type { Target } from "./types/Target.js"; * Checks for any cycles in the dependency graph, returning `{ hasCycle: false }` if no cycles were detected. * Otherwise it returns the chain of nodes where the cycle was detected. */ -export function detectCycles(targets: Map) { +export function detectCycles(targets: Map): { + hasCycle: boolean; + cycle: string[]; +} | { + hasCycle: boolean; + cycle?: undefined; +} { /** * A map to keep track of the visited and visiting nodes. * entry means it is currently being visited. diff --git a/packages/target-graph/src/expandDepSpecs.ts b/packages/target-graph/src/expandDepSpecs.ts index f4861d06d..2992832c5 100644 --- a/packages/target-graph/src/expandDepSpecs.ts +++ b/packages/target-graph/src/expandDepSpecs.ts @@ -5,7 +5,7 @@ import { getPackageAndTask, getStartTargetId, getTargetId } from "./targetId.js" /** * Expands the dependency graph by adding all transitive dependencies of the given targets. */ -export function expandDepSpecs(targets: Map, dependencyMap: DependencyMap) { +export function expandDepSpecs(targets: Map, dependencyMap: DependencyMap): [string, string][] { const dependencies: [string, string][] = []; /** diff --git a/packages/target-graph/src/prioritize.ts b/packages/target-graph/src/prioritize.ts index 09c546f0a..9ccd8465e 100644 --- a/packages/target-graph/src/prioritize.ts +++ b/packages/target-graph/src/prioritize.ts @@ -52,7 +52,7 @@ function reverseTopoSort(targets: Map, nodesWithNoDependencies: /** * Priorities for a target is actually the MAX of all the priorities of the targets that depend on it plus the current priority. */ -export function prioritize(targets: Map) { +export function prioritize(targets: Map): void { const nodeCumulativePriorities = new Map(); const nodesWithNoDependencies = getNodesWithNoDependencies(targets); diff --git a/packages/target-graph/src/sortTargetsByPriority.ts b/packages/target-graph/src/sortTargetsByPriority.ts index 6f08ffc4d..961c7f2f6 100644 --- a/packages/target-graph/src/sortTargetsByPriority.ts +++ b/packages/target-graph/src/sortTargetsByPriority.ts @@ -1,6 +1,6 @@ import type { Target } from "./types/Target.js"; -export function sortTargetsByPriority(targets: Target[]) { +export function sortTargetsByPriority(targets: Target[]): Target[] { return targets.sort((a, b) => { return (b.priority ?? 0) - (a.priority ?? 0); }); diff --git a/packages/target-graph/src/targetId.ts b/packages/target-graph/src/targetId.ts index e6dc67547..6354daa2a 100644 --- a/packages/target-graph/src/targetId.ts +++ b/packages/target-graph/src/targetId.ts @@ -18,7 +18,13 @@ export function getTargetId(pkgName: string | undefined, task: string) { * @param targetId * @returns */ -export function getPackageAndTask(targetId: string) { +export function getPackageAndTask(targetId: string): { + packageName: undefined; + task: string; +} | { + packageName: string; + task: string; +} { if (targetId.startsWith("Δ")) { return { packageName: undefined, task: targetId.slice(1) }; } else if (targetId.includes("#")) { @@ -36,7 +42,7 @@ export function getPackageAndTask(targetId: string) { } const START_TARGET_ID = "__start"; -export function getStartTargetId() { +export function getStartTargetId(): string { return START_TARGET_ID; } From e9d9e39ae0572373c36ce8090229dc0d54a235e5 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 20:59:18 +0000 Subject: [PATCH 08/36] fixing up target-graph and rpc packages --- packages/rpc/src/createClient.ts | 22 +++++++++++++++++-- packages/rpc/src/createRoutes.ts | 2 +- packages/rpc/src/createServer.ts | 2 +- .../target-graph/src/TargetGraphBuilder.ts | 9 +++----- .../src/WorkspaceTargetGraphBuilder.ts | 9 +++++--- packages/target-graph/src/detectCycles.ts | 7 ++---- packages/target-graph/src/targetId.ts | 7 ++---- 7 files changed, 35 insertions(+), 23 deletions(-) diff --git a/packages/rpc/src/createClient.ts b/packages/rpc/src/createClient.ts index fb4854920..d45235e50 100644 --- a/packages/rpc/src/createClient.ts +++ b/packages/rpc/src/createClient.ts @@ -1,6 +1,8 @@ -import { createPromiseClient } from "@connectrpc/connect"; +import { createPromiseClient, PromiseClient } from "@connectrpc/connect"; import { createGrpcTransport } from "@connectrpc/connect-node"; import { LageService } from "./gen/lage/v1/lage_connect.js"; +import { MethodKind } from "@bufbuild/protobuf"; +import { RunTargetRequest, RunTargetResponse, PingRequest, PingResponse } from "./gen/lage/v1/lage_pb.js"; export interface CreateClientOptions { baseUrl: string; @@ -9,7 +11,23 @@ export interface CreateClientOptions { export type LageClient = ReturnType; -export function createClient({ baseUrl, httpVersion }: CreateClientOptions) { +export function createClient({ baseUrl, httpVersion }: CreateClientOptions): PromiseClient<{ + readonly typeName: "connectrpc.lage.v1.LageService"; + readonly methods: { + readonly runTarget: { + readonly name: "RunTarget"; + readonly I: RunTargetRequest; + readonly O: RunTargetResponse; + readonly kind: MethodKind.Unary; + }; + readonly ping: { + readonly name: "Ping"; + readonly I: PingRequest; + readonly O: PingResponse; + readonly kind: MethodKind.Unary; + }; + }; +}> { const transport = createGrpcTransport({ httpVersion, baseUrl, diff --git a/packages/rpc/src/createRoutes.ts b/packages/rpc/src/createRoutes.ts index 0afec6890..2313a693e 100644 --- a/packages/rpc/src/createRoutes.ts +++ b/packages/rpc/src/createRoutes.ts @@ -3,7 +3,7 @@ import { LageService } from "./gen/lage/v1/lage_connect.js"; import { type ILageService } from "./types/ILageService.js"; export function createRoutes(serviceImpl: ILageService) { - return (router: ConnectRouter) => { + return (router: ConnectRouter): void => { router.service(LageService, serviceImpl); }; } diff --git a/packages/rpc/src/createServer.ts b/packages/rpc/src/createServer.ts index f259d2710..55b732a9f 100644 --- a/packages/rpc/src/createServer.ts +++ b/packages/rpc/src/createServer.ts @@ -3,7 +3,7 @@ import { fastifyConnectPlugin } from "@connectrpc/connect-fastify"; import { createRoutes } from "./createRoutes.js"; import type { ILageService } from "./types/ILageService.js"; -export async function createServer(lageService: ILageService, abortController: AbortController) { +export async function createServer(lageService: ILageService, abortController: AbortController): Promise> { const server = fastify({ http2: true, }); diff --git a/packages/target-graph/src/TargetGraphBuilder.ts b/packages/target-graph/src/TargetGraphBuilder.ts index 45a6a5eac..0df2c8b0f 100644 --- a/packages/target-graph/src/TargetGraphBuilder.ts +++ b/packages/target-graph/src/TargetGraphBuilder.ts @@ -3,6 +3,7 @@ import { prioritize } from "./prioritize.js"; import { detectCycles } from "./detectCycles.js"; import type { Target } from "./types/Target.js"; +import type { TargetGraph } from "./types/TargetGraph.js"; /** * Target graph builder @@ -89,9 +90,7 @@ export class TargetGraphBuilder { /** * Builds a target graph for given tasks and packages */ - build(): { - targets: Map; - } { + build(): TargetGraph { // Ensure we do not have cycles in the subgraph const cycleInfo = detectCycles(this.targets); if (cycleInfo.hasCycle) { @@ -106,9 +105,7 @@ export class TargetGraphBuilder { }; } - subgraph(entriesTargetIds: string[]): { - targets: Map; - } { + subgraph(entriesTargetIds: string[]): TargetGraph { const subgraphBuilder = new TargetGraphBuilder(); const visited: Set = new Set(); const queue: string[] = []; diff --git a/packages/target-graph/src/WorkspaceTargetGraphBuilder.ts b/packages/target-graph/src/WorkspaceTargetGraphBuilder.ts index 9b746375e..58c52cbd0 100644 --- a/packages/target-graph/src/WorkspaceTargetGraphBuilder.ts +++ b/packages/target-graph/src/WorkspaceTargetGraphBuilder.ts @@ -8,6 +8,7 @@ import type { DependencyMap } from "workspace-tools/lib/graph/createDependencyMa import type { PackageInfos } from "workspace-tools"; import type { Target } from "./types/Target.js"; import type { TargetConfig } from "./types/TargetConfig.js"; +import type { TargetGraph } from "./types/TargetGraph.js"; import { TargetGraphBuilder } from "./TargetGraphBuilder.js"; import { TargetFactory } from "./TargetFactory.js"; import pLimit from "p-limit"; @@ -166,9 +167,11 @@ export class WorkspaceTargetGraphBuilder { * @param scope * @param priorities the set of global priorities for the workspace. */ - async build(tasks: string[], scope?: string[], priorities?: { package?: string; task: string; priority: number }[]): Promise<{ - targets: Map; - }> { + async build( + tasks: string[], + scope?: string[], + priorities?: { package?: string; task: string; priority: number }[] + ): Promise { // Expands the dependency specs from the target definitions const fullDependencies = expandDepSpecs(this.graphBuilder.targets, this.dependencyMap); diff --git a/packages/target-graph/src/detectCycles.ts b/packages/target-graph/src/detectCycles.ts index 8ea34be31..9cdba390a 100644 --- a/packages/target-graph/src/detectCycles.ts +++ b/packages/target-graph/src/detectCycles.ts @@ -5,11 +5,8 @@ import type { Target } from "./types/Target.js"; * Otherwise it returns the chain of nodes where the cycle was detected. */ export function detectCycles(targets: Map): { - hasCycle: boolean; - cycle: string[]; -} | { - hasCycle: boolean; - cycle?: undefined; + hasCycle: boolean; + cycle?: string[]; } { /** * A map to keep track of the visited and visiting nodes. diff --git a/packages/target-graph/src/targetId.ts b/packages/target-graph/src/targetId.ts index 6354daa2a..b49822402 100644 --- a/packages/target-graph/src/targetId.ts +++ b/packages/target-graph/src/targetId.ts @@ -19,11 +19,8 @@ export function getTargetId(pkgName: string | undefined, task: string) { * @returns */ export function getPackageAndTask(targetId: string): { - packageName: undefined; - task: string; -} | { - packageName: string; - task: string; + packageName?: string; + task: string; } { if (targetId.startsWith("Δ")) { return { packageName: undefined, task: targetId.slice(1) }; From 59ee2e6dcff9e9ca072895a7f12be260e1f09a34 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:00:02 +0000 Subject: [PATCH 09/36] updates to rpc --- packages/rpc/src/createClient.ts | 22 ++-------------------- packages/rpc/src/createServer.ts | 9 ++++++++- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/packages/rpc/src/createClient.ts b/packages/rpc/src/createClient.ts index d45235e50..19e6f921a 100644 --- a/packages/rpc/src/createClient.ts +++ b/packages/rpc/src/createClient.ts @@ -1,8 +1,6 @@ -import { createPromiseClient, PromiseClient } from "@connectrpc/connect"; +import { createPromiseClient, type PromiseClient } from "@connectrpc/connect"; import { createGrpcTransport } from "@connectrpc/connect-node"; import { LageService } from "./gen/lage/v1/lage_connect.js"; -import { MethodKind } from "@bufbuild/protobuf"; -import { RunTargetRequest, RunTargetResponse, PingRequest, PingResponse } from "./gen/lage/v1/lage_pb.js"; export interface CreateClientOptions { baseUrl: string; @@ -11,23 +9,7 @@ export interface CreateClientOptions { export type LageClient = ReturnType; -export function createClient({ baseUrl, httpVersion }: CreateClientOptions): PromiseClient<{ - readonly typeName: "connectrpc.lage.v1.LageService"; - readonly methods: { - readonly runTarget: { - readonly name: "RunTarget"; - readonly I: RunTargetRequest; - readonly O: RunTargetResponse; - readonly kind: MethodKind.Unary; - }; - readonly ping: { - readonly name: "Ping"; - readonly I: PingRequest; - readonly O: PingResponse; - readonly kind: MethodKind.Unary; - }; - }; -}> { +export function createClient({ baseUrl, httpVersion }: CreateClientOptions): PromiseClient { const transport = createGrpcTransport({ httpVersion, baseUrl, diff --git a/packages/rpc/src/createServer.ts b/packages/rpc/src/createServer.ts index 55b732a9f..c59faf3f5 100644 --- a/packages/rpc/src/createServer.ts +++ b/packages/rpc/src/createServer.ts @@ -3,10 +3,17 @@ import { fastifyConnectPlugin } from "@connectrpc/connect-fastify"; import { createRoutes } from "./createRoutes.js"; import type { ILageService } from "./types/ILageService.js"; -export async function createServer(lageService: ILageService, abortController: AbortController): Promise> { +import type { FastifyInstance, FastifyBaseLogger, FastifyTypeProviderDefault } from "fastify"; +import type { Http2Server, Http2ServerRequest, Http2ServerResponse } from "http2"; + +export async function createServer( + lageService: ILageService, + abortController: AbortController +): Promise> { const server = fastify({ http2: true, }); + await server.register(fastifyConnectPlugin, { routes: createRoutes(lageService), shutdownSignal: abortController.signal, From e7cf4123574b460fd9affae63dfab37c7993dae6 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:03:02 +0000 Subject: [PATCH 10/36] adding return types to runners --- packages/runners/src/NoOpRunner.ts | 4 ++-- packages/runners/src/NpmScriptRunner.ts | 2 +- packages/runners/src/WorkerRunner.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/runners/src/NoOpRunner.ts b/packages/runners/src/NoOpRunner.ts index 0b871d4fe..59b023b02 100644 --- a/packages/runners/src/NoOpRunner.ts +++ b/packages/runners/src/NoOpRunner.ts @@ -1,11 +1,11 @@ import type { TargetRunner } from "./types/TargetRunner.js"; export class NoOpRunner implements TargetRunner { - async shouldRun() { + async shouldRun(): Promise { return true; } - async run() { + async run(): Promise { // pass } } diff --git a/packages/runners/src/NpmScriptRunner.ts b/packages/runners/src/NpmScriptRunner.ts index 02102ab19..f20868c97 100644 --- a/packages/runners/src/NpmScriptRunner.ts +++ b/packages/runners/src/NpmScriptRunner.ts @@ -46,7 +46,7 @@ export class NpmScriptRunner implements TargetRunner { return !!packageJson.scripts?.[task]; } - async shouldRun(target: Target) { + async shouldRun(target: Target): Promise { // By convention, do not run anything if there is no script for this task defined in package.json (counts as "success") const hasNpmScript = await this.hasNpmScript(target); diff --git a/packages/runners/src/WorkerRunner.ts b/packages/runners/src/WorkerRunner.ts index 7865ebaf9..7e6b7ad60 100644 --- a/packages/runners/src/WorkerRunner.ts +++ b/packages/runners/src/WorkerRunner.ts @@ -75,7 +75,7 @@ export class WorkerRunner implements TargetRunner { return await runFn({ target, weight, taskArgs, abortSignal }); } - async getScriptModule(target: Target) { + async getScriptModule(target: Target): Promise { const scriptFile = target.options?.worker ?? target.options?.script; if (!scriptFile) { From b61a175af3f10c0d4e457b18bfbc109e74999557 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:12:17 +0000 Subject: [PATCH 11/36] adding return types to cache --- packages/cache/src/backfillWrapper.ts | 9 +++++++-- packages/cache/src/chunkPromise.ts | 2 +- packages/cache/src/getCacheDirectory.ts | 6 +++--- packages/cache/src/providers/BackfillCacheProvider.ts | 2 +- .../cache/src/providers/RemoteFallbackCacheProvider.ts | 4 ++-- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/cache/src/backfillWrapper.ts b/packages/cache/src/backfillWrapper.ts index a89fa3013..5c39093a8 100644 --- a/packages/cache/src/backfillWrapper.ts +++ b/packages/cache/src/backfillWrapper.ts @@ -9,8 +9,9 @@ import { CacheStorageConfig } from "backfill-config"; import type { Logger as BackfillLogger } from "backfill-logger"; import type { CacheOptions } from "./types/CacheOptions.js"; import { CredentialCache } from "./CredentialCache.js"; +import { BackfillCacheProviderOptions } from "./providers/BackfillCacheProvider.js"; -export function createBackfillLogger() { +export function createBackfillLogger(): BackfillLogger { const stdout = process.stdout; const stderr = process.stderr; return makeLogger("error", { @@ -28,7 +29,11 @@ export function createBackfillLogger() { }); } -export function createBackfillCacheConfig(cwd: string, cacheOptions: Partial = {}, backfillLogger: BackfillLogger) { +export function createBackfillCacheConfig( + cwd: string, + cacheOptions: Partial = {}, + backfillLogger: BackfillLogger +): CacheOptions { const envConfig = getEnvConfig(backfillLogger); const mergedConfig = { ...createDefaultConfig(cwd), diff --git a/packages/cache/src/chunkPromise.ts b/packages/cache/src/chunkPromise.ts index 5d1269c47..605b28e1a 100644 --- a/packages/cache/src/chunkPromise.ts +++ b/packages/cache/src/chunkPromise.ts @@ -1,6 +1,6 @@ type PromiseFn = () => Promise; -export async function chunkPromise(promises: (Promise | PromiseFn)[], limit = 5) { +export async function chunkPromise(promises: (Promise | PromiseFn)[], limit = 5): Promise { for (let i = 0; i < promises.length; i += limit) { await Promise.all(promises.slice(i, i + limit).map((p) => (typeof p === "function" ? p() : p))); } diff --git a/packages/cache/src/getCacheDirectory.ts b/packages/cache/src/getCacheDirectory.ts index 0b5fac2f4..67cdead6a 100644 --- a/packages/cache/src/getCacheDirectory.ts +++ b/packages/cache/src/getCacheDirectory.ts @@ -1,13 +1,13 @@ import path from "path"; -export function getCacheDirectoryRoot(root: string) { +export function getCacheDirectoryRoot(root: string): string { return path.join(root, "node_modules", ".cache", "lage"); } -export function getCacheDirectory(root: string, hash: string) { +export function getCacheDirectory(root: string, hash: string): string { return path.join(getCacheDirectoryRoot(root), "cache", hash.substring(0, 4)); } -export function getLogsCacheDirectory(root: string, hash: string) { +export function getLogsCacheDirectory(root: string, hash: string): string { return path.join(getCacheDirectoryRoot(root), "logs", hash.substring(0, 4)); } diff --git a/packages/cache/src/providers/BackfillCacheProvider.ts b/packages/cache/src/providers/BackfillCacheProvider.ts index d1b75f0f0..bccd9a5dc 100644 --- a/packages/cache/src/providers/BackfillCacheProvider.ts +++ b/packages/cache/src/providers/BackfillCacheProvider.ts @@ -126,7 +126,7 @@ export class BackfillCacheProvider implements CacheProvider { ); } - getCachePath(packagePath: string, hash: string) { + getCachePath(packagePath: string, hash: string): string { return path.relative(packagePath, getCacheDirectory(this.options.root, hash)); } } diff --git a/packages/cache/src/providers/RemoteFallbackCacheProvider.ts b/packages/cache/src/providers/RemoteFallbackCacheProvider.ts index 493cb2f6f..fc65b9b27 100644 --- a/packages/cache/src/providers/RemoteFallbackCacheProvider.ts +++ b/packages/cache/src/providers/RemoteFallbackCacheProvider.ts @@ -24,7 +24,7 @@ export class RemoteFallbackCacheProvider implements CacheProvider { constructor(private options: RemoteFallbackCacheProviderOptions) {} - async fetch(hash: string, target: Target) { + async fetch(hash: string, target: Target): Promise { const { logger, remoteCacheProvider, localCacheProvider } = this.options; if (localCacheProvider) { @@ -48,7 +48,7 @@ export class RemoteFallbackCacheProvider implements CacheProvider { return RemoteFallbackCacheProvider.localHits[hash]; } - async put(hash: string, target: Target) { + async put(hash: string, target: Target): Promise { const { logger, remoteCacheProvider, localCacheProvider, writeRemoteCache } = this.options; const putPromises: Promise[] = []; From e98963f690783d860d35baa9c87d22c6326b0811 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:13:39 +0000 Subject: [PATCH 12/36] fix config --- packages/config/src/getMaxWorkersPerTask.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/config/src/getMaxWorkersPerTask.ts b/packages/config/src/getMaxWorkersPerTask.ts index d350bd4fd..737fc91c0 100644 --- a/packages/config/src/getMaxWorkersPerTask.ts +++ b/packages/config/src/getMaxWorkersPerTask.ts @@ -1,6 +1,6 @@ import type { ConfigOptions } from "./types/ConfigOptions.js"; -export function getMaxWorkersPerTask(pipelineConfig: ConfigOptions["pipeline"], concurrency: number) { +export function getMaxWorkersPerTask(pipelineConfig: ConfigOptions["pipeline"], concurrency: number): Map { const maxWorkersPerTask = new Map(); let generalPoolCount = 0; @@ -58,7 +58,7 @@ export function getMaxWorkersPerTask(pipelineConfig: ConfigOptions["pipeline"], return maxWorkersPerTask; } -export function getMaxWorkersPerTaskFromOptions(maxWorkersPerTask: string[]) { +export function getMaxWorkersPerTaskFromOptions(maxWorkersPerTask: string[]): Map { return new Map([ ...maxWorkersPerTask.map((setting) => { const [task, maxWorkers] = setting.split(/[=:]/); From f9e6632e75e3764a8288059d9eaa1b8157c7b468 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:14:24 +0000 Subject: [PATCH 13/36] fix backfill wrapper for cache --- packages/cache/src/backfillWrapper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cache/src/backfillWrapper.ts b/packages/cache/src/backfillWrapper.ts index 5c39093a8..3e1d72729 100644 --- a/packages/cache/src/backfillWrapper.ts +++ b/packages/cache/src/backfillWrapper.ts @@ -31,7 +31,7 @@ export function createBackfillLogger(): BackfillLogger { export function createBackfillCacheConfig( cwd: string, - cacheOptions: Partial = {}, + cacheOptions: Partial | undefined = {}, backfillLogger: BackfillLogger ): CacheOptions { const envConfig = getEnvConfig(backfillLogger); From 33451549f2368b9468a0b82f5be049d505eead3e Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:16:30 +0000 Subject: [PATCH 14/36] reporters fix --- packages/reporters/src/AdoReporter.ts | 8 ++++---- packages/reporters/src/ChromeTraceEventsReporter.ts | 4 ++-- packages/reporters/src/JsonReporter.ts | 4 ++-- packages/reporters/src/LogReporter.ts | 12 ++++++------ packages/reporters/src/ProgressReporter.ts | 12 ++++++------ packages/reporters/src/VerboseFileLogReporter.ts | 6 +++--- packages/reporters/src/slowestTargetRuns.ts | 2 +- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/reporters/src/AdoReporter.ts b/packages/reporters/src/AdoReporter.ts index 4ea575ff6..14a5c84d7 100644 --- a/packages/reporters/src/AdoReporter.ts +++ b/packages/reporters/src/AdoReporter.ts @@ -1,6 +1,6 @@ import { formatDuration, hrToSeconds } from "@lage-run/format-hrtime"; import { isTargetStatusLogEntry } from "./isTargetStatusLogEntry.js"; -import { LogLevel } from "@lage-run/logger"; +import { LogLevel, type LogStructuredData } from "@lage-run/logger"; import chalk from "chalk"; import type { Reporter, LogEntry } from "@lage-run/logger"; import type { SchedulerRunSummary, TargetStatus } from "@lage-run/scheduler-types"; @@ -52,13 +52,13 @@ export class AdoReporter implements Reporter { logStream: Writable = process.stdout; private logEntries = new Map(); - readonly groupedEntries = new Map(); + readonly groupedEntries: Map[]> = new Map(); constructor(private options: { logLevel?: LogLevel; grouped?: boolean }) { options.logLevel = options.logLevel || LogLevel.info; } - log(entry: LogEntry) { + log(entry: LogEntry): boolean | void { if (entry.data && entry.data.target && entry.data.target.hidden) { return; } @@ -159,7 +159,7 @@ export class AdoReporter implements Reporter { } } - summarize(schedulerRunSummary: SchedulerRunSummary) { + summarize(schedulerRunSummary: SchedulerRunSummary): void { const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary; const { failed, aborted, skipped, success, pending } = targetRunByStatus; diff --git a/packages/reporters/src/ChromeTraceEventsReporter.ts b/packages/reporters/src/ChromeTraceEventsReporter.ts index d75d42b5b..28365a604 100644 --- a/packages/reporters/src/ChromeTraceEventsReporter.ts +++ b/packages/reporters/src/ChromeTraceEventsReporter.ts @@ -58,11 +58,11 @@ export class ChromeTraceEventsReporter implements Reporter { this.logStream = fs.createWriteStream(this.outputFile, { flags: "w" }); } - log() { + log(): void { // pass } - summarize(schedulerRunSummary: SchedulerRunSummary) { + summarize(schedulerRunSummary: SchedulerRunSummary): void { const { targetRuns, startTime } = schedulerRunSummary; // categorize events diff --git a/packages/reporters/src/JsonReporter.ts b/packages/reporters/src/JsonReporter.ts index 4f33741b8..d6bf84cd6 100644 --- a/packages/reporters/src/JsonReporter.ts +++ b/packages/reporters/src/JsonReporter.ts @@ -8,7 +8,7 @@ import type { TargetMessageEntry, TargetStatusEntry } from "./types/TargetLogEnt export class JsonReporter implements Reporter { constructor(private options: { logLevel: LogLevel }) {} - log(entry: LogEntry) { + log(entry: LogEntry): void { if (entry.data && entry.data.target && entry.data.target.hidden) { return; } @@ -18,7 +18,7 @@ export class JsonReporter implements Reporter { } } - summarize(schedulerRunSummary: SchedulerRunSummary) { + summarize(schedulerRunSummary: SchedulerRunSummary): void { const { duration, targetRuns, targetRunByStatus } = schedulerRunSummary; const summary: any = {}; const taskStats: any[] = []; diff --git a/packages/reporters/src/LogReporter.ts b/packages/reporters/src/LogReporter.ts index b03e265b0..71d5c87e1 100644 --- a/packages/reporters/src/LogReporter.ts +++ b/packages/reporters/src/LogReporter.ts @@ -1,6 +1,6 @@ import { formatDuration, hrtimeDiff, hrToSeconds } from "@lage-run/format-hrtime"; import { isTargetStatusLogEntry } from "./isTargetStatusLogEntry.js"; -import { LogLevel } from "@lage-run/logger"; +import { LogLevel, type LogStructuredData } from "@lage-run/logger"; import ansiRegex from "ansi-regex"; import chalk from "chalk"; import type { Chalk } from "chalk"; @@ -79,13 +79,13 @@ function normalize(prefixOrMessage: string, message?: string) { export class LogReporter implements Reporter { logStream: Writable = process.stdout; private logEntries = new Map(); - readonly groupedEntries = new Map(); + readonly groupedEntries: Map[]> = new Map(); constructor(private options: { logLevel?: LogLevel; grouped?: boolean }) { options.logLevel = options.logLevel || LogLevel.info; } - log(entry: LogEntry) { + log(entry: LogEntry): void { // if "hidden", do not even attempt to record or report the entry if (entry?.data?.target?.hidden) { return; @@ -190,11 +190,11 @@ export class LogReporter implements Reporter { } } - hr() { + hr(): void { this.print("┈".repeat(80)); } - summarize(schedulerRunSummary: SchedulerRunSummary) { + summarize(schedulerRunSummary: SchedulerRunSummary): void { const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary; const { failed, aborted, skipped, success, pending } = targetRunByStatus; @@ -281,7 +281,7 @@ export class LogReporter implements Reporter { this.print(`Took a total of ${formatDuration(hrToSeconds(duration))} to complete. ${allCacheHitText}`); } - resetLogEntries() { + resetLogEntries(): void { this.logEntries.clear(); } } diff --git a/packages/reporters/src/ProgressReporter.ts b/packages/reporters/src/ProgressReporter.ts index ebffed040..809b87581 100644 --- a/packages/reporters/src/ProgressReporter.ts +++ b/packages/reporters/src/ProgressReporter.ts @@ -1,5 +1,5 @@ import EventEmitter from "events"; -import { type LogEntry, LogLevel, type Reporter } from "@lage-run/logger"; +import { type LogEntry, LogLevel, type Reporter, type LogStructuredData } from "@lage-run/logger"; import type { SchedulerRunSummary, TargetStatus } from "@lage-run/scheduler-types"; // @ts-ignore Ignoring ESM in CJS errors here, but still importing the types to be used @@ -35,7 +35,7 @@ export class ProgressReporter implements Reporter { startTime: [number, number] = [0, 0]; logEvent: EventEmitter = new EventEmitter(); - logEntries = new Map(); + logEntries: Map[]> = new Map(); taskReporter: TaskReporter; tasks: Map = new Map(); @@ -46,7 +46,7 @@ export class ProgressReporter implements Reporter { this.print(`${fancy("lage")} - Version ${options.version} - ${options.concurrency} Workers`); } - createTaskReporter() { + createTaskReporter(): TaskReporter { return new TaskReporter({ productName: "lage", version: this.options.version, @@ -67,7 +67,7 @@ export class ProgressReporter implements Reporter { }); } - log(entry: LogEntry) { + log(entry: LogEntry): void { // save the logs for errors if (entry.data?.target?.id) { if (!this.logEntries.has(entry.data.target.id)) { @@ -122,11 +122,11 @@ export class ProgressReporter implements Reporter { this.logStream.write(message + "\n"); } - hr() { + hr(): void { this.print("┈".repeat(80)); } - summarize(schedulerRunSummary: SchedulerRunSummary) { + summarize(schedulerRunSummary: SchedulerRunSummary): void { const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary; const { failed, aborted, skipped, success, pending, running, queued } = targetRunByStatus; diff --git a/packages/reporters/src/VerboseFileLogReporter.ts b/packages/reporters/src/VerboseFileLogReporter.ts index 5898a714e..202524090 100644 --- a/packages/reporters/src/VerboseFileLogReporter.ts +++ b/packages/reporters/src/VerboseFileLogReporter.ts @@ -28,11 +28,11 @@ export class VerboseFileLogReporter implements Reporter { this.fileStream = logFile ? fs.createWriteStream(logFile) : new Writable({ write() {} }); } - cleanup() { + cleanup(): void { this.fileStream?.end(); } - log(entry: LogEntry) { + log(entry: LogEntry): void { // if "hidden", do not even attempt to record or report the entry if (entry?.data?.target?.hidden) { return; @@ -100,7 +100,7 @@ export class VerboseFileLogReporter implements Reporter { } } - summarize() { + summarize(): void { // No summary needed for VerboseFileLogReporter } } diff --git a/packages/reporters/src/slowestTargetRuns.ts b/packages/reporters/src/slowestTargetRuns.ts index 76db420d8..41bb850f3 100644 --- a/packages/reporters/src/slowestTargetRuns.ts +++ b/packages/reporters/src/slowestTargetRuns.ts @@ -1,7 +1,7 @@ import { hrtimeDiff, hrToSeconds } from "@lage-run/format-hrtime"; import type { TargetRun } from "@lage-run/scheduler-types"; -export function slowestTargetRuns(targetRuns: TargetRun[]) { +export function slowestTargetRuns(targetRuns: TargetRun[]): TargetRun[] { return targetRuns .sort((a, b) => parseFloat(hrToSeconds(hrtimeDiff(a.duration, b.duration)))) .filter((run) => run.status !== "skipped" && !run.target.hidden); From 3c51093b65a2e23bfb9e3284588eb886aefbaad8 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:18:04 +0000 Subject: [PATCH 15/36] rpc --- packages/rpc/src/gen/lage/v1/lage_connect.ts | 26 +++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/rpc/src/gen/lage/v1/lage_connect.ts b/packages/rpc/src/gen/lage/v1/lage_connect.ts index 9d8ebc53b..3953559f4 100644 --- a/packages/rpc/src/gen/lage/v1/lage_connect.ts +++ b/packages/rpc/src/gen/lage/v1/lage_connect.ts @@ -9,7 +9,31 @@ import { MethodKind } from "@bufbuild/protobuf"; /** * @generated from service connectrpc.lage.v1.LageService */ -export const LageService = { +export const LageService: { + readonly typeName: "connectrpc.lage.v1.LageService"; + readonly methods: { + /** + * @generated from rpc connectrpc.lage.v1.LageService.RunTarget + */ + readonly runTarget: { + readonly name: "RunTarget"; + readonly I: typeof RunTargetRequest; + readonly O: typeof RunTargetResponse; + readonly kind: MethodKind.Unary; + }; + /** + * a ping function to check if the server is up + * + * @generated from rpc connectrpc.lage.v1.LageService.Ping + */ + readonly ping: { + readonly name: "Ping"; + readonly I: typeof PingRequest; + readonly O: typeof PingResponse; + readonly kind: MethodKind.Unary; + }; + }; +} = { typeName: "connectrpc.lage.v1.LageService", methods: { /** From 15332ecfbd8902d18a9ea42d14cb4a6e05074ef6 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:25:29 +0000 Subject: [PATCH 16/36] fixing globby --- packages/globby/tsconfig.json | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/globby/tsconfig.json b/packages/globby/tsconfig.json index 820d66a8d..b666daa03 100644 --- a/packages/globby/tsconfig.json +++ b/packages/globby/tsconfig.json @@ -1,11 +1,23 @@ { - "extends": "../tsconfig.lage2.json", "compilerOptions": { "outDir": "./lib", "emitDeclarationOnly": true, - "module": "Node16" + "module": "Node16", + "target": "ES2020", + "moduleResolution": "Node16", + "declaration": true, + "lib": ["ES2020"], + "strict": true, + "noImplicitAny": false, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "noUnusedLocals": false, + "sourceMap": true, + "typeRoots": ["../node_modules/@types", "../types", "node_modules/@types"], + "isolatedModules": true }, - "files": [], "include": ["src/index.mts"], "exclude": ["lib/**/*.mts"] } From 40a186d6d911680aa1685bb1beb965e0645d2449 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:26:56 +0000 Subject: [PATCH 17/36] fixing hasher --- packages/hasher/src/FileHasher.ts | 8 ++++---- packages/hasher/src/PackageTree.ts | 8 ++++---- packages/hasher/src/TargetHasher.ts | 12 ++++++------ .../src/__tests__/resolveDependenciesHelper.ts | 6 +++--- packages/hasher/src/expandInputPatterns.ts | 2 +- packages/hasher/src/getInputFiles.ts | 2 +- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/hasher/src/FileHasher.ts b/packages/hasher/src/FileHasher.ts index 1f7ebc684..8f13d3d87 100644 --- a/packages/hasher/src/FileHasher.ts +++ b/packages/hasher/src/FileHasher.ts @@ -27,7 +27,7 @@ export class FileHasher { this.#manifestFile = path.join(cacheDirectory, "file_hashes.manifest"); } - async getHashesFromGit() { + async getHashesFromGit(): Promise { const { root } = this.options; const fileHashes = await getPackageDeps(root); const files = [...fileHashes.keys()]; @@ -45,7 +45,7 @@ export class FileHasher { this.writeManifest(); } - async readManifest() { + async readManifest(): Promise { return new Promise((resolve) => { if (!fs.existsSync(this.#manifestFile)) { this.getHashesFromGit().then(() => resolve()); @@ -77,7 +77,7 @@ export class FileHasher { }); } - writeManifest() { + writeManifest(): void { fs.mkdirSync(path.dirname(this.#manifestFile), { recursive: true }); const outputLines = Object.entries(this.#store).map(([relativePath, info]) => { return `${relativePath}\0${info.mtime.toString()}\0${info.size.toString()}\0${info.hash}`; @@ -86,7 +86,7 @@ export class FileHasher { fs.writeFileSync(this.#manifestFile, outputLines.join("\n"), "utf-8"); } - hash(files: string[]) { + hash(files: string[]): Record { const hashes: Record = {}; const updatedFiles: string[] = []; diff --git a/packages/hasher/src/PackageTree.ts b/packages/hasher/src/PackageTree.ts index 0fe8100db..96d92e71d 100644 --- a/packages/hasher/src/PackageTree.ts +++ b/packages/hasher/src/PackageTree.ts @@ -27,14 +27,14 @@ export class PackageTree { constructor(private options: PackageTreeOptions) {} - reset() { + reset(): void { // reset the internal state this.#tree = {}; this.#packageFiles = {}; this.#memoizedPackageFiles = {}; } - async initialize() { + async initialize(): Promise { const { root, includeUntracked, packageInfos } = this.options; this.reset(); @@ -70,7 +70,7 @@ export class PackageTree { } } - async addToPackageTree(filePaths: string[]) { + async addToPackageTree(filePaths: string[]): Promise { // key: path/to/package (packageRoot), value: array of a tuple of [file, hash] const packageFiles = this.#packageFiles; @@ -95,7 +95,7 @@ export class PackageTree { } } - getPackageFiles(packageName: string, patterns: string[]) { + getPackageFiles(packageName: string, patterns: string[]): string[] { const { root, packageInfos } = this.options; const packagePath = path.relative(root, path.dirname(packageInfos[packageName].packageJsonPath)).replace(/\\/g, "/"); diff --git a/packages/hasher/src/TargetHasher.ts b/packages/hasher/src/TargetHasher.ts index cb3f6b7f0..61e4a8ddc 100644 --- a/packages/hasher/src/TargetHasher.ts +++ b/packages/hasher/src/TargetHasher.ts @@ -73,7 +73,7 @@ export class TargetHasher { dependents: new Map(), }; - getPackageInfos(workspacePackages: WorkspaceInfo) { + getPackageInfos(workspacePackages: WorkspaceInfo): PackageInfos { const { root } = this.options; const packageInfos: PackageInfos = {}; @@ -114,13 +114,13 @@ export class TargetHasher { } } - ensureInitialized() { + ensureInitialized(): void { if (!this.initializedPromise) { throw new Error("TargetHasher is not initialized"); } } - async initialize() { + async initialize(): Promise { const { environmentGlob, root } = this.options; if (this.initializedPromise) { @@ -228,7 +228,7 @@ export class TargetHasher { return hashString; } - writeTargetHashesManifest() { + writeTargetHashesManifest(): void { for (const [id, { fileHashes, globalFileHashes }] of Object.entries(this.targetHashesLog)) { const targetHashesManifestPath = path.join(this.targetHashesDirectory, `${id}.json`); if (!fs.existsSync(path.dirname(targetHashesManifestPath))) { @@ -238,7 +238,7 @@ export class TargetHasher { } } - async getEnvironmentGlobHashes(root: string, target: Target) { + async getEnvironmentGlobHashes(root: string, target: Target): Promise> { const globalFileHashes = target.environmentGlob ? this.fileHasher.hash(await globAsync(target.environmentGlob ?? [], { cwd: root })) : this.globalInputsHash ?? {}; @@ -246,7 +246,7 @@ export class TargetHasher { return globalFileHashes; } - async cleanup() { + async cleanup(): Promise { this.writeTargetHashesManifest(); await this.fileHasher.writeManifest(); } diff --git a/packages/hasher/src/__tests__/resolveDependenciesHelper.ts b/packages/hasher/src/__tests__/resolveDependenciesHelper.ts index 54c61a57a..f3cddfa97 100644 --- a/packages/hasher/src/__tests__/resolveDependenciesHelper.ts +++ b/packages/hasher/src/__tests__/resolveDependenciesHelper.ts @@ -4,7 +4,7 @@ const fixturesPath = path.join(__dirname, "..", "__fixtures__"); import { getYarnWorkspaces, getPnpmWorkspaces, getRushWorkspaces } from "workspace-tools"; -export async function filterDependenciesInYarnFixture(fixture: string, filterFunction: any) { +export async function filterDependenciesInYarnFixture(fixture: string, filterFunction: any): Promise { const monorepo = new Monorepo("monorepo"); await monorepo.init(path.join(fixturesPath, fixture)); const packageRoot = monorepo.root; @@ -18,7 +18,7 @@ export async function filterDependenciesInYarnFixture(fixture: string, filterFun return filteredDependencies; } -export async function filterDependenciesInPnpmFixture(fixture: string, filterFunction: any) { +export async function filterDependenciesInPnpmFixture(fixture: string, filterFunction: any): Promise { const monorepo = new Monorepo("monorepo"); await monorepo.init(path.join(fixturesPath, fixture)); const packageRoot = monorepo.root; @@ -32,7 +32,7 @@ export async function filterDependenciesInPnpmFixture(fixture: string, filterFun return filteredDependencies; } -export async function filterDependenciesInRushFixture(fixture: string, filterFunction: any) { +export async function filterDependenciesInRushFixture(fixture: string, filterFunction: any): Promise { const monorepo = new Monorepo("monorepo"); await monorepo.init(path.join(fixturesPath, fixture)); const packageRoot = monorepo.root; diff --git a/packages/hasher/src/expandInputPatterns.ts b/packages/hasher/src/expandInputPatterns.ts index 775938956..82843dac2 100644 --- a/packages/hasher/src/expandInputPatterns.ts +++ b/packages/hasher/src/expandInputPatterns.ts @@ -1,7 +1,7 @@ import { type Target } from "@lage-run/target-graph"; import { type DependencyMap } from "workspace-tools"; -export function expandInputPatterns(patterns: string[], target: Target, dependencyMap: DependencyMap) { +export function expandInputPatterns(patterns: string[], target: Target, dependencyMap: DependencyMap): Record { const expandedPatterns: Record = {}; for (const pattern of patterns) { diff --git a/packages/hasher/src/getInputFiles.ts b/packages/hasher/src/getInputFiles.ts index 9fe9c0971..257d0a6d6 100644 --- a/packages/hasher/src/getInputFiles.ts +++ b/packages/hasher/src/getInputFiles.ts @@ -3,7 +3,7 @@ import { type DependencyMap } from "workspace-tools"; import { type PackageTree } from "./PackageTree.js"; import { expandInputPatterns } from "./expandInputPatterns.js"; -export function getInputFiles(target: Target, dependencyMap: DependencyMap, packageTree: PackageTree) { +export function getInputFiles(target: Target, dependencyMap: DependencyMap, packageTree: PackageTree): string[] { const inputs = target.inputs ?? ["**/*"]; const packagePatterns = expandInputPatterns(inputs, target, dependencyMap); From 673566e98b008c40ac2ef1533c8b175bb72b3e89 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:30:47 +0000 Subject: [PATCH 18/36] scheduler --- packages/scheduler/src/SimpleScheduler.ts | 19 ++++++------ packages/scheduler/src/WrappedTarget.ts | 29 ++++++++++--------- packages/scheduler/src/bufferTransform.ts | 5 +++- .../src/cache/createCacheProvider.ts | 4 ++- .../scheduler/src/cache/isRunningFromCI.ts | 2 +- .../src/getLageOutputCacheLocation.ts | 2 +- 6 files changed, 34 insertions(+), 27 deletions(-) diff --git a/packages/scheduler/src/SimpleScheduler.ts b/packages/scheduler/src/SimpleScheduler.ts index 586c5731e..40c9b852c 100644 --- a/packages/scheduler/src/SimpleScheduler.ts +++ b/packages/scheduler/src/SimpleScheduler.ts @@ -1,7 +1,7 @@ import { AggregatedPool } from "@lage-run/worker-threads-pool"; import { formatBytes } from "./formatBytes.js"; import { categorizeTargetRuns } from "./categorizeTargetRuns.js"; -import { getStartTargetId, sortTargetsByPriority } from "@lage-run/target-graph"; +import { type Target, getStartTargetId, sortTargetsByPriority } from "@lage-run/target-graph"; import { WrappedTarget } from "./WrappedTarget.js"; import { TargetRunnerPicker } from "@lage-run/runners"; @@ -77,7 +77,7 @@ export class SimpleScheduler implements TargetScheduler { this.runnerPicker = new TargetRunnerPicker(options.workerData.runners); } - getTargetsByPriority() { + getTargetsByPriority(): Target[] { return sortTargetsByPriority([...this.targetRuns.values()].map((run) => run.target)); } @@ -183,7 +183,7 @@ export class SimpleScheduler implements TargetScheduler { * Used by consumers of the scheduler to notify that the inputs to the target has changed * @param targetId */ - markTargetAndDependentsPending(targetId) { + markTargetAndDependentsPending(targetId): void { const queue = [targetId]; while (queue.length > 0) { const current = queue.shift()!; @@ -203,7 +203,7 @@ export class SimpleScheduler implements TargetScheduler { } } - getReadyTargets() { + getReadyTargets(): WrappedTarget[] { const readyTargets: Set = new Set(); for (const target of this.getTargetsByPriority()) { @@ -233,7 +233,7 @@ export class SimpleScheduler implements TargetScheduler { return [...readyTargets]; } - isAllDone() { + isAllDone(): boolean { for (const t of this.targetRuns.values()) { if (t.status !== "skipped" && t.status !== "success" && t.target.id !== getStartTargetId()) { return false; @@ -243,7 +243,7 @@ export class SimpleScheduler implements TargetScheduler { return true; } - async scheduleReadyTargets() { + async scheduleReadyTargets(): Promise { if (this.isAllDone() || this.abortSignal.aborted) { return Promise.resolve(); } @@ -260,7 +260,7 @@ export class SimpleScheduler implements TargetScheduler { await Promise.all(promises); } - logProgress() { + logProgress(): void { const targetRunByStatus = categorizeTargetRuns(this.targetRuns.values()); const total = [...this.targetRuns.values()].filter((t) => !t.target.hidden).length; @@ -323,7 +323,7 @@ export class SimpleScheduler implements TargetScheduler { await this.scheduleReadyTargets(); } - async cleanup() { + async cleanup(): Promise { this.options.logger.silly(`Max Worker Memory Usage: ${formatBytes(this.pool.stats().maxWorkerMemoryUsage)}`); await this.pool.close(); } @@ -331,8 +331,7 @@ export class SimpleScheduler implements TargetScheduler { /** * Abort the scheduler using the abort controller. */ - abort() { + abort(): void { this.abortController.abort(); } } -encodeURI; diff --git a/packages/scheduler/src/WrappedTarget.ts b/packages/scheduler/src/WrappedTarget.ts index e8149c533..5de57afc5 100644 --- a/packages/scheduler/src/WrappedTarget.ts +++ b/packages/scheduler/src/WrappedTarget.ts @@ -50,11 +50,11 @@ export class WrappedTarget implements TargetRun { target: Target; threadId = 0; - get result() { + get result(): WorkerResult | undefined { return this.#result; } - get status() { + get status(): TargetStatus { return this.#status; } @@ -66,11 +66,11 @@ export class WrappedTarget implements TargetRun { this.options.abortController = abortController; } - get successful() { + get successful(): boolean { return this.#status === "skipped" || this.#status === "success"; } - get waiting() { + get waiting(): boolean { return this.#status === "pending" || this.#status === "queued"; } @@ -84,19 +84,19 @@ export class WrappedTarget implements TargetRun { this.options.logger.info("", { target: this.target, status: this.status }); } - onQueued() { + onQueued(): void { this.#status = "queued"; this.queueTime = process.hrtime(); this.options.logger.info("", { target: this.target, status: "queued" }); } - onAbort() { + onAbort(): void { this.#status = "aborted"; this.duration = process.hrtime(this.startTime); this.options.logger.info("", { target: this.target, status: "aborted", threadId: this.threadId }); } - onStart(threadId: number) { + onStart(threadId: number): void { if (this.status !== "running") { this.threadId = threadId; this.#status = "running"; @@ -105,7 +105,7 @@ export class WrappedTarget implements TargetRun { } } - onComplete() { + onComplete(): void { this.#status = "success"; this.duration = process.hrtime(this.startTime); this.options.logger.info("", { @@ -116,7 +116,7 @@ export class WrappedTarget implements TargetRun { }); } - onFail() { + onFail(): void { this.#status = "failed"; this.duration = process.hrtime(this.startTime); this.options.logger.info("", { @@ -131,7 +131,7 @@ export class WrappedTarget implements TargetRun { } } - onSkipped(hash?: string | undefined) { + onSkipped(hash?: string | undefined): void { if (this.startTime[0] !== 0 && this.startTime[1] !== 0) { this.duration = process.hrtime(this.startTime); } @@ -149,7 +149,7 @@ export class WrappedTarget implements TargetRun { } } - async run() { + async run(): Promise { const { target, logger, shouldCache, abortController, root } = this.options; const abortSignal = abortController.signal; @@ -288,7 +288,10 @@ export class WrappedTarget implements TargetRun { * * @returns */ - toJSON() { + toJSON(): { + target: string; + status: TargetStatus; + } { return { target: this.target.id, status: this.status, @@ -298,7 +301,7 @@ export class WrappedTarget implements TargetRun { /** * Reset the state of this wrapped target. */ - reset() { + reset(): void { this.#result = undefined; this.#status = "pending"; } diff --git a/packages/scheduler/src/bufferTransform.ts b/packages/scheduler/src/bufferTransform.ts index 4a62fa7a7..50697f75a 100644 --- a/packages/scheduler/src/bufferTransform.ts +++ b/packages/scheduler/src/bufferTransform.ts @@ -1,6 +1,9 @@ import { Transform } from "stream"; -export function bufferTransform() { +export function bufferTransform(): { + readonly buffer: string; + transform: Transform; +} { const chunks: string[] = []; return { diff --git a/packages/scheduler/src/cache/createCacheProvider.ts b/packages/scheduler/src/cache/createCacheProvider.ts index fb00cfa16..7af7d78bb 100644 --- a/packages/scheduler/src/cache/createCacheProvider.ts +++ b/packages/scheduler/src/cache/createCacheProvider.ts @@ -11,7 +11,9 @@ interface CreateCacheOptions { cliArgs: string[]; } -export async function createCache(options: CreateCacheOptions) { +export async function createCache(options: CreateCacheOptions): Promise<{ + cacheProvider: RemoteFallbackCacheProvider; +}> { const { cacheOptions, logger, root, skipLocalCache } = options; const hasRemoteCacheConfig = diff --git a/packages/scheduler/src/cache/isRunningFromCI.ts b/packages/scheduler/src/cache/isRunningFromCI.ts index b2ec496b7..dd86cb254 100644 --- a/packages/scheduler/src/cache/isRunningFromCI.ts +++ b/packages/scheduler/src/cache/isRunningFromCI.ts @@ -1 +1 @@ -export const isRunningFromCI = process.env.NODE_ENV !== "test" && (!!process.env.CI || !!process.env.TF_BUILD); +export const isRunningFromCI: boolean = process.env.NODE_ENV !== "test" && (!!process.env.CI || !!process.env.TF_BUILD); diff --git a/packages/scheduler/src/getLageOutputCacheLocation.ts b/packages/scheduler/src/getLageOutputCacheLocation.ts index 7ea3889ac..9ab8bcc54 100644 --- a/packages/scheduler/src/getLageOutputCacheLocation.ts +++ b/packages/scheduler/src/getLageOutputCacheLocation.ts @@ -1,7 +1,7 @@ import { getLogsCacheDirectory } from "@lage-run/cache"; import path from "path"; -export function getLageOutputCacheLocation(root: string, hash: string) { +export function getLageOutputCacheLocation(root: string, hash: string): string { const outputPath = getLogsCacheDirectory(root, hash); return path.join(outputPath, hash + ".log"); } From 3264daef8443b93673abf5470ccff3790b477842 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:31:00 +0000 Subject: [PATCH 19/36] worker-threads-pool --- .../worker-threads-pool/src/AggregatedPool.ts | 9 ++++--- packages/worker-threads-pool/src/TaskInfo.ts | 8 +++--- .../worker-threads-pool/src/ThreadWorker.ts | 18 ++++++------- .../worker-threads-pool/src/WorkerPool.ts | 25 +++++++++++-------- .../worker-threads-pool/src/registerWorker.ts | 2 +- 5 files changed, 34 insertions(+), 28 deletions(-) diff --git a/packages/worker-threads-pool/src/AggregatedPool.ts b/packages/worker-threads-pool/src/AggregatedPool.ts index 8316590fc..57b63c70b 100644 --- a/packages/worker-threads-pool/src/AggregatedPool.ts +++ b/packages/worker-threads-pool/src/AggregatedPool.ts @@ -72,7 +72,10 @@ export class AggregatedPool extends EventEmitter implements Pool { }); } - stats() { + stats(): { + maxWorkerMemoryUsage: number; + workerRestarts: number; + } { const stats = [...this.groupedPools.values(), this.defaultPool].reduce( (acc, pool) => { if (pool) { @@ -88,13 +91,13 @@ export class AggregatedPool extends EventEmitter implements Pool { return stats; } - async exec( + async exec( data: Record, weight: number, setup?: (worker: IWorker, stdout: Readable, stderr: Readable) => void, cleanup?: (args: any) => void, abortSignal?: AbortSignal - ): Promise { + ): Promise { const group = this.options.groupBy(data); const pool = this.groupedPools.get(group) ?? this.defaultPool; diff --git a/packages/worker-threads-pool/src/TaskInfo.ts b/packages/worker-threads-pool/src/TaskInfo.ts index e013817d4..0bc73e907 100644 --- a/packages/worker-threads-pool/src/TaskInfo.ts +++ b/packages/worker-threads-pool/src/TaskInfo.ts @@ -23,19 +23,19 @@ export class TaskInfo extends AsyncResource { } } - get id() { + get id(): string { return this.options.id; } - get weight() { + get weight(): number { return this.options.weight; } - get abortSignal() { + get abortSignal(): AbortSignal | undefined { return this.options.abortSignal; } - done(err: Error, results: unknown) { + done(err: Error, results: unknown): void { const { cleanup, worker, resolve, reject } = this.options; if (cleanup) { diff --git a/packages/worker-threads-pool/src/ThreadWorker.ts b/packages/worker-threads-pool/src/ThreadWorker.ts index 89dccf8a3..aab41b70e 100644 --- a/packages/worker-threads-pool/src/ThreadWorker.ts +++ b/packages/worker-threads-pool/src/ThreadWorker.ts @@ -211,7 +211,7 @@ export class ThreadWorker extends EventEmitter implements IWorker { } } - start(work: QueueItem, abortSignal?: AbortSignal) { + start(work: QueueItem, abortSignal?: AbortSignal): void { this.status = "busy"; const { task, resolve, reject, cleanup, setup } = work; @@ -235,40 +235,40 @@ export class ThreadWorker extends EventEmitter implements IWorker { this.#worker.postMessage({ type: "start", task: { ...task, weight: work.weight }, id }); } - get weight() { + get weight(): number { return this.#taskInfo?.weight ?? 1; } - get stdout() { + get stdout(): Readable { return this.#stdoutInfo.stream; } - get stderr() { + get stderr(): Readable { return this.#stderrInfo.stream; } - get resourceLimits() { + get resourceLimits(): import("worker_threads").ResourceLimits | undefined { return this.#worker.resourceLimits; } - get threadId() { + get threadId(): number { return this.#worker.threadId; } - terminate() { + terminate(): void { this.#worker.removeAllListeners(); this.#worker.terminate(); this.#worker.unref(); } - restart() { + restart(): void { this.restarts++; this.status = "busy"; this.#worker.terminate(); this.#createNewWorker(); } - async checkMemoryUsage() { + async checkMemoryUsage(): Promise { this.#worker.postMessage({ type: "check-memory-usage" }); } diff --git a/packages/worker-threads-pool/src/WorkerPool.ts b/packages/worker-threads-pool/src/WorkerPool.ts index 9942f284f..b44f5933b 100644 --- a/packages/worker-threads-pool/src/WorkerPool.ts +++ b/packages/worker-threads-pool/src/WorkerPool.ts @@ -49,26 +49,29 @@ export class WorkerPool extends EventEmitter implements Pool { }); } - isIdle() { + isIdle(): boolean { return this.workers.every((w) => w.status === "free"); } - get workerRestarts() { + get workerRestarts(): number { return this.workers.reduce((acc, worker) => acc + worker.restarts, 0); } - get maxWorkerMemoryUsage() { + get maxWorkerMemoryUsage(): number { return this.workers.reduce((acc, worker) => Math.max(acc, worker.maxWorkerMemoryUsage), 0); } - stats() { + stats(): { + maxWorkerMemoryUsage: number; + workerRestarts: number; + } { return { maxWorkerMemoryUsage: this.maxWorkerMemoryUsage, workerRestarts: this.workerRestarts, }; } - createInitialWorkers() { + createInitialWorkers(): void { if (this.workers.length === 0) { for (let i = 0; i < this.minWorkers; i++) { this.addNewWorker(); @@ -76,7 +79,7 @@ export class WorkerPool extends EventEmitter implements Pool { } } - addNewWorker() { + addNewWorker(): ThreadWorker | undefined { if (this.workers.length <= this.maxWorkers) { const { script, workerOptions } = this.options; const worker = new ThreadWorker(script, { workerOptions, workerIdleMemoryLimit: this.options.workerIdleMemoryLimit }); @@ -90,13 +93,13 @@ export class WorkerPool extends EventEmitter implements Pool { } } - exec( + exec( task: Record, weight: number, setup?: (worker: IWorker, stdout: Readable, stderr: Readable) => void, cleanup?: (worker: IWorker) => void, abortSignal?: AbortSignal - ) { + ): Promise { if (abortSignal?.aborted) { return Promise.resolve(); } @@ -104,13 +107,13 @@ export class WorkerPool extends EventEmitter implements Pool { // cull the weight of the task to be [1, maxWorkers] weight = Math.min(Math.max(1, weight), this.maxWorkers); - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this.queue.push({ task: { ...task, weight }, weight, resolve, reject, cleanup, setup }); this._exec(abortSignal); }); } - _exec(abortSignal?: AbortSignal) { + _exec(abortSignal?: AbortSignal): void { // find work that will fit the availability of workers const workIndex = this.queue.findIndex((item) => item.weight <= this.availability); @@ -135,7 +138,7 @@ export class WorkerPool extends EventEmitter implements Pool { } } - async close() { + async close(): Promise { await Promise.all(this.workers.map((worker) => worker.terminate())); } } diff --git a/packages/worker-threads-pool/src/registerWorker.ts b/packages/worker-threads-pool/src/registerWorker.ts index ecb68d7ca..4a3dfc60c 100644 --- a/packages/worker-threads-pool/src/registerWorker.ts +++ b/packages/worker-threads-pool/src/registerWorker.ts @@ -3,7 +3,7 @@ import { endMarker, startMarker } from "./stdioStreamMarkers.js"; import type { MessagePort } from "worker_threads"; -export function registerWorker(fn: (data: any, abortSignal?: AbortSignal) => Promise | any) { +export function registerWorker(fn: (data: any, abortSignal?: AbortSignal) => Promise | any): void { parentPort?.on("message", async (message) => { let abortController: AbortController | undefined; From cd2b8a2f4cd309626bce6fe438355ebd0238f0a8 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 21:31:44 +0000 Subject: [PATCH 20/36] adding arg types --- packages/scheduler/src/SimpleScheduler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scheduler/src/SimpleScheduler.ts b/packages/scheduler/src/SimpleScheduler.ts index 40c9b852c..956ee2aef 100644 --- a/packages/scheduler/src/SimpleScheduler.ts +++ b/packages/scheduler/src/SimpleScheduler.ts @@ -183,7 +183,7 @@ export class SimpleScheduler implements TargetScheduler { * Used by consumers of the scheduler to notify that the inputs to the target has changed * @param targetId */ - markTargetAndDependentsPending(targetId): void { + markTargetAndDependentsPending(targetId: string): void { const queue = [targetId]; while (queue.length > 0) { const current = queue.shift()!; From 01e051525f02fec89b2c5ff45330ad8872ec7c71 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 22:24:30 +0000 Subject: [PATCH 21/36] fix CLI package --- packages/cli/src/cache/createCacheProvider.ts | 4 +++- packages/cli/src/cache/isRunningFromCI.ts | 2 +- packages/cli/src/commands/addFilterOptions.ts | 2 +- packages/cli/src/commands/addLoggerOptions.ts | 2 +- packages/cli/src/commands/affected/action.ts | 2 +- packages/cli/src/commands/affected/index.ts | 2 +- packages/cli/src/commands/cache/action.ts | 2 +- packages/cli/src/commands/cache/clearCache.ts | 2 +- packages/cli/src/commands/cache/index.ts | 2 +- packages/cli/src/commands/cache/pruneCache.ts | 2 +- .../cli/src/commands/cache/runners/ClearCacheRunner.ts | 2 +- .../cli/src/commands/cache/runners/PruneCacheRunner.ts | 2 +- packages/cli/src/commands/createReporter.ts | 4 ++-- packages/cli/src/commands/exec/action.ts | 2 +- packages/cli/src/commands/exec/executeInProcess.ts | 2 +- packages/cli/src/commands/exec/executeRemotely.ts | 2 +- .../cli/src/commands/exec/expandTargetDefinition.ts | 8 +++++++- packages/cli/src/commands/exec/index.ts | 2 +- packages/cli/src/commands/exec/simulateFileAccess.ts | 2 +- packages/cli/src/commands/info/action.ts | 2 +- packages/cli/src/commands/info/index.ts | 2 +- packages/cli/src/commands/init/action.ts | 2 +- packages/cli/src/commands/init/index.ts | 2 +- packages/cli/src/commands/initializeReporters.ts | 4 ++-- packages/cli/src/commands/isRunningFromCI.ts | 2 +- packages/cli/src/commands/launchServerInBackground.ts | 2 +- packages/cli/src/commands/parseServerOption.ts | 5 ++++- packages/cli/src/commands/run/action.ts | 2 +- packages/cli/src/commands/run/createTargetGraph.ts | 4 ++-- packages/cli/src/commands/run/filterArgsForTasks.ts | 5 ++++- .../cli/src/commands/run/filterPipelineDefinitions.ts | 2 +- packages/cli/src/commands/run/index.ts | 2 +- packages/cli/src/commands/run/runAction.ts | 2 +- packages/cli/src/commands/run/watchAction.ts | 2 +- packages/cli/src/commands/server/MemoryStream.ts | 2 +- packages/cli/src/commands/server/action.ts | 2 +- packages/cli/src/commands/server/getOutputFiles.ts | 2 +- packages/cli/src/commands/server/index.ts | 2 +- packages/cli/src/filter/getFilteredPackages.ts | 4 ++-- packages/cli/src/filter/hasRepoChanged.ts | 2 +- packages/cli/src/getBinPaths.ts | 10 ++++++++-- packages/cli/src/optimizeTargetGraph.ts | 4 ++-- packages/cli/src/showHelp.ts | 2 +- packages/cli/src/types/errors.ts | 2 +- 44 files changed, 70 insertions(+), 50 deletions(-) diff --git a/packages/cli/src/cache/createCacheProvider.ts b/packages/cli/src/cache/createCacheProvider.ts index f7c581f23..c865c89f3 100644 --- a/packages/cli/src/cache/createCacheProvider.ts +++ b/packages/cli/src/cache/createCacheProvider.ts @@ -10,7 +10,9 @@ interface CreateCacheOptions { cliArgs: string[]; } -export async function createCache(options: CreateCacheOptions) { +export async function createCache(options: CreateCacheOptions): Promise<{ + hasher: TargetHasher; +}> { const { cacheOptions, root, cliArgs, logger } = options; const hasher = new TargetHasher({ diff --git a/packages/cli/src/cache/isRunningFromCI.ts b/packages/cli/src/cache/isRunningFromCI.ts index b2ec496b7..dd86cb254 100644 --- a/packages/cli/src/cache/isRunningFromCI.ts +++ b/packages/cli/src/cache/isRunningFromCI.ts @@ -1 +1 @@ -export const isRunningFromCI = process.env.NODE_ENV !== "test" && (!!process.env.CI || !!process.env.TF_BUILD); +export const isRunningFromCI: boolean = process.env.NODE_ENV !== "test" && (!!process.env.CI || !!process.env.TF_BUILD); diff --git a/packages/cli/src/commands/addFilterOptions.ts b/packages/cli/src/commands/addFilterOptions.ts index 2b9e1de36..c4f5dfa38 100644 --- a/packages/cli/src/commands/addFilterOptions.ts +++ b/packages/cli/src/commands/addFilterOptions.ts @@ -1,6 +1,6 @@ import type { Command } from "commander"; -export function addFilterOptions(program: Command) { +export function addFilterOptions(program: Command): Command { return program .option("--scope ", "scopes the run to a subset of packages (by default, includes the dependencies and dependents as well)") .option("--no-deps|--no-dependents", "disables running any dependents of the scoped packages") diff --git a/packages/cli/src/commands/addLoggerOptions.ts b/packages/cli/src/commands/addLoggerOptions.ts index 544139e25..5ca5adff6 100644 --- a/packages/cli/src/commands/addLoggerOptions.ts +++ b/packages/cli/src/commands/addLoggerOptions.ts @@ -1,7 +1,7 @@ import type { Command } from "commander"; import { Option } from "commander"; -export function addLoggerOptions(program: Command) { +export function addLoggerOptions(program: Command): Command { const isCI = process.env.CI || process.env.TF_BUILD; return program diff --git a/packages/cli/src/commands/affected/action.ts b/packages/cli/src/commands/affected/action.ts index 9d0f7803a..0c668386f 100644 --- a/packages/cli/src/commands/affected/action.ts +++ b/packages/cli/src/commands/affected/action.ts @@ -8,7 +8,7 @@ interface AffectedOptions extends FilterOptions { outputFormat?: "json" | "graph" | "default"; } -export async function affectedAction(options: AffectedOptions) { +export async function affectedAction(options: AffectedOptions): Promise { const { dependencies, dependents, since, scope, ignore, outputFormat } = options; const cwd = process.cwd(); diff --git a/packages/cli/src/commands/affected/index.ts b/packages/cli/src/commands/affected/index.ts index 1366223a2..b82e8ec45 100644 --- a/packages/cli/src/commands/affected/index.ts +++ b/packages/cli/src/commands/affected/index.ts @@ -2,7 +2,7 @@ import { Command } from "commander"; import { addFilterOptions } from "../addFilterOptions.js"; import { affectedAction } from "./action.js"; -const affectedCommand = new Command("affected"); +const affectedCommand: Command = new Command("affected"); addFilterOptions(affectedCommand) .action(affectedAction) diff --git a/packages/cli/src/commands/cache/action.ts b/packages/cli/src/commands/cache/action.ts index 5a6b3b494..07698a352 100644 --- a/packages/cli/src/commands/cache/action.ts +++ b/packages/cli/src/commands/cache/action.ts @@ -10,7 +10,7 @@ interface CacheOptions extends ReporterInitOptions { clear?: boolean; } -export async function cacheAction(options: CacheOptions, command: Command) { +export async function cacheAction(options: CacheOptions, command: Command): Promise { const cwd = process.cwd(); const config = await getConfig(cwd); const logger = createLogger(); diff --git a/packages/cli/src/commands/cache/clearCache.ts b/packages/cli/src/commands/cache/clearCache.ts index 6f20d0a09..833cafb52 100644 --- a/packages/cli/src/commands/cache/clearCache.ts +++ b/packages/cli/src/commands/cache/clearCache.ts @@ -10,7 +10,7 @@ export interface ClearCacheOptions { concurrency: number; } -export async function clearCache(options: ClearCacheOptions) { +export async function clearCache(options: ClearCacheOptions): Promise { const { logger, cwd } = options; const config = await getConfig(cwd); diff --git a/packages/cli/src/commands/cache/index.ts b/packages/cli/src/commands/cache/index.ts index fcb466f47..b3253c157 100644 --- a/packages/cli/src/commands/cache/index.ts +++ b/packages/cli/src/commands/cache/index.ts @@ -2,7 +2,7 @@ import { Command, Option } from "commander"; import { addLoggerOptions } from "../addLoggerOptions.js"; import { cacheAction } from "./action.js"; -const cacheCommand = new Command("cache"); +const cacheCommand: Command = new Command("cache"); addLoggerOptions(cacheCommand) .action(cacheAction) diff --git a/packages/cli/src/commands/cache/pruneCache.ts b/packages/cli/src/commands/cache/pruneCache.ts index 1e15ae57e..a843f1140 100644 --- a/packages/cli/src/commands/cache/pruneCache.ts +++ b/packages/cli/src/commands/cache/pruneCache.ts @@ -11,7 +11,7 @@ export interface PruneCacheOptions { pruneDays: number; } -export async function pruneCache(options: PruneCacheOptions) { +export async function pruneCache(options: PruneCacheOptions): Promise { const { logger, cwd, pruneDays } = options; const config = await getConfig(cwd); diff --git a/packages/cli/src/commands/cache/runners/ClearCacheRunner.ts b/packages/cli/src/commands/cache/runners/ClearCacheRunner.ts index ff5c25c1e..453d0468d 100644 --- a/packages/cli/src/commands/cache/runners/ClearCacheRunner.ts +++ b/packages/cli/src/commands/cache/runners/ClearCacheRunner.ts @@ -4,7 +4,7 @@ import path from "path"; import { rm, stat, unlink } from "fs/promises"; export class ClearCacheRunner implements TargetRunner { - async shouldRun() { + async shouldRun(): Promise { return true; } async run(runOptions: TargetRunnerOptions): Promise { diff --git a/packages/cli/src/commands/cache/runners/PruneCacheRunner.ts b/packages/cli/src/commands/cache/runners/PruneCacheRunner.ts index 8b4df0a1a..4d9a5c4d2 100644 --- a/packages/cli/src/commands/cache/runners/PruneCacheRunner.ts +++ b/packages/cli/src/commands/cache/runners/PruneCacheRunner.ts @@ -6,7 +6,7 @@ import { rm, stat, unlink } from "fs/promises"; const MS_IN_A_DAY = 1000 * 60 * 60 * 24; export class PruneCacheRunner implements TargetRunner { - async shouldRun() { + async shouldRun(): Promise { return true; } async run(runOptions: TargetRunnerOptions): Promise { diff --git a/packages/cli/src/commands/createReporter.ts b/packages/cli/src/commands/createReporter.ts index 682c1b163..f76f4db25 100644 --- a/packages/cli/src/commands/createReporter.ts +++ b/packages/cli/src/commands/createReporter.ts @@ -1,4 +1,4 @@ -import { LogLevel } from "@lage-run/logger"; +import { LogLevel, type Reporter } from "@lage-run/logger"; import { JsonReporter, AdoReporter, @@ -12,7 +12,7 @@ import { findPackageRoot } from "workspace-tools"; import { readFileSync } from "fs"; import path from "path"; -export function createReporter(reporter: string, options: ReporterInitOptions) { +export function createReporter(reporter: string, options: ReporterInitOptions): Reporter { const { verbose, grouped, logLevel: logLevelName, concurrency, profile, progress, logFile } = options; const logLevel = LogLevel[logLevelName]; diff --git a/packages/cli/src/commands/exec/action.ts b/packages/cli/src/commands/exec/action.ts index b61095a91..f1808396f 100644 --- a/packages/cli/src/commands/exec/action.ts +++ b/packages/cli/src/commands/exec/action.ts @@ -17,7 +17,7 @@ interface ExecRemoteOptions extends ExecOptions { tasks: string[]; } -export async function execAction(options: ExecOptions, command: Command) { +export async function execAction(options: ExecOptions, command: Command): Promise { const logger = createLogger(); options.cwd = options.cwd ?? process.cwd(); options.logLevel = options.logLevel ?? "info"; diff --git a/packages/cli/src/commands/exec/executeInProcess.ts b/packages/cli/src/commands/exec/executeInProcess.ts index 401c94af4..bf3356c6b 100644 --- a/packages/cli/src/commands/exec/executeInProcess.ts +++ b/packages/cli/src/commands/exec/executeInProcess.ts @@ -80,7 +80,7 @@ function parsePackageInfoFromArgs(root: string, cwd: string | undefined, package }; } -export async function executeInProcess({ cwd, args, nodeArg, logger }: ExecuteInProcessOptions) { +export async function executeInProcess({ cwd, args, nodeArg, logger }: ExecuteInProcessOptions): Promise { const root = getWorkspaceRoot(process.cwd())!; const config = await getConfig(root); const { pipeline } = config; diff --git a/packages/cli/src/commands/exec/executeRemotely.ts b/packages/cli/src/commands/exec/executeRemotely.ts index 39520c952..5fa4c570f 100644 --- a/packages/cli/src/commands/exec/executeRemotely.ts +++ b/packages/cli/src/commands/exec/executeRemotely.ts @@ -91,7 +91,7 @@ async function executeOnServer(args: string[], client: LageClient, logger: Logge } } -export async function executeRemotely(options: ExecRemotelyOptions, command: Command) { +export async function executeRemotely(options: ExecRemotelyOptions, command: Command): Promise { // launch a 'lage-server.js' process, detached if it is not already running // send the command to the server process const { server, tasks, nodeArg } = options; diff --git a/packages/cli/src/commands/exec/expandTargetDefinition.ts b/packages/cli/src/commands/exec/expandTargetDefinition.ts index c8808c5ed..0a803cc6c 100644 --- a/packages/cli/src/commands/exec/expandTargetDefinition.ts +++ b/packages/cli/src/commands/exec/expandTargetDefinition.ts @@ -1,6 +1,12 @@ import { type PipelineDefinition } from "@lage-run/config"; +import { type TargetConfig } from "@lage-run/target-graph"; -export function expandTargetDefinition(packageName: string | undefined, task: string, pipeline: PipelineDefinition, outputs: string[]) { +export function expandTargetDefinition( + packageName: string | undefined, + task: string, + pipeline: PipelineDefinition, + outputs: string[] +): TargetConfig { const id = packageName ? `${packageName}#${task}` : task; const emptyDefinition = { cache: false, diff --git a/packages/cli/src/commands/exec/index.ts b/packages/cli/src/commands/exec/index.ts index 7d9b90c0c..22b5ffa15 100644 --- a/packages/cli/src/commands/exec/index.ts +++ b/packages/cli/src/commands/exec/index.ts @@ -3,7 +3,7 @@ import { execAction } from "./action.js"; import { addLoggerOptions } from "../addLoggerOptions.js"; import os from "os"; -const execCommand = new Command("exec"); +const execCommand: Command = new Command("exec"); execCommand.option( "-n|--node-arg ", "node argument to pass to worker, just a single string to be passed into node like a NODE_OPTIONS setting" diff --git a/packages/cli/src/commands/exec/simulateFileAccess.ts b/packages/cli/src/commands/exec/simulateFileAccess.ts index 74ee47320..90197c20c 100644 --- a/packages/cli/src/commands/exec/simulateFileAccess.ts +++ b/packages/cli/src/commands/exec/simulateFileAccess.ts @@ -3,7 +3,7 @@ import path from "path"; import fs from "fs"; import { getWorkspaceRoot } from "workspace-tools"; -export async function simulateFileAccess(logger: Logger, inputs: string[], outputs: string[]) { +export async function simulateFileAccess(logger: Logger, inputs: string[], outputs: string[]): Promise { const root = getWorkspaceRoot(process.cwd())!; logger.silly("Now probing and touching inputs and outputs"); diff --git a/packages/cli/src/commands/info/action.ts b/packages/cli/src/commands/info/action.ts index be843e0f6..d2a4402c9 100644 --- a/packages/cli/src/commands/info/action.ts +++ b/packages/cli/src/commands/info/action.ts @@ -76,7 +76,7 @@ interface PackageTask { * ... * ] */ -export async function infoAction(options: InfoActionOptions, command: Command) { +export async function infoAction(options: InfoActionOptions, command: Command): Promise { const cwd = process.cwd(); const config = await getConfig(cwd); const logger = createLogger(); diff --git a/packages/cli/src/commands/info/index.ts b/packages/cli/src/commands/info/index.ts index aaf222545..b1f6f9d84 100644 --- a/packages/cli/src/commands/info/index.ts +++ b/packages/cli/src/commands/info/index.ts @@ -3,7 +3,7 @@ import { infoAction } from "./action.js"; import { addFilterOptions } from "../addFilterOptions.js"; import { addLoggerOptions } from "../addLoggerOptions.js"; -const infoCommand = new Command("info"); +const infoCommand: Command = new Command("info"); addFilterOptions(addLoggerOptions(infoCommand)); infoCommand.description("Display information about a target graph in a workspace.\n" + "It is used by BuildXL to build a pip-graph"); diff --git a/packages/cli/src/commands/init/action.ts b/packages/cli/src/commands/init/action.ts index d801d8d6f..d6324c6b0 100644 --- a/packages/cli/src/commands/init/action.ts +++ b/packages/cli/src/commands/init/action.ts @@ -6,7 +6,7 @@ import execa from "execa"; type WorkspaceManager = "rush" | "pnpm" | "yarn" | "npm"; -export async function initAction() { +export async function initAction(): Promise { const cwd = process.cwd(); const config = await readConfigFile(cwd); diff --git a/packages/cli/src/commands/init/index.ts b/packages/cli/src/commands/init/index.ts index 319e63cf8..4434ba918 100644 --- a/packages/cli/src/commands/init/index.ts +++ b/packages/cli/src/commands/init/index.ts @@ -2,7 +2,7 @@ import { Command } from "commander"; import { addFilterOptions } from "../addFilterOptions.js"; import { initAction } from "./action.js"; -const initCommand = new Command("init"); +const initCommand: Command = new Command("init"); addFilterOptions(initCommand).description("Install lage in a workspace and create a config file").action(initAction); diff --git a/packages/cli/src/commands/initializeReporters.ts b/packages/cli/src/commands/initializeReporters.ts index 4b07e5c2c..5ad4e57a2 100644 --- a/packages/cli/src/commands/initializeReporters.ts +++ b/packages/cli/src/commands/initializeReporters.ts @@ -1,8 +1,8 @@ import { createReporter } from "./createReporter.js"; -import type { Logger } from "@lage-run/logger"; +import type { LogStructuredData, Logger, Reporter } from "@lage-run/logger"; import type { ReporterInitOptions } from "../types/ReporterInitOptions.js"; -export function initializeReporters(logger: Logger, options: ReporterInitOptions) { +export function initializeReporters(logger: Logger, options: ReporterInitOptions): Reporter[] { const { reporter } = options; // filter out falsy values (e.g. undefined) from the reporter array diff --git a/packages/cli/src/commands/isRunningFromCI.ts b/packages/cli/src/commands/isRunningFromCI.ts index b2ec496b7..dd86cb254 100644 --- a/packages/cli/src/commands/isRunningFromCI.ts +++ b/packages/cli/src/commands/isRunningFromCI.ts @@ -1 +1 @@ -export const isRunningFromCI = process.env.NODE_ENV !== "test" && (!!process.env.CI || !!process.env.TF_BUILD); +export const isRunningFromCI: boolean = process.env.NODE_ENV !== "test" && (!!process.env.CI || !!process.env.TF_BUILD); diff --git a/packages/cli/src/commands/launchServerInBackground.ts b/packages/cli/src/commands/launchServerInBackground.ts index 77fc4cc57..33f0e2296 100644 --- a/packages/cli/src/commands/launchServerInBackground.ts +++ b/packages/cli/src/commands/launchServerInBackground.ts @@ -25,7 +25,7 @@ export async function launchServerInBackground({ timeout, args, nodeArg, -}: launchServerInBackgroundOptions) { +}: launchServerInBackgroundOptions): Promise { const lockfilePath = path.join(root, `node_modules/.cache/lage/.lage-server-${host}-${port}.pid`); logger.info(`Starting server on http://${host}:${port}`); diff --git a/packages/cli/src/commands/parseServerOption.ts b/packages/cli/src/commands/parseServerOption.ts index 939ed4e18..33fd838b4 100644 --- a/packages/cli/src/commands/parseServerOption.ts +++ b/packages/cli/src/commands/parseServerOption.ts @@ -1,4 +1,7 @@ -export function parseServerOption(server: boolean | string | undefined) { +export function parseServerOption(server: boolean | string | undefined): { + host: string; + port: number; +} { const isBooleanAndTrue = typeof server === "boolean" && server; const isEmptyServer = typeof server === "undefined" || server === false; const serverString = isBooleanAndTrue ? "localhost:5332" : isEmptyServer ? "localhost:5332" : server; diff --git a/packages/cli/src/commands/run/action.ts b/packages/cli/src/commands/run/action.ts index be8770867..f94226c89 100644 --- a/packages/cli/src/commands/run/action.ts +++ b/packages/cli/src/commands/run/action.ts @@ -23,7 +23,7 @@ interface RunOptions extends ReporterInitOptions { allowNoTargetRuns: boolean; } -export async function action(options: RunOptions, command: Command) { +export async function action(options: RunOptions, command: Command): Promise { if (options.watch) { return watchAction(options, command); } else { diff --git a/packages/cli/src/commands/run/createTargetGraph.ts b/packages/cli/src/commands/run/createTargetGraph.ts index 770ebe347..d9cd5a5b3 100644 --- a/packages/cli/src/commands/run/createTargetGraph.ts +++ b/packages/cli/src/commands/run/createTargetGraph.ts @@ -1,5 +1,5 @@ import type { Logger } from "@lage-run/logger"; -import { WorkspaceTargetGraphBuilder } from "@lage-run/target-graph"; +import { type TargetGraph, WorkspaceTargetGraphBuilder } from "@lage-run/target-graph"; import type { PackageInfos } from "workspace-tools"; import { getBranchChanges, getDefaultRemoteBranch, getStagedChanges, getUnstagedChanges, getUntrackedChanges } from "workspace-tools"; import { getFilteredPackages } from "../../filter/getFilteredPackages.js"; @@ -37,7 +37,7 @@ function getChangedFiles(since: string, cwd: string) { return changes; } -export async function createTargetGraph(options: CreateTargetGraphOptions) { +export async function createTargetGraph(options: CreateTargetGraphOptions): Promise { const { logger, root, diff --git a/packages/cli/src/commands/run/filterArgsForTasks.ts b/packages/cli/src/commands/run/filterArgsForTasks.ts index 740746319..bc0e8024d 100644 --- a/packages/cli/src/commands/run/filterArgsForTasks.ts +++ b/packages/cli/src/commands/run/filterArgsForTasks.ts @@ -1,4 +1,7 @@ -export function filterArgsForTasks(args: string[]) { +export function filterArgsForTasks(args: string[]): { + tasks: string[]; + taskArgs: string[]; +} { const optionsPosition = args.findIndex((arg) => arg.startsWith("-")); return { tasks: args.slice(0, optionsPosition === -1 ? undefined : optionsPosition), diff --git a/packages/cli/src/commands/run/filterPipelineDefinitions.ts b/packages/cli/src/commands/run/filterPipelineDefinitions.ts index cde3a1905..59984c1f1 100644 --- a/packages/cli/src/commands/run/filterPipelineDefinitions.ts +++ b/packages/cli/src/commands/run/filterPipelineDefinitions.ts @@ -1,7 +1,7 @@ import type { Target } from "@lage-run/target-graph"; import type { PipelineDefinition } from "@lage-run/config"; -export function filterPipelineDefinitions(targets: IterableIterator, pipeline: PipelineDefinition) { +export function filterPipelineDefinitions(targets: IterableIterator, pipeline: PipelineDefinition): PipelineDefinition { const tasksSet = new Set(); for (const target of targets) { diff --git a/packages/cli/src/commands/run/index.ts b/packages/cli/src/commands/run/index.ts index 486f3497c..ea0bb1fc6 100644 --- a/packages/cli/src/commands/run/index.ts +++ b/packages/cli/src/commands/run/index.ts @@ -4,7 +4,7 @@ import { addLoggerOptions } from "../addLoggerOptions.js"; import { isRunningFromCI } from "../isRunningFromCI.js"; import { addFilterOptions } from "../addFilterOptions.js"; -const runCommand = new Command("run"); +const runCommand: Command = new Command("run"); addFilterOptions(addLoggerOptions(runCommand)) .action(action) diff --git a/packages/cli/src/commands/run/runAction.ts b/packages/cli/src/commands/run/runAction.ts index a37df8c3c..c373267cb 100644 --- a/packages/cli/src/commands/run/runAction.ts +++ b/packages/cli/src/commands/run/runAction.ts @@ -31,7 +31,7 @@ interface RunOptions extends ReporterInitOptions, FilterOptions { allowNoTargetRuns: boolean; } -export async function runAction(options: RunOptions, command: Command) { +export async function runAction(options: RunOptions, command: Command): Promise { const cwd = process.cwd(); const config = await getConfig(cwd); diff --git a/packages/cli/src/commands/run/watchAction.ts b/packages/cli/src/commands/run/watchAction.ts index 134f3892f..15d204229 100644 --- a/packages/cli/src/commands/run/watchAction.ts +++ b/packages/cli/src/commands/run/watchAction.ts @@ -30,7 +30,7 @@ interface RunOptions extends ReporterInitOptions, FilterOptions { allowNoTargetRuns: boolean; } -export async function watchAction(options: RunOptions, command: Command) { +export async function watchAction(options: RunOptions, command: Command): Promise { const cwd = process.cwd(); const config = await getConfig(cwd); const concurrency = getConcurrency(options.concurrency, config.concurrency); diff --git a/packages/cli/src/commands/server/MemoryStream.ts b/packages/cli/src/commands/server/MemoryStream.ts index f45d7b651..7118c29d7 100644 --- a/packages/cli/src/commands/server/MemoryStream.ts +++ b/packages/cli/src/commands/server/MemoryStream.ts @@ -8,7 +8,7 @@ export class MemoryStream extends Writable { this.chunks = []; } - _write(chunk: any, encoding: BufferEncoding) { + _write(chunk: any, encoding: BufferEncoding): void { this.chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding)); } diff --git a/packages/cli/src/commands/server/action.ts b/packages/cli/src/commands/server/action.ts index 1021ef09c..ff635d6b3 100644 --- a/packages/cli/src/commands/server/action.ts +++ b/packages/cli/src/commands/server/action.ts @@ -13,7 +13,7 @@ interface WorkerOptions extends ReporterInitOptions { tasks: string[]; } -export async function serverAction(options: WorkerOptions) { +export async function serverAction(options: WorkerOptions): Promise { const { port = 5332, host = "localhost", timeout = 1, tasks } = options; const logger = createLogger(); diff --git a/packages/cli/src/commands/server/getOutputFiles.ts b/packages/cli/src/commands/server/getOutputFiles.ts index edf3cb3c8..f0c9d77c4 100644 --- a/packages/cli/src/commands/server/getOutputFiles.ts +++ b/packages/cli/src/commands/server/getOutputFiles.ts @@ -5,7 +5,7 @@ import type { Target } from "@lage-run/target-graph"; import path from "path"; -export function getOutputFiles(root: string, target: Target, outputGlob: CacheOptions["outputGlob"], packageTree: PackageTree) { +export function getOutputFiles(root: string, target: Target, outputGlob: CacheOptions["outputGlob"], packageTree: PackageTree): string[] { const patterns = target.outputs ?? outputGlob ?? ["**/*"]; const sourceControlledFiles = new Set(packageTree.getPackageFiles(target.packageName ?? "", patterns)); diff --git a/packages/cli/src/commands/server/index.ts b/packages/cli/src/commands/server/index.ts index 2904f428c..4a46b6efd 100644 --- a/packages/cli/src/commands/server/index.ts +++ b/packages/cli/src/commands/server/index.ts @@ -3,7 +3,7 @@ import { Command } from "commander"; import { serverAction } from "./action.js"; import { addLoggerOptions } from "../addLoggerOptions.js"; -const serverCommand = new Command("server"); +const serverCommand: Command = new Command("server"); serverCommand.option( "-n|--node-arg ", "node argument to pass to worker, just a single string to be passed into node like a NODE_OPTIONS setting" diff --git a/packages/cli/src/filter/getFilteredPackages.ts b/packages/cli/src/filter/getFilteredPackages.ts index e8f2cd681..605899cf0 100644 --- a/packages/cli/src/filter/getFilteredPackages.ts +++ b/packages/cli/src/filter/getFilteredPackages.ts @@ -14,7 +14,7 @@ export function getFilteredPackages(options: { repoWideChanges: string[]; includeDependents: boolean; includeDependencies: boolean; -}) { +}): string[] { const { scope, since, sinceIgnoreGlobs, repoWideChanges, includeDependents, includeDependencies, logger, packageInfos, root } = options; // If scoped is defined, get scoped packages @@ -78,7 +78,7 @@ export function filterPackages(options: { includeDependencies: boolean; scopedPackages: string[] | undefined; changedPackages: string[] | undefined; -}) { +}): string[] { const { scopedPackages, changedPackages, packageInfos, includeDependents, includeDependencies, logger } = options; let filtered: string[] = []; diff --git a/packages/cli/src/filter/hasRepoChanged.ts b/packages/cli/src/filter/hasRepoChanged.ts index abfcad38e..711435863 100644 --- a/packages/cli/src/filter/hasRepoChanged.ts +++ b/packages/cli/src/filter/hasRepoChanged.ts @@ -2,7 +2,7 @@ import { getBranchChanges } from "workspace-tools"; import * as fg from "fast-glob"; import type { Logger } from "@lage-run/logger"; -export function hasRepoChanged(since: string, root: string, environmentGlob: string[], logger: Logger) { +export function hasRepoChanged(since: string, root: string, environmentGlob: string[], logger: Logger): boolean { try { const changedFiles = getBranchChanges(since, root); const envFiles = fg.sync(environmentGlob, { cwd: root }); diff --git a/packages/cli/src/getBinPaths.ts b/packages/cli/src/getBinPaths.ts index d6afe7b08..19d225d70 100644 --- a/packages/cli/src/getBinPaths.ts +++ b/packages/cli/src/getBinPaths.ts @@ -14,7 +14,10 @@ function findUp(name: string, dir: string) { return undefined; } -export function getBinPaths() { +export function getBinPaths(): { + lage: string; + "lage-server": string; +} { const bins = os.platform() === "win32" ? ["lage.cmd", "lage-server.cmd"] : ["lage", "lage-server"]; const binPaths = bins.map((bin) => findUp("node_modules/.bin/" + bin, __dirname)); @@ -25,7 +28,10 @@ export function getBinPaths() { return { lage: binPaths[0]!, "lage-server": binPaths[1]! }; } -export function getBinScripts() { +export function getBinScripts(): { + lage: string; + "lage-server": string; +} { const thisPackageJsonPath = findUp("package.json", __dirname); if (!thisPackageJsonPath) { diff --git a/packages/cli/src/optimizeTargetGraph.ts b/packages/cli/src/optimizeTargetGraph.ts index 1124233a2..b8d5ac20f 100644 --- a/packages/cli/src/optimizeTargetGraph.ts +++ b/packages/cli/src/optimizeTargetGraph.ts @@ -1,7 +1,7 @@ import type { TargetRunnerPicker } from "@lage-run/runners"; -import { type TargetGraph, removeNodes, transitiveReduction, getStartTargetId } from "@lage-run/target-graph"; +import { type TargetGraph, removeNodes, transitiveReduction, getStartTargetId, type Target } from "@lage-run/target-graph"; -export async function optimizeTargetGraph(graph: TargetGraph, runnerPicker: TargetRunnerPicker) { +export async function optimizeTargetGraph(graph: TargetGraph, runnerPicker: TargetRunnerPicker): Promise { const targetMinimizedNodes = await removeNodes([...graph.targets.values()], async (target) => { if (target.type === "noop") { return true; diff --git a/packages/cli/src/showHelp.ts b/packages/cli/src/showHelp.ts index a7fba311b..1a5b9db13 100644 --- a/packages/cli/src/showHelp.ts +++ b/packages/cli/src/showHelp.ts @@ -1,6 +1,6 @@ /* eslint-disable no-console */ -export function showHelp(msg: string) { +export function showHelp(msg: string): void { console.error(msg); console.log(` diff --git a/packages/cli/src/types/errors.ts b/packages/cli/src/types/errors.ts index ddaaf0bc6..472409ee0 100644 --- a/packages/cli/src/types/errors.ts +++ b/packages/cli/src/types/errors.ts @@ -1 +1 @@ -export const NoTargetFoundError = new Error("No target found"); +export const NoTargetFoundError: Error = new Error("No target found"); From 871044883476a3129518d872ec703042adb31676 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 22:25:27 +0000 Subject: [PATCH 22/36] fixing up e2e-tests --- packages/e2e-tests/src/mock/monorepo.ts | 28 ++++++++++++------------- packages/e2e-tests/src/parseNdJson.ts | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/e2e-tests/src/mock/monorepo.ts b/packages/e2e-tests/src/mock/monorepo.ts index 96a49ac38..9a1b32324 100644 --- a/packages/e2e-tests/src/mock/monorepo.ts +++ b/packages/e2e-tests/src/mock/monorepo.ts @@ -6,15 +6,15 @@ import * as execa from "execa"; import { glob } from "@lage-run/globby"; export class Monorepo { - static tmpdir = os.tmpdir(); + static tmpdir: string = os.tmpdir(); root: string; nodeModulesPath: string; yarnPath: string; - static externalPackageJsonGlobs = ["node_modules/glob-hasher/package.json", "node_modules/glob-hasher-*/package.json"]; + static externalPackageJsonGlobs: string[] = ["node_modules/glob-hasher/package.json", "node_modules/glob-hasher-*/package.json"]; - static externalPackageJsons = glob(Monorepo.externalPackageJsonGlobs, { + static externalPackageJsons: string[] = glob(Monorepo.externalPackageJsonGlobs, { cwd: path.join(__dirname, "..", "..", "..", ".."), gitignore: false, })!.map((f) => path.resolve(path.join(__dirname, "..", "..", "..", ".."), f)); @@ -25,7 +25,7 @@ export class Monorepo { this.yarnPath = path.join(this.root, ".yarn", "yarn.js"); } - init() { + init(): void { const options = { cwd: this.root }; execa.sync("git", ["init"], options); execa.sync("git", ["config", "user.email", "you@example.com"], options); @@ -34,7 +34,7 @@ export class Monorepo { this.generateRepoFiles(); } - install() { + install(): void { for (const packagePath of Monorepo.externalPackageJsons.map((p) => path.dirname(p))) { const name = JSON.parse(fs.readFileSync(path.join(packagePath, "package.json"), "utf-8")).name; fs.cpSync(packagePath, path.join(this.root, "node_modules", name), { recursive: true }); @@ -44,7 +44,7 @@ export class Monorepo { execa.sync(`"${process.execPath}"`, [`"${this.yarnPath}"`, "install"], { cwd: this.root, shell: true }); } - generateRepoFiles() { + generateRepoFiles(): void { this.commitFiles({ ".yarnrc": `yarn-path "${this.yarnPath}"`, "package.json": { @@ -81,13 +81,13 @@ export class Monorepo { }); } - setLageConfig(contents: string) { + setLageConfig(contents: string): void { this.commitFiles({ "lage.config.js": contents, }); } - addPackage(name: string, internalDeps: string[] = [], scripts?: { [script: string]: string }) { + addPackage(name: string, internalDeps: string[] = [], scripts?: { [script: string]: string }): void { return this.commitFiles({ [`packages/${name}/build.js`]: `console.log('building ${name}');`, [`packages/${name}/test.js`]: `console.log('testing ${name}');`, @@ -111,15 +111,15 @@ export class Monorepo { }); } - clone(origin: string) { + clone(origin: string): execa.ExecaSyncReturnValue { return execa.sync("git", ["clone", origin], { cwd: this.root }); } - push(origin: string, branch: string) { + push(origin: string, branch: string): execa.ExecaSyncReturnValue { return execa.sync("git", ["push", origin, branch], { cwd: this.root }); } - commitFiles(files: { [name: string]: string | Record }, options: { executable?: boolean } = {}) { + commitFiles(files: { [name: string]: string | Record }, options: { executable?: boolean } = {}): void { for (const [file, contents] of Object.entries(files)) { let out = ""; if (typeof contents !== "string") { @@ -148,13 +148,13 @@ export class Monorepo { execa.sync("git", ["commit", "-m", "commit files"], { cwd: this.root }); } - run(command: string, args?: string[], silent?: boolean) { + run(command: string, args?: string[], silent?: boolean): execa.ExecaSyncReturnValue { return execa.sync(process.execPath, [this.yarnPath, ...(silent === true ? ["--silent"] : []), command, ...(args || [])], { cwd: this.root, }); } - runServer() { + runServer(): execa.ExecaChildProcess { return execa.default(process.execPath, [path.join(this.root, "node_modules/lage/dist/lage-server.js")], { cwd: this.root, detached: true, @@ -162,7 +162,7 @@ export class Monorepo { }); } - async cleanup() { + async cleanup(): Promise { const maxRetries = 5; let attempts = 0; diff --git a/packages/e2e-tests/src/parseNdJson.ts b/packages/e2e-tests/src/parseNdJson.ts index d51a2e628..8113b9623 100644 --- a/packages/e2e-tests/src/parseNdJson.ts +++ b/packages/e2e-tests/src/parseNdJson.ts @@ -1,6 +1,6 @@ import type { TargetStatus } from "@lage-run/scheduler-types"; -export function parseNdJson(ndjson: string) { +export function parseNdJson(ndjson: string): any[] { const entries = ndjson.substr(ndjson.indexOf("{")); return entries .split("\n") @@ -20,6 +20,6 @@ export function parseNdJson(ndjson: string) { .filter((entry) => Object.keys(entry).length > 0); } -export function filterEntry(data: any, pkg: string, task: string, status: TargetStatus) { +export function filterEntry(data: any, pkg: string, task: string, status: TargetStatus): boolean { return data?.target?.packageName === pkg && data?.target?.task === task && data.status === status; } From ecd4800367975053511d7e00bf30dc1ef6a66bb9 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 22:26:14 +0000 Subject: [PATCH 23/36] Change files --- ...-7f40e1b3-256a-42a3-a306-4cc681250ece.json | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 change/change-7f40e1b3-256a-42a3-a306-4cc681250ece.json diff --git a/change/change-7f40e1b3-256a-42a3-a306-4cc681250ece.json b/change/change-7f40e1b3-256a-42a3-a306-4cc681250ece.json new file mode 100644 index 000000000..260b94e35 --- /dev/null +++ b/change/change-7f40e1b3-256a-42a3-a306-4cc681250ece.json @@ -0,0 +1,95 @@ +{ + "changes": [ + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/cache", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/cli", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/config", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/format-hrtime", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/globby", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/hasher", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/logger", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/reporters", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/rpc", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/runners", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/scheduler", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/target-graph", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "Adding isolated-declarations flag everywhere", + "packageName": "@lage-run/worker-threads-pool", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + } + ] +} \ No newline at end of file From 981ebcdca9145262b7d96c79ba1ba391935542ac Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 22:34:32 +0000 Subject: [PATCH 24/36] updated swc and enabled emitIsolatedDts with swc --- .swcrc | 5 ++- scripts/package.json | 2 +- yarn.lock | 102 +++++++++++++++++++++---------------------- 3 files changed, 56 insertions(+), 53 deletions(-) diff --git a/.swcrc b/.swcrc index e8da5ffc6..a623edcfb 100644 --- a/.swcrc +++ b/.swcrc @@ -6,7 +6,10 @@ "tsx": false, "dynamicImport": true }, - "target": "es2020" + "target": "es2020", + "experimental": { + "emitIsolatedDts": true + } }, "module": { "type": "commonjs", diff --git a/scripts/package.json b/scripts/package.json index afdbe02e5..e2e8c0cef 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -4,7 +4,7 @@ "private": true, "bin": "bin/monorepo-scripts.js", "dependencies": { - "@swc/core": "^1.9.1", + "@swc/core": "^1.10.7", "@swc/jest": "^0.2.37", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.30.7", diff --git a/yarn.lock b/yarn.lock index 95da36995..b9973ea19 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1837,7 +1837,7 @@ __metadata: version: 0.0.0-use.local resolution: "@lage-run/monorepo-scripts@workspace:scripts" dependencies: - "@swc/core": "npm:^1.9.1" + "@swc/core": "npm:^1.10.7" "@swc/jest": "npm:^0.2.37" "@typescript-eslint/eslint-plugin": "npm:^5.30.7" "@typescript-eslint/parser": "npm:^5.30.7" @@ -2039,92 +2039,92 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.9.1": - version: 1.9.1 - resolution: "@swc/core-darwin-arm64@npm:1.9.1" +"@swc/core-darwin-arm64@npm:1.10.7": + version: 1.10.7 + resolution: "@swc/core-darwin-arm64@npm:1.10.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.9.1": - version: 1.9.1 - resolution: "@swc/core-darwin-x64@npm:1.9.1" +"@swc/core-darwin-x64@npm:1.10.7": + version: 1.10.7 + resolution: "@swc/core-darwin-x64@npm:1.10.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.9.1": - version: 1.9.1 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.9.1" +"@swc/core-linux-arm-gnueabihf@npm:1.10.7": + version: 1.10.7 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.7" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.9.1": - version: 1.9.1 - resolution: "@swc/core-linux-arm64-gnu@npm:1.9.1" +"@swc/core-linux-arm64-gnu@npm:1.10.7": + version: 1.10.7 + resolution: "@swc/core-linux-arm64-gnu@npm:1.10.7" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.9.1": - version: 1.9.1 - resolution: "@swc/core-linux-arm64-musl@npm:1.9.1" +"@swc/core-linux-arm64-musl@npm:1.10.7": + version: 1.10.7 + resolution: "@swc/core-linux-arm64-musl@npm:1.10.7" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.9.1": - version: 1.9.1 - resolution: "@swc/core-linux-x64-gnu@npm:1.9.1" +"@swc/core-linux-x64-gnu@npm:1.10.7": + version: 1.10.7 + resolution: "@swc/core-linux-x64-gnu@npm:1.10.7" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.9.1": - version: 1.9.1 - resolution: "@swc/core-linux-x64-musl@npm:1.9.1" +"@swc/core-linux-x64-musl@npm:1.10.7": + version: 1.10.7 + resolution: "@swc/core-linux-x64-musl@npm:1.10.7" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.9.1": - version: 1.9.1 - resolution: "@swc/core-win32-arm64-msvc@npm:1.9.1" +"@swc/core-win32-arm64-msvc@npm:1.10.7": + version: 1.10.7 + resolution: "@swc/core-win32-arm64-msvc@npm:1.10.7" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.9.1": - version: 1.9.1 - resolution: "@swc/core-win32-ia32-msvc@npm:1.9.1" +"@swc/core-win32-ia32-msvc@npm:1.10.7": + version: 1.10.7 + resolution: "@swc/core-win32-ia32-msvc@npm:1.10.7" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.9.1": - version: 1.9.1 - resolution: "@swc/core-win32-x64-msvc@npm:1.9.1" +"@swc/core-win32-x64-msvc@npm:1.10.7": + version: 1.10.7 + resolution: "@swc/core-win32-x64-msvc@npm:1.10.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.9.1": - version: 1.9.1 - resolution: "@swc/core@npm:1.9.1" - dependencies: - "@swc/core-darwin-arm64": "npm:1.9.1" - "@swc/core-darwin-x64": "npm:1.9.1" - "@swc/core-linux-arm-gnueabihf": "npm:1.9.1" - "@swc/core-linux-arm64-gnu": "npm:1.9.1" - "@swc/core-linux-arm64-musl": "npm:1.9.1" - "@swc/core-linux-x64-gnu": "npm:1.9.1" - "@swc/core-linux-x64-musl": "npm:1.9.1" - "@swc/core-win32-arm64-msvc": "npm:1.9.1" - "@swc/core-win32-ia32-msvc": "npm:1.9.1" - "@swc/core-win32-x64-msvc": "npm:1.9.1" +"@swc/core@npm:^1.10.7": + version: 1.10.7 + resolution: "@swc/core@npm:1.10.7" + dependencies: + "@swc/core-darwin-arm64": "npm:1.10.7" + "@swc/core-darwin-x64": "npm:1.10.7" + "@swc/core-linux-arm-gnueabihf": "npm:1.10.7" + "@swc/core-linux-arm64-gnu": "npm:1.10.7" + "@swc/core-linux-arm64-musl": "npm:1.10.7" + "@swc/core-linux-x64-gnu": "npm:1.10.7" + "@swc/core-linux-x64-musl": "npm:1.10.7" + "@swc/core-win32-arm64-msvc": "npm:1.10.7" + "@swc/core-win32-ia32-msvc": "npm:1.10.7" + "@swc/core-win32-x64-msvc": "npm:1.10.7" "@swc/counter": "npm:^0.1.3" - "@swc/types": "npm:^0.1.14" + "@swc/types": "npm:^0.1.17" peerDependencies: "@swc/helpers": "*" dependenciesMeta: @@ -2151,7 +2151,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10c0/7b9a3da9bdd95216b031739ebe35983e69f17284809a62706c93edfd30ede0732060d944db23007aca9aebbc49859eb5784454c8882ae6fd04eb8bd15ac6a247 + checksum: 10c0/73d3b164620590aff57512125e3cfd6dc1bb3346882fa9ad12abf8029f8be01eb71e6afc3c760c3e2cb479a2d7ff3180bf298f907768b93e3eac15fc72e0d855 languageName: node linkType: hard @@ -2175,12 +2175,12 @@ __metadata: languageName: node linkType: hard -"@swc/types@npm:^0.1.14": - version: 0.1.14 - resolution: "@swc/types@npm:0.1.14" +"@swc/types@npm:^0.1.17": + version: 0.1.17 + resolution: "@swc/types@npm:0.1.17" dependencies: "@swc/counter": "npm:^0.1.3" - checksum: 10c0/5ab5a213f25fbb038e8b2fa001a20c64363f81c199319373ed0228f316c046a996758fbaf906ba84d297b35e37727082d27974266db320e534da594716626529 + checksum: 10c0/29f5c8933a16042956f1adb7383e836ed7646cbf679826e78b53fdd0c08e8572cb42152e527b6b530a9bd1052d33d0972f90f589761ccd252c12652c9b7a72fc languageName: node linkType: hard From cfdfd31a7c612b9b3598353d000d8514bc4465e4 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 23:01:54 +0000 Subject: [PATCH 25/36] adding experimentals --- lage.config.js | 7 ++----- scripts/worker/transpile.js | 13 +++++++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lage.config.js b/lage.config.js index dd0a50859..5652e9c57 100644 --- a/lage.config.js +++ b/lage.config.js @@ -7,11 +7,8 @@ module.exports = { pipeline: { "lage#bundle": ["^^transpile", "types"], types: { - type: "worker", - options: { - worker: path.join(__dirname, "scripts/worker/types.js"), - }, - dependsOn: ["^types"], + type: "npmScript", + dependsOn: ["^^transpile"], outputs: ["lib/**/*.d.ts"], }, isolatedTypes: { diff --git a/scripts/worker/transpile.js b/scripts/worker/transpile.js index 79e8d5458..6de256147 100644 --- a/scripts/worker/transpile.js +++ b/scripts/worker/transpile.js @@ -6,7 +6,6 @@ const swc = require("@swc/core"); const { findProjectRoot } = require("workspace-tools"); const root = findProjectRoot(process.cwd()) ?? process.cwd(); -const swcOptions = JSON.parse(fs.readFileSync(path.join(root, ".swcrc"), "utf8")); module.exports = async function transpile(data) { const { target } = data; @@ -33,8 +32,9 @@ module.exports = async function transpile(data) { .replace(".tsx", ".js") .replace(".ts", ".js"); + const swcOutput = await swc.transformFile(fullPath, { - ...swcOptions, + configFile: path.join(root, ".swcrc"), sourceFileName: path.relative(path.dirname(dest), fullPath).replace(/\\/g, "/"), }); @@ -45,6 +45,15 @@ module.exports = async function transpile(data) { if (swcOutput.map) { await fsPromises.writeFile(destMap, swcOutput.map); } + + // @ts-expect-error + if (swcOutput.output) { + // @ts-expect-error + const output = JSON.parse(swcOutput.output); + const decls = dest.replace(/\.js$/, ".d.ts"); + // @ts-ignore + await fsPromises.writeFile(decls, output.__swc_isolated_declarations__); + } } } } From 05b13d170960aa101b486cbfbc1ab936c420aa73 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Wed, 15 Jan 2025 23:23:58 +0000 Subject: [PATCH 26/36] type checking works! --- package.json | 2 +- packages/cache-github-actions/package.json | 3 ++- packages/cache/package.json | 3 ++- packages/cli/package.json | 5 +++-- packages/config/package.json | 7 ++++--- packages/e2e-tests/package.json | 5 +++-- packages/format-hrtime/package.json | 10 +++++++--- packages/hasher/package.json | 5 +++-- packages/logger/package.json | 10 +++++++--- packages/monorepo-fixture/package.json | 6 ++++-- packages/reporters/package.json | 8 +++++--- packages/rpc/package.json | 3 ++- packages/runners/package.json | 1 + packages/scheduler-types/package.json | 2 ++ packages/scheduler/package.json | 1 + packages/target-graph/package.json | 5 +++-- packages/tsconfig.lage2.json | 2 +- packages/worker-threads-pool/package.json | 1 + yarn.lock | 5 +++++ 19 files changed, 57 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index f7c787815..16f6497b0 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ }, "scripts": { "build": "lage transpile types build bundle", - "watch": "lage transpile isolatedTypes --no-cache --verbose --unstable-watch", + "watch": "lage transpile types --no-cache --verbose --unstable-watch", "change": "beachball change", "checkchange": "beachball check", "ci": "lage transpile types build test lint bundle", diff --git a/packages/cache-github-actions/package.json b/packages/cache-github-actions/package.json index aa0b3825f..933536def 100644 --- a/packages/cache-github-actions/package.json +++ b/packages/cache-github-actions/package.json @@ -13,7 +13,8 @@ "scripts": { "build": "monorepo-scripts tsc", "start": "monorepo-scripts tsc -w --preserveWatchOutput", - "lint": "monorepo-scripts lint" + "lint": "monorepo-scripts lint", + "types": "monorepo-scripts tsc" }, "dependencies": { "@actions/cache": "3.2.4", diff --git a/packages/cache/package.json b/packages/cache/package.json index 00f39d4f4..7f7d1af13 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -14,7 +14,8 @@ "build": "monorepo-scripts tsc", "start": "monorepo-scripts tsc -w --preserveWatchOutput", "test": "monorepo-scripts jest", - "lint": "monorepo-scripts lint" + "lint": "monorepo-scripts lint", + "types": "monorepo-scripts tsc" }, "dependencies": { "@azure/identity": "^4.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index a0e6ea377..f5363c138 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -15,8 +15,9 @@ "main": "lib/index.js", "types": "lib/index.d.ts", "scripts": { - "build": "tsc", - "start": "tsc -w --preserveWatchOutput", + "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", + "start": "monorepo-scripts tsc -w --preserveWatchOutput", "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" }, diff --git a/packages/config/package.json b/packages/config/package.json index a18527f17..74f1244ba 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -14,9 +14,10 @@ "main": "lib/index.js", "types": "lib/index.d.ts", "scripts": { - "build": "tsc", - "start": "tsc -w --preserveWatchOutput", - "test": "jest", + "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", + "start": "monorepo-scripts tsc -w --preserveWatchOutput", + "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" }, "dependencies": { diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json index 7b427d808..50c13c01c 100644 --- a/packages/e2e-tests/package.json +++ b/packages/e2e-tests/package.json @@ -13,8 +13,9 @@ "main": "lib/index.js", "types": "lib/index.d.ts", "scripts": { - "build": "tsc", - "start": "tsc -w --preserveWatchOutput", + "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", + "start": "monorepo-scripts tsc -w --preserveWatchOutput", "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" }, diff --git a/packages/format-hrtime/package.json b/packages/format-hrtime/package.json index 4f9df0c19..18bdac00e 100644 --- a/packages/format-hrtime/package.json +++ b/packages/format-hrtime/package.json @@ -9,11 +9,15 @@ "main": "lib/index.js", "types": "lib/index.d.ts", "scripts": { - "build": "tsc", - "start": "tsc -w --preserveWatchOutput", - "test": "jest", + "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", + "start": "monorepo-scripts tsc -w --preserveWatchOutput", + "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" }, + "devDependencies": { + "@lage-run/monorepo-scripts": "*" + }, "publishConfig": { "access": "public" }, diff --git a/packages/hasher/package.json b/packages/hasher/package.json index 73c759d07..4fdac13cd 100644 --- a/packages/hasher/package.json +++ b/packages/hasher/package.json @@ -9,8 +9,9 @@ "main": "lib/index.js", "types": "lib/index.d.ts", "scripts": { - "build": "tsc", - "start": "tsc -w --preserveWatchOutput", + "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", + "start": "monorepo-scripts tsc -w --preserveWatchOutput", "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" }, diff --git a/packages/logger/package.json b/packages/logger/package.json index e3c2944d8..ce06cd9d2 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -11,11 +11,15 @@ "main": "lib/index.js", "types": "lib/index.d.ts", "scripts": { - "build": "tsc", - "start": "tsc -w --preserveWatchOutput", - "test": "jest", + "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", + "start": "monorepo-scripts tsc -w --preserveWatchOutput", + "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" }, + "devDependencies": { + "@lage-run/monorepo-scripts": "*" + }, "publishConfig": { "access": "public" }, diff --git a/packages/monorepo-fixture/package.json b/packages/monorepo-fixture/package.json index 180ac3311..19f29e749 100644 --- a/packages/monorepo-fixture/package.json +++ b/packages/monorepo-fixture/package.json @@ -10,8 +10,10 @@ "main": "lib/index.js", "types": "lib/index.d.ts", "scripts": { - "build": "tsc", - "start": "tsc -w --preserveWatchOutput", + "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", + "start": "monorepo-scripts tsc -w --preserveWatchOutput", + "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" }, "devDependencies": { diff --git a/packages/reporters/package.json b/packages/reporters/package.json index b87d3d538..7d0c6acf7 100644 --- a/packages/reporters/package.json +++ b/packages/reporters/package.json @@ -11,9 +11,10 @@ "main": "lib/index.js", "types": "lib/index.d.ts", "scripts": { - "build": "tsc", - "start": "tsc -w --preserveWatchOutput", - "test": "jest", + "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", + "start": "monorepo-scripts tsc -w --preserveWatchOutput", + "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" }, "dependencies": { @@ -27,6 +28,7 @@ "gradient-string": "2.0.2" }, "devDependencies": { + "@lage-run/monorepo-scripts": "*", "memory-streams": "^0.1.3" }, "publishConfig": { diff --git a/packages/rpc/package.json b/packages/rpc/package.json index 63d89a6c3..2e30df7a2 100644 --- a/packages/rpc/package.json +++ b/packages/rpc/package.json @@ -13,7 +13,8 @@ "scripts": { "lint": "buf lint", "generate": "buf generate", - "build": "tsc" + "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc" }, "dependencies": { "@bufbuild/protobuf": "^1.10.0", diff --git a/packages/runners/package.json b/packages/runners/package.json index b2ac2be6d..5c7cdcff3 100644 --- a/packages/runners/package.json +++ b/packages/runners/package.json @@ -12,6 +12,7 @@ "types": "lib/index.d.ts", "scripts": { "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", "start": "monorepo-scripts tsc -w --preserveWatchOutput", "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" diff --git a/packages/scheduler-types/package.json b/packages/scheduler-types/package.json index ff150d64e..78f9d4d5a 100644 --- a/packages/scheduler-types/package.json +++ b/packages/scheduler-types/package.json @@ -12,7 +12,9 @@ "types": "lib/index.d.ts", "scripts": { "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", "start": "monorepo-scripts tsc -w --preserveWatchOutput", + "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" }, "dependencies": { diff --git a/packages/scheduler/package.json b/packages/scheduler/package.json index ed4a0a4b9..c6ae4aaeb 100644 --- a/packages/scheduler/package.json +++ b/packages/scheduler/package.json @@ -12,6 +12,7 @@ "types": "lib/index.d.ts", "scripts": { "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", "start": "monorepo-scripts tsc -w --preserveWatchOutput", "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" diff --git a/packages/target-graph/package.json b/packages/target-graph/package.json index 7d851eff8..eb12901a3 100644 --- a/packages/target-graph/package.json +++ b/packages/target-graph/package.json @@ -11,8 +11,9 @@ "main": "lib/index.js", "types": "lib/index.d.ts", "scripts": { - "build": "tsc", - "start": "tsc -w --preserveWatchOutput", + "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", + "start": "monorepo-scripts tsc -w --preserveWatchOutput", "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" }, diff --git a/packages/tsconfig.lage2.json b/packages/tsconfig.lage2.json index ce74812f7..7d5fd999a 100644 --- a/packages/tsconfig.lage2.json +++ b/packages/tsconfig.lage2.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ES2020", "module": "CommonJS", - "moduleResolution": "Node16", + "moduleResolution": "node", "declaration": true, "lib": ["ES2020"], "strict": true, diff --git a/packages/worker-threads-pool/package.json b/packages/worker-threads-pool/package.json index 02f2d8d0a..947b4f678 100644 --- a/packages/worker-threads-pool/package.json +++ b/packages/worker-threads-pool/package.json @@ -12,6 +12,7 @@ "types": "lib/index.d.ts", "scripts": { "build": "monorepo-scripts tsc", + "types": "monorepo-scripts tsc", "start": "monorepo-scripts tsc -w --preserveWatchOutput", "test": "monorepo-scripts jest", "lint": "monorepo-scripts lint" diff --git a/yarn.lock b/yarn.lock index b9973ea19..36fb37bd4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1766,6 +1766,8 @@ __metadata: "@lage-run/format-hrtime@npm:^0.1.6, @lage-run/format-hrtime@workspace:packages/format-hrtime": version: 0.0.0-use.local resolution: "@lage-run/format-hrtime@workspace:packages/format-hrtime" + dependencies: + "@lage-run/monorepo-scripts": "npm:*" languageName: unknown linkType: soft @@ -1821,6 +1823,8 @@ __metadata: "@lage-run/logger@npm:^1.3.1, @lage-run/logger@workspace:packages/logger": version: 0.0.0-use.local resolution: "@lage-run/logger@workspace:packages/logger" + dependencies: + "@lage-run/monorepo-scripts": "npm:*" languageName: unknown linkType: soft @@ -1857,6 +1861,7 @@ __metadata: dependencies: "@lage-run/format-hrtime": "npm:^0.1.6" "@lage-run/logger": "npm:^1.3.1" + "@lage-run/monorepo-scripts": "npm:*" "@lage-run/scheduler-types": "npm:^0.3.23" "@lage-run/target-graph": "npm:^0.11.1" "@ms-cloudpack/task-reporter": "npm:0.5.3" From dd71194f8b6164299a0c7748cbf012675e5e1913 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Fri, 17 Jan 2025 22:03:30 +0000 Subject: [PATCH 27/36] fixing for prettier --- packages/cli/src/cache/createCacheProvider.ts | 2 +- packages/cli/src/commands/parseServerOption.ts | 4 ++-- packages/cli/src/commands/run/filterArgsForTasks.ts | 4 ++-- packages/cli/src/getBinPaths.ts | 8 ++++---- packages/scheduler/src/WrappedTarget.ts | 4 ++-- packages/scheduler/src/cache/createCacheProvider.ts | 2 +- scripts/worker/transpile.js | 5 ++--- 7 files changed, 14 insertions(+), 15 deletions(-) diff --git a/packages/cli/src/cache/createCacheProvider.ts b/packages/cli/src/cache/createCacheProvider.ts index c865c89f3..ab956f57d 100644 --- a/packages/cli/src/cache/createCacheProvider.ts +++ b/packages/cli/src/cache/createCacheProvider.ts @@ -11,7 +11,7 @@ interface CreateCacheOptions { } export async function createCache(options: CreateCacheOptions): Promise<{ - hasher: TargetHasher; + hasher: TargetHasher; }> { const { cacheOptions, root, cliArgs, logger } = options; diff --git a/packages/cli/src/commands/parseServerOption.ts b/packages/cli/src/commands/parseServerOption.ts index 33fd838b4..275efe45d 100644 --- a/packages/cli/src/commands/parseServerOption.ts +++ b/packages/cli/src/commands/parseServerOption.ts @@ -1,6 +1,6 @@ export function parseServerOption(server: boolean | string | undefined): { - host: string; - port: number; + host: string; + port: number; } { const isBooleanAndTrue = typeof server === "boolean" && server; const isEmptyServer = typeof server === "undefined" || server === false; diff --git a/packages/cli/src/commands/run/filterArgsForTasks.ts b/packages/cli/src/commands/run/filterArgsForTasks.ts index bc0e8024d..578976a7d 100644 --- a/packages/cli/src/commands/run/filterArgsForTasks.ts +++ b/packages/cli/src/commands/run/filterArgsForTasks.ts @@ -1,6 +1,6 @@ export function filterArgsForTasks(args: string[]): { - tasks: string[]; - taskArgs: string[]; + tasks: string[]; + taskArgs: string[]; } { const optionsPosition = args.findIndex((arg) => arg.startsWith("-")); return { diff --git a/packages/cli/src/getBinPaths.ts b/packages/cli/src/getBinPaths.ts index 19d225d70..100034d09 100644 --- a/packages/cli/src/getBinPaths.ts +++ b/packages/cli/src/getBinPaths.ts @@ -15,8 +15,8 @@ function findUp(name: string, dir: string) { } export function getBinPaths(): { - lage: string; - "lage-server": string; + lage: string; + "lage-server": string; } { const bins = os.platform() === "win32" ? ["lage.cmd", "lage-server.cmd"] : ["lage", "lage-server"]; const binPaths = bins.map((bin) => findUp("node_modules/.bin/" + bin, __dirname)); @@ -29,8 +29,8 @@ export function getBinPaths(): { } export function getBinScripts(): { - lage: string; - "lage-server": string; + lage: string; + "lage-server": string; } { const thisPackageJsonPath = findUp("package.json", __dirname); diff --git a/packages/scheduler/src/WrappedTarget.ts b/packages/scheduler/src/WrappedTarget.ts index 5de57afc5..45478b53f 100644 --- a/packages/scheduler/src/WrappedTarget.ts +++ b/packages/scheduler/src/WrappedTarget.ts @@ -289,8 +289,8 @@ export class WrappedTarget implements TargetRun { * @returns */ toJSON(): { - target: string; - status: TargetStatus; + target: string; + status: TargetStatus; } { return { target: this.target.id, diff --git a/packages/scheduler/src/cache/createCacheProvider.ts b/packages/scheduler/src/cache/createCacheProvider.ts index 7af7d78bb..3b653598b 100644 --- a/packages/scheduler/src/cache/createCacheProvider.ts +++ b/packages/scheduler/src/cache/createCacheProvider.ts @@ -12,7 +12,7 @@ interface CreateCacheOptions { } export async function createCache(options: CreateCacheOptions): Promise<{ - cacheProvider: RemoteFallbackCacheProvider; + cacheProvider: RemoteFallbackCacheProvider; }> { const { cacheOptions, logger, root, skipLocalCache } = options; diff --git a/scripts/worker/transpile.js b/scripts/worker/transpile.js index 6de256147..d6090850d 100644 --- a/scripts/worker/transpile.js +++ b/scripts/worker/transpile.js @@ -32,7 +32,6 @@ module.exports = async function transpile(data) { .replace(".tsx", ".js") .replace(".ts", ".js"); - const swcOutput = await swc.transformFile(fullPath, { configFile: path.join(root, ".swcrc"), sourceFileName: path.relative(path.dirname(dest), fullPath).replace(/\\/g, "/"), @@ -46,9 +45,9 @@ module.exports = async function transpile(data) { await fsPromises.writeFile(destMap, swcOutput.map); } - // @ts-expect-error + // @ts-expect-error if (swcOutput.output) { - // @ts-expect-error + // @ts-expect-error const output = JSON.parse(swcOutput.output); const decls = dest.replace(/\.js$/, ".d.ts"); // @ts-ignore From 8bacfd5cc8a458e11eba5d6ba266c27b29e668a2 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Sat, 18 Jan 2025 00:11:02 +0000 Subject: [PATCH 28/36] Change files --- ...e-4d116d1c-68e7-4744-ac24-707e35ddd69f.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 change/change-4d116d1c-68e7-4744-ac24-707e35ddd69f.json diff --git a/change/change-4d116d1c-68e7-4744-ac24-707e35ddd69f.json b/change/change-4d116d1c-68e7-4744-ac24-707e35ddd69f.json new file mode 100644 index 000000000..fc386eff2 --- /dev/null +++ b/change/change-4d116d1c-68e7-4744-ac24-707e35ddd69f.json @@ -0,0 +1,18 @@ +{ + "changes": [ + { + "type": "patch", + "comment": "isolated declarations", + "packageName": "@lage-run/cache-github-actions", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + }, + { + "type": "patch", + "comment": "isolated declarations", + "packageName": "@lage-run/scheduler-types", + "email": "kchau@microsoft.com", + "dependentChangeType": "patch" + } + ] +} \ No newline at end of file From 83accdedde1bb01d63fd8a85b96e18e97043b3a2 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Thu, 30 Jan 2025 17:05:44 +0000 Subject: [PATCH 29/36] fixed a couple of goobers from ts-fix --- packages/monorepo-fixture/src/monorepo.ts | 2 +- packages/worker-threads-pool/src/ThreadWorker.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/monorepo-fixture/src/monorepo.ts b/packages/monorepo-fixture/src/monorepo.ts index 1fe9126f3..0fd1ef79d 100644 --- a/packages/monorepo-fixture/src/monorepo.ts +++ b/packages/monorepo-fixture/src/monorepo.ts @@ -187,7 +187,7 @@ export class Monorepo { } } - async readFiles(files: string[]): Promise<{}> { + async readFiles(files: string[]): Promise> { const contents = {}; for (const file of files) { const fullPath = path.isAbsolute(file) ? file : path.join(this.root, file); diff --git a/packages/worker-threads-pool/src/ThreadWorker.ts b/packages/worker-threads-pool/src/ThreadWorker.ts index aab41b70e..fc59c2b37 100644 --- a/packages/worker-threads-pool/src/ThreadWorker.ts +++ b/packages/worker-threads-pool/src/ThreadWorker.ts @@ -9,7 +9,7 @@ import crypto from "crypto"; import v8 from "v8"; import type { IWorker } from "./types/WorkerQueue.js"; import type { QueueItem } from "./types/WorkerQueue.js"; -import type { WorkerOptions as ThreadWorkerOptions } from "worker_threads"; +import type { ResourceLimits, WorkerOptions as ThreadWorkerOptions } from "worker_threads"; export interface WorkerOptions { workerOptions?: ThreadWorkerOptions; @@ -247,7 +247,7 @@ export class ThreadWorker extends EventEmitter implements IWorker { return this.#stderrInfo.stream; } - get resourceLimits(): import("worker_threads").ResourceLimits | undefined { + get resourceLimits(): ResourceLimits | undefined { return this.#worker.resourceLimits; } From bd0dae183be54a4ed9534e3a8930d3afd91c7b57 Mon Sep 17 00:00:00 2001 From: Ken Chau Date: Thu, 6 Feb 2025 00:23:37 +0000 Subject: [PATCH 30/36] fixing up isolated declaration errors --- packages/cli/src/commands/addOptions.ts | 2 +- packages/cli/src/commands/options.ts | 18 +++++++++++++++--- .../src/pickTaskFromQueue.ts | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/commands/addOptions.ts b/packages/cli/src/commands/addOptions.ts index 955062482..b55528c1a 100644 --- a/packages/cli/src/commands/addOptions.ts +++ b/packages/cli/src/commands/addOptions.ts @@ -1,7 +1,7 @@ import type { Command, Option } from "commander"; import { options } from "./options.js"; -export function addOptions(category: keyof typeof options, command: Command) { +export function addOptions(category: keyof typeof options, command: Command): Command { for (const option of Object.values