trigger.dev 3.0.0-beta.24 → 3.0.0-beta.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -19,6 +19,8 @@ COPY --chown=node:node . .
19
19
  USER node
20
20
  RUN npm ci --no-fund --no-audit && npm cache clean --force
21
21
 
22
+ __POST_INSTALL__
23
+
22
24
  # Development or production stage builds upon the base stage
23
25
  FROM base AS final
24
26
 
package/dist/index.js CHANGED
@@ -799,7 +799,7 @@ import invariant from "tiny-invariant";
799
799
  import { z as z4 } from "zod";
800
800
 
801
801
  // package.json
802
- var version = "3.0.0-beta.24";
802
+ var version = "3.0.0-beta.26";
803
803
  var dependencies = {
804
804
  "@anatine/esbuild-decorators": "^0.2.19",
805
805
  "@clack/prompts": "^0.7.0",
@@ -816,7 +816,7 @@ var dependencies = {
816
816
  "@opentelemetry/sdk-trace-base": "^1.22.0",
817
817
  "@opentelemetry/sdk-trace-node": "^1.22.0",
818
818
  "@opentelemetry/semantic-conventions": "^1.22.0",
819
- "@trigger.dev/core": "workspace:3.0.0-beta.24",
819
+ "@trigger.dev/core": "workspace:3.0.0-beta.26",
820
820
  "@types/degit": "^2.8.3",
821
821
  chalk: "^5.2.0",
822
822
  chokidar: "^3.5.3",
@@ -2864,6 +2864,32 @@ import { Glob } from "glob";
2864
2864
  import { readFileSync } from "node:fs";
2865
2865
  import { extname, isAbsolute } from "node:path";
2866
2866
  import tsConfigPaths from "tsconfig-paths";
2867
+ function mockServerOnlyPlugin() {
2868
+ return {
2869
+ name: "trigger-mock-server-only",
2870
+ setup(build3) {
2871
+ build3.onResolve({ filter: /server-only/ }, (args) => {
2872
+ if (args.path !== "server-only") {
2873
+ return void 0;
2874
+ }
2875
+ logger.debug(`[trigger-mock-server-only] Bundling ${args.path}`, {
2876
+ ...args
2877
+ });
2878
+ return {
2879
+ path: args.path,
2880
+ external: false,
2881
+ namespace: "server-only-mock"
2882
+ };
2883
+ });
2884
+ build3.onLoad({ filter: /server-only/, namespace: "server-only-mock" }, (args) => {
2885
+ return {
2886
+ contents: `export default true;`,
2887
+ loader: "js"
2888
+ };
2889
+ });
2890
+ }
2891
+ };
2892
+ }
2867
2893
  function bundleTriggerDevCore(buildIdentifier, tsconfigPath) {
2868
2894
  return {
2869
2895
  name: "trigger-bundle-core",
@@ -3254,47 +3280,7 @@ function assertExhaustive(x) {
3254
3280
  }
3255
3281
 
3256
3282
  // src/utilities/javascriptProject.ts
3257
- var BuiltInModules = /* @__PURE__ */ new Set([
3258
- "assert",
3259
- "async_hooks",
3260
- "buffer",
3261
- "child_process",
3262
- "cluster",
3263
- "console",
3264
- "constants",
3265
- "crypto",
3266
- "dgram",
3267
- "dns",
3268
- "domain",
3269
- "events",
3270
- "fs",
3271
- "http",
3272
- "http2",
3273
- "https",
3274
- "inspector",
3275
- "module",
3276
- "net",
3277
- "os",
3278
- "path",
3279
- "perf_hooks",
3280
- "process",
3281
- "punycode",
3282
- "querystring",
3283
- "readline",
3284
- "repl",
3285
- "stream",
3286
- "string_decoder",
3287
- "timers",
3288
- "tls",
3289
- "trace_events",
3290
- "tty",
3291
- "url",
3292
- "util",
3293
- "v8",
3294
- "vm",
3295
- "worker_threads",
3296
- "zlib"
3297
- ]);
3283
+ import { builtinModules } from "node:module";
3298
3284
  var JavascriptProject = class {
3299
3285
  constructor(projectPath) {
3300
3286
  this.projectPath = projectPath;
@@ -3324,29 +3310,76 @@ var JavascriptProject = class {
3324
3310
  });
3325
3311
  }
3326
3312
  }
3313
+ async resolveAll(packageNames, options) {
3314
+ const externalPackages = packageNames.filter((packageName) => !isBuiltInModule(packageName));
3315
+ const opts = { allowDev: false, ...options };
3316
+ const command = await this.#getCommand();
3317
+ try {
3318
+ const versions = await command.resolveDependencyVersions(externalPackages, {
3319
+ cwd: this.projectPath
3320
+ });
3321
+ if (versions) {
3322
+ logger.debug(`Resolved [${externalPackages.join(", ")}] version using ${command.name}`, {
3323
+ versions
3324
+ });
3325
+ }
3326
+ const missingPackages = externalPackages.filter((packageName) => !versions[packageName]);
3327
+ const missingPackageVersions = {};
3328
+ for (const packageName of missingPackages) {
3329
+ const packageJsonVersion = this.packageJson.dependencies?.[packageName];
3330
+ if (typeof packageJsonVersion === "string") {
3331
+ logger.debug(`Resolved ${packageName} version using package.json`, {
3332
+ packageJsonVersion
3333
+ });
3334
+ missingPackageVersions[packageName] = packageJsonVersion;
3335
+ }
3336
+ if (opts.allowDev) {
3337
+ const devPackageJsonVersion = this.packageJson.devDependencies?.[packageName];
3338
+ if (typeof devPackageJsonVersion === "string") {
3339
+ logger.debug(`Resolved ${packageName} version using devDependencies`, {
3340
+ devPackageJsonVersion
3341
+ });
3342
+ missingPackageVersions[packageName] = devPackageJsonVersion;
3343
+ }
3344
+ }
3345
+ }
3346
+ return { ...versions, ...missingPackageVersions };
3347
+ } catch (error) {
3348
+ logger.debug(`Failed to resolve dependency versions using ${command.name}`, {
3349
+ packageNames,
3350
+ error
3351
+ });
3352
+ return {};
3353
+ }
3354
+ }
3327
3355
  async resolve(packageName, options) {
3328
- if (BuiltInModules.has(packageName)) {
3356
+ if (isBuiltInModule(packageName)) {
3329
3357
  return void 0;
3330
3358
  }
3331
3359
  const opts = { allowDev: false, ...options };
3332
- const packageJsonVersion = this.packageJson.dependencies?.[packageName];
3333
- if (typeof packageJsonVersion === "string") {
3334
- return packageJsonVersion;
3335
- }
3336
- if (opts.allowDev) {
3337
- const devPackageJsonVersion = this.packageJson.devDependencies?.[packageName];
3338
- if (typeof devPackageJsonVersion === "string") {
3339
- return devPackageJsonVersion;
3340
- }
3341
- }
3342
3360
  const command = await this.#getCommand();
3343
3361
  try {
3344
3362
  const version2 = await command.resolveDependencyVersion(packageName, {
3345
3363
  cwd: this.projectPath
3346
3364
  });
3347
3365
  if (version2) {
3366
+ logger.debug(`Resolved ${packageName} version using ${command.name}`, { version: version2 });
3348
3367
  return version2;
3349
3368
  }
3369
+ const packageJsonVersion = this.packageJson.dependencies?.[packageName];
3370
+ if (typeof packageJsonVersion === "string") {
3371
+ logger.debug(`Resolved ${packageName} version using package.json`, { packageJsonVersion });
3372
+ return packageJsonVersion;
3373
+ }
3374
+ if (opts.allowDev) {
3375
+ const devPackageJsonVersion = this.packageJson.devDependencies?.[packageName];
3376
+ if (typeof devPackageJsonVersion === "string") {
3377
+ logger.debug(`Resolved ${packageName} version using devDependencies`, {
3378
+ devPackageJsonVersion
3379
+ });
3380
+ return devPackageJsonVersion;
3381
+ }
3382
+ }
3350
3383
  } catch (error) {
3351
3384
  logger.debug(`Failed to resolve dependency version using ${command.name}`, {
3352
3385
  packageName,
@@ -3388,7 +3421,7 @@ var PNPMCommands = class {
3388
3421
  async resolveDependencyVersion(packageName, options) {
3389
3422
  const { stdout } = await $({ cwd: options.cwd })`${this.cmd} list ${packageName} -r --json`;
3390
3423
  const result = JSON.parse(stdout);
3391
- logger.debug(`Resolving ${packageName} version using ${this.name}`, { result });
3424
+ logger.debug(`Resolving ${packageName} version using ${this.name}`);
3392
3425
  for (const dep of result) {
3393
3426
  const dependency = dep.dependencies?.[packageName];
3394
3427
  if (dependency) {
@@ -3396,6 +3429,21 @@ var PNPMCommands = class {
3396
3429
  }
3397
3430
  }
3398
3431
  }
3432
+ async resolveDependencyVersions(packageNames, options) {
3433
+ const { stdout } = await $({ cwd: options.cwd })`${this.cmd} list ${packageNames} -r --json`;
3434
+ const result = JSON.parse(stdout);
3435
+ logger.debug(`Resolving ${packageNames.join(" ")} version using ${this.name}`);
3436
+ const results = {};
3437
+ for (const dep of result) {
3438
+ for (const packageName of packageNames) {
3439
+ const dependency = dep.dependencies?.[packageName];
3440
+ if (dependency) {
3441
+ results[packageName] = dependency.version;
3442
+ }
3443
+ }
3444
+ }
3445
+ return results;
3446
+ }
3399
3447
  };
3400
3448
  var NPMCommands = class {
3401
3449
  get name() {
@@ -3414,6 +3462,19 @@ var NPMCommands = class {
3414
3462
  logger.debug(`Resolving ${packageName} version using ${this.name}`, { output });
3415
3463
  return this.#recursivelySearchDependencies(output.dependencies, packageName);
3416
3464
  }
3465
+ async resolveDependencyVersions(packageNames, options) {
3466
+ const { stdout } = await $({ cwd: options.cwd })`${this.cmd} list ${packageNames} --json`;
3467
+ const output = JSON.parse(stdout);
3468
+ logger.debug(`Resolving ${packageNames.join(" ")} version using ${this.name}`, { output });
3469
+ const results = {};
3470
+ for (const packageName of packageNames) {
3471
+ const version2 = this.#recursivelySearchDependencies(output.dependencies, packageName);
3472
+ if (version2) {
3473
+ results[packageName] = version2;
3474
+ }
3475
+ }
3476
+ return results;
3477
+ }
3417
3478
  #recursivelySearchDependencies(dependencies2, packageName) {
3418
3479
  for (const [name, dependency] of Object.entries(dependencies2)) {
3419
3480
  if (name === packageName) {
@@ -3442,7 +3503,7 @@ var YarnCommands = class {
3442
3503
  async resolveDependencyVersion(packageName, options) {
3443
3504
  const { stdout } = await $({ cwd: options.cwd })`${this.cmd} info ${packageName} --json`;
3444
3505
  const lines = stdout.split("\n");
3445
- logger.debug(`Resolving ${packageName} version using ${this.name}`, { lines });
3506
+ logger.debug(`Resolving ${packageName} version using ${this.name}`);
3446
3507
  for (const line of lines) {
3447
3508
  const json = JSON.parse(line);
3448
3509
  if (json.value === packageName) {
@@ -3450,7 +3511,38 @@ var YarnCommands = class {
3450
3511
  }
3451
3512
  }
3452
3513
  }
3514
+ async resolveDependencyVersions(packageNames, options) {
3515
+ const { stdout } = await $({ cwd: options.cwd })`${this.cmd} info ${packageNames} --json`;
3516
+ const lines = stdout.split("\n");
3517
+ logger.debug(`Resolving ${packageNames.join(" ")} version using ${this.name}`);
3518
+ const results = {};
3519
+ for (const line of lines) {
3520
+ const json = JSON.parse(line);
3521
+ const packageName = this.#parseYarnValueIntoPackageName(json.value);
3522
+ if (packageNames.includes(packageName)) {
3523
+ results[packageName] = json.children.Version;
3524
+ }
3525
+ }
3526
+ return results;
3527
+ }
3528
+ // The "value" when doing yarn info is formatted like this:
3529
+ // "package-name@npm:version" or "package-name@workspace:version"
3530
+ // This function will parse the value into just the package name.
3531
+ // This correctly handles scoped packages as well e.g. @scope/package-name@npm:version
3532
+ #parseYarnValueIntoPackageName(value) {
3533
+ const parts = value.split("@");
3534
+ if (parts.length === 3) {
3535
+ return parts[1];
3536
+ }
3537
+ return parts[0];
3538
+ }
3453
3539
  };
3540
+ function isBuiltInModule(module) {
3541
+ if (module.startsWith("node:")) {
3542
+ return true;
3543
+ }
3544
+ return builtinModules.includes(module);
3545
+ }
3454
3546
 
3455
3547
  // src/utilities/resolveInternalFilePath.ts
3456
3548
  import path5 from "path";
@@ -4451,6 +4543,7 @@ async function compileProject(config, options, configPath) {
4451
4543
  __PROJECT_CONFIG__: JSON.stringify(config)
4452
4544
  },
4453
4545
  plugins: [
4546
+ mockServerOnlyPlugin(),
4454
4547
  bundleDependenciesPlugin(
4455
4548
  "workerFacade",
4456
4549
  config.dependenciesToBundle,
@@ -4556,6 +4649,7 @@ async function compileProject(config, options, configPath) {
4556
4649
  const allImports = [...metaOutput.imports, ...entryPointMetaOutput.imports];
4557
4650
  const javascriptProject = new JavascriptProject(config.projectDir);
4558
4651
  const dependencies2 = await gatherRequiredDependencies(allImports, config, javascriptProject);
4652
+ logger.debug("gatherRequiredDependencies()", { dependencies: dependencies2 });
4559
4653
  const packageJsonContents = {
4560
4654
  name: "trigger-worker",
4561
4655
  version: "0.0.0",
@@ -4592,7 +4686,16 @@ If this is unexpected you should check your ${terminalLink2(
4592
4686
  throw new SkipLoggingError("Failed to resolve dependencies");
4593
4687
  }
4594
4688
  const containerFilePath = join6(cliRootPath(), "Containerfile.prod");
4595
- await copyFile(containerFilePath, join6(tempDir, "Containerfile"));
4689
+ let containerFileContents = readFileSync2(containerFilePath, "utf-8");
4690
+ if (config.postInstall) {
4691
+ containerFileContents = containerFileContents.replace(
4692
+ "__POST_INSTALL__",
4693
+ `RUN ${config.postInstall}`
4694
+ );
4695
+ } else {
4696
+ containerFileContents = containerFileContents.replace("__POST_INSTALL__", "");
4697
+ }
4698
+ await writeFile2(join6(tempDir, "Containerfile"), containerFileContents);
4596
4699
  const contentHasher = createHash("sha256");
4597
4700
  contentHasher.update(Buffer.from(entryPointOutputFile.text));
4598
4701
  contentHasher.update(Buffer.from(workerOutputFile.text));
@@ -4733,24 +4836,30 @@ async function typecheckProject(config, options) {
4733
4836
  }
4734
4837
  async function gatherRequiredDependencies(imports, config, project) {
4735
4838
  const dependencies2 = {};
4839
+ const resolvablePackageNames = /* @__PURE__ */ new Set();
4736
4840
  for (const file of imports) {
4737
4841
  if (file.kind !== "require-call" && file.kind !== "dynamic-import" || !file.external) {
4738
4842
  continue;
4739
4843
  }
4740
4844
  const packageName = detectPackageNameFromImportPath(file.path);
4741
- if (dependencies2[packageName]) {
4742
- continue;
4743
- }
4744
- const externalDependencyVersion = await project.resolve(packageName);
4745
- if (externalDependencyVersion) {
4746
- dependencies2[packageName] = stripWorkspaceFromVersion(externalDependencyVersion);
4845
+ if (!packageName) {
4747
4846
  continue;
4748
4847
  }
4749
- const internalDependencyVersion = dependencies[packageName] ?? detectDependencyVersion(packageName);
4848
+ resolvablePackageNames.add(packageName);
4849
+ }
4850
+ const resolvedPackageVersions = await project.resolveAll(Array.from(resolvablePackageNames));
4851
+ const missingPackages = Array.from(resolvablePackageNames).filter(
4852
+ (packageName) => !resolvedPackageVersions[packageName]
4853
+ );
4854
+ for (const missingPackage of missingPackages) {
4855
+ const internalDependencyVersion = dependencies[missingPackage] ?? detectDependencyVersion(missingPackage);
4750
4856
  if (internalDependencyVersion) {
4751
- dependencies2[packageName] = stripWorkspaceFromVersion(internalDependencyVersion);
4857
+ dependencies2[missingPackage] = stripWorkspaceFromVersion(internalDependencyVersion);
4752
4858
  }
4753
4859
  }
4860
+ for (const [packageName, version2] of Object.entries(resolvedPackageVersions)) {
4861
+ dependencies2[packageName] = version2;
4862
+ }
4754
4863
  if (config.additionalPackages) {
4755
4864
  for (const packageName of config.additionalPackages) {
4756
4865
  if (dependencies2[packageName]) {
@@ -5802,6 +5911,7 @@ function useDev({
5802
5911
  __PROJECT_CONFIG__: JSON.stringify(config)
5803
5912
  },
5804
5913
  plugins: [
5914
+ mockServerOnlyPlugin(),
5805
5915
  bundleTriggerDevCore("workerFacade", config.tsconfigPath),
5806
5916
  bundleDependenciesPlugin(
5807
5917
  "workerFacade",