Skip to content

Deploy refactor resolve step #1234

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/purple-bikes-own.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"trigger.dev": patch
---

Use only one call to dependencies listing commands in order to build the bundle's package.json file.
7 changes: 5 additions & 2 deletions packages/cli-v3/e2e/compile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { esbuildDecorators } from "@anatine/esbuild-decorators";
import { build } from "esbuild";
import { readFileSync } from "node:fs";
import { writeFile } from "node:fs/promises";
import { basename, join, posix, relative, resolve, sep } from "node:path";
import { join, posix, relative, resolve, sep } from "node:path";
import invariant from "tiny-invariant";

import {
Expand Down Expand Up @@ -68,6 +68,8 @@ export async function compile(options: CompileOptions) {
const e2eJsProject = new E2EJavascriptProject(config.projectDir, packageManager);
const directDependenciesMeta = await e2eJsProject.extractDirectDependenciesMeta();

logger.debug("Direct dependencies metadata", directDependenciesMeta);

const result = await build({
stdin: {
contents: workerContents,
Expand Down Expand Up @@ -214,9 +216,10 @@ export async function compile(options: CompileOptions) {
await writeFile(join(tempDir, "index.js"), entryPointOutputFile.text);

return {
entryPointMetaOutput,
workerMetaOutput: metaOutput,
directDependenciesMeta,
workerOutputFile,
entryPointMetaOutput,
entryPointOutputFile,
};
}
11 changes: 9 additions & 2 deletions packages/cli-v3/e2e/handleDependencies.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#!/usr/bin/env node

import { log } from "@clack/prompts";
import { Metafile } from "esbuild";
import { join } from "node:path";

import { SkipLoggingError } from "../src/cli/common.js";
Expand All @@ -16,10 +15,13 @@ import { PackageManager } from "../src/utilities/getUserPackageManager.js";
import { logger } from "../src/utilities/logger.js";
import { cliLink } from "../src/utilities/cliOutput.js";
import { E2EJavascriptProject } from "./javascriptProject.js";
import { DependencyMeta } from "../src/utilities/javascriptProject.js";
import { Metafile } from "esbuild";

type HandleDependenciesOptions = {
entryPointMetaOutput: Metafile["outputs"]["out/stdin.js"];
metaOutput: Metafile["outputs"]["out/stdin.js"];
directDependenciesMeta: Record<string, DependencyMeta>;
packageManager: PackageManager;
resolvedConfig: ReadConfigResult;
tempDir: string;
Expand All @@ -32,6 +34,7 @@ export async function handleDependencies(options: HandleDependenciesOptions) {
const {
entryPointMetaOutput,
metaOutput,
directDependenciesMeta,
packageManager,
resolvedConfig: { config },
tempDir,
Expand All @@ -47,7 +50,11 @@ export async function handleDependencies(options: HandleDependenciesOptions) {

const javascriptProject = new E2EJavascriptProject(config.projectDir, packageManager);

const dependencies = await resolveRequiredDependencies(allImports, config, javascriptProject);
const dependencies = await resolveRequiredDependencies(
directDependenciesMeta,
allImports,
config
);

logger.debug("gatherRequiredDependencies()", { dependencies });

Expand Down
4 changes: 4 additions & 0 deletions packages/cli-v3/e2e/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { E2EOptions, E2EOptionsSchema } from "./schemas";
import { fixturesConfig, TestCase } from "./fixtures.config";
import { Metafile, OutputFile } from "esbuild";
import { findUpMultiple } from "find-up";
import { DependencyMeta } from "../src/utilities/javascriptProject";

interface E2EFixtureTest extends TestCase {
fixtureDir: string;
Expand Down Expand Up @@ -164,6 +165,7 @@ if (testCases.length > 0) {
}

let entryPointMetaOutput: Metafile["outputs"]["out/stdin.js"];
let directDependenciesMeta: Record<string, DependencyMeta>;
let entryPointOutputFile: OutputFile;
let workerMetaOutput: Metafile["outputs"]["out/stdin.js"];
let workerOutputFile: OutputFile;
Expand All @@ -176,6 +178,7 @@ if (testCases.length > 0) {
tempDir,
});
entryPointMetaOutput = compilationResult.entryPointMetaOutput;
directDependenciesMeta = compilationResult.directDependenciesMeta;
entryPointOutputFile = compilationResult.entryPointOutputFile;
workerMetaOutput = compilationResult.workerMetaOutput;
workerOutputFile = compilationResult.workerOutputFile;
Expand Down Expand Up @@ -203,6 +206,7 @@ if (testCases.length > 0) {
dependencies = await handleDependencies({
entryPointMetaOutput: entryPointMetaOutput!,
metaOutput: workerMetaOutput!,
directDependenciesMeta: directDependenciesMeta!,
resolvedConfig: resolvedConfig!,
tempDir,
packageManager,
Expand Down
79 changes: 42 additions & 37 deletions packages/cli-v3/src/commands/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ import {
} from "@trigger.dev/core/v3";
import { recordSpanException } from "@trigger.dev/core/v3/workers";
import { Command, Option as CommandOption } from "commander";
import { Metafile, build } from "esbuild";
import { build, Metafile } from "esbuild";
import { execa } from "execa";
import { createHash } from "node:crypto";
import { readFileSync } from "node:fs";
import { copyFile, mkdir, readFile, writeFile } from "node:fs/promises";
import { dirname, join, posix, relative, resolve } from "node:path";
import { dirname, join, posix, relative } from "node:path";
import { setTimeout } from "node:timers/promises";
import invariant from "tiny-invariant";
import { z } from "zod";
Expand Down Expand Up @@ -56,7 +56,7 @@ import {
parseBuildErrorStack,
parseNpmInstallError,
} from "../utilities/deployErrors";
import { JavascriptProject } from "../utilities/javascriptProject";
import { DependencyMeta, JavascriptProject } from "../utilities/javascriptProject";
import { docs, getInTouch } from "../utilities/links";
import { cliRootPath } from "../utilities/resolveInternalFilePath";
import { safeJsonParse } from "../utilities/safeJsonParse";
Expand Down Expand Up @@ -1170,6 +1170,11 @@ async function compileProject(
);
}

const javascriptProject = new JavascriptProject(config.projectDir);
const directDependenciesMeta = await javascriptProject.extractDirectDependenciesMeta();

logger.debug("Direct dependencies metadata", directDependenciesMeta);

const result = await build({
stdin: {
contents: workerContents,
Expand Down Expand Up @@ -1335,9 +1340,11 @@ async function compileProject(
// Get all the required dependencies from the metaOutputs and save them to /tmp/dir/package.json
const allImports = [...metaOutput.imports, ...entryPointMetaOutput.imports];

const javascriptProject = new JavascriptProject(config.projectDir);

const dependencies = await resolveRequiredDependencies(allImports, config, javascriptProject);
const dependencies = await resolveRequiredDependencies(
directDependenciesMeta,
allImports,
config
);

logger.debug("gatherRequiredDependencies()", { dependencies });

Expand Down Expand Up @@ -1707,12 +1714,13 @@ export async function typecheckProject(config: ResolvedConfig) {
// Returns the dependencies that are required by the output that are found in output and the CLI package dependencies
// Returns the dependency names and the version to use (taken from the CLI deps package.json)
export async function resolveRequiredDependencies(
directDependenciesMeta: Record<string, DependencyMeta>,
imports: Metafile["outputs"][string]["imports"],
config: ResolvedConfig,
project: JavascriptProject
config: ResolvedConfig
) {
return await tracer.startActiveSpan("resolveRequiredDependencies", async (span) => {
const resolvablePackageNames = new Set<string>();
const dependencies: Record<string, string> = {};
const missingPackages: string[] = [];

for (const file of imports) {
if ((file.kind !== "require-call" && file.kind !== "dynamic-import") || !file.external) {
Expand All @@ -1725,37 +1733,36 @@ export async function resolveRequiredDependencies(
continue;
}

resolvablePackageNames.add(packageName);
}

span.setAttribute("resolvablePackageNames", Array.from(resolvablePackageNames));

const resolvedPackageVersions = await project.resolveAll(Array.from(resolvablePackageNames));
const missingPackages = Array.from(resolvablePackageNames).filter(
(packageName) => !resolvedPackageVersions[packageName]
);
if (!directDependenciesMeta[packageName]) {
continue;
}

span.setAttributes({
...flattenAttributes(resolvedPackageVersions, "resolvedPackageVersions"),
});
span.setAttribute("missingPackages", missingPackages);
if (!directDependenciesMeta[packageName].external) {
continue;
}

const dependencies: Record<string, string> = {};
if (!directDependenciesMeta[packageName].version) {
missingPackages.push(packageName);
const internalDependencyVersion =
(packageJson.dependencies as Record<string, string>)[packageName] ??
detectDependencyVersion(packageName);

for (const missingPackage of missingPackages) {
const internalDependencyVersion =
(packageJson.dependencies as Record<string, string>)[missingPackage] ??
detectDependencyVersion(missingPackage);
if (internalDependencyVersion) {
dependencies[packageName] = stripWorkspaceFromVersion(internalDependencyVersion);
}

if (internalDependencyVersion) {
dependencies[missingPackage] = stripWorkspaceFromVersion(internalDependencyVersion);
continue;
}
}

for (const [packageName, version] of Object.entries(resolvedPackageVersions)) {
dependencies[packageName] = version;
dependencies[packageName] = directDependenciesMeta[packageName].version;
}

span.setAttribute("resolvablePackageNames", Object.keys(dependencies));
span.setAttributes({
...flattenAttributes(dependencies, "resolvedPackageVersions"),
});
span.setAttribute("missingPackages", missingPackages);

if (config.additionalPackages) {
span.setAttribute("additionalPackages", config.additionalPackages);

Expand All @@ -1770,12 +1777,10 @@ export async function resolveRequiredDependencies(
dependencies[packageParts.name] = packageParts.version;
continue;
} else {
const externalDependencyVersion = await project.resolve(packageParts.name, {
allowDev: true,
});
const dependencyVersion = dependencies[packageParts.name];

if (externalDependencyVersion) {
dependencies[packageParts.name] = externalDependencyVersion;
if (dependencyVersion) {
dependencies[packageParts.name] = dependencyVersion;
continue;
} else {
logger.log(
Expand Down
Loading
Loading