@trigger.dev/build 0.0.0-chat-prerelease-20260401205942
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/commonjs/extensions/audioWaveform.d.ts +6 -0
- package/dist/commonjs/extensions/audioWaveform.js +45 -0
- package/dist/commonjs/extensions/audioWaveform.js.map +1 -0
- package/dist/commonjs/extensions/core/additionalFiles.d.ts +5 -0
- package/dist/commonjs/extensions/core/additionalFiles.js +13 -0
- package/dist/commonjs/extensions/core/additionalFiles.js.map +1 -0
- package/dist/commonjs/extensions/core/additionalPackages.d.ts +15 -0
- package/dist/commonjs/extensions/core/additionalPackages.js +77 -0
- package/dist/commonjs/extensions/core/additionalPackages.js.map +1 -0
- package/dist/commonjs/extensions/core/aptGet.d.ts +5 -0
- package/dist/commonjs/extensions/core/aptGet.js +23 -0
- package/dist/commonjs/extensions/core/aptGet.js.map +1 -0
- package/dist/commonjs/extensions/core/ffmpeg.d.ts +22 -0
- package/dist/commonjs/extensions/core/ffmpeg.js +68 -0
- package/dist/commonjs/extensions/core/ffmpeg.js.map +1 -0
- package/dist/commonjs/extensions/core/neonSyncEnvVars.d.ts +14 -0
- package/dist/commonjs/extensions/core/neonSyncEnvVars.js +202 -0
- package/dist/commonjs/extensions/core/neonSyncEnvVars.js.map +1 -0
- package/dist/commonjs/extensions/core/syncEnvVars.d.ts +18 -0
- package/dist/commonjs/extensions/core/syncEnvVars.js +150 -0
- package/dist/commonjs/extensions/core/syncEnvVars.js.map +1 -0
- package/dist/commonjs/extensions/core/syncSupabaseEnvVars.d.ts +12 -0
- package/dist/commonjs/extensions/core/syncSupabaseEnvVars.js +169 -0
- package/dist/commonjs/extensions/core/syncSupabaseEnvVars.js.map +1 -0
- package/dist/commonjs/extensions/core/vercelSyncEnvVars.d.ts +11 -0
- package/dist/commonjs/extensions/core/vercelSyncEnvVars.js +85 -0
- package/dist/commonjs/extensions/core/vercelSyncEnvVars.js.map +1 -0
- package/dist/commonjs/extensions/core.d.ts +8 -0
- package/dist/commonjs/extensions/core.js +25 -0
- package/dist/commonjs/extensions/core.js.map +1 -0
- package/dist/commonjs/extensions/index.d.ts +3 -0
- package/dist/commonjs/extensions/index.js +7 -0
- package/dist/commonjs/extensions/index.js.map +1 -0
- package/dist/commonjs/extensions/lightpanda.d.ts +7 -0
- package/dist/commonjs/extensions/lightpanda.js +30 -0
- package/dist/commonjs/extensions/lightpanda.js.map +1 -0
- package/dist/commonjs/extensions/playwright.d.ts +55 -0
- package/dist/commonjs/extensions/playwright.js +308 -0
- package/dist/commonjs/extensions/playwright.js.map +1 -0
- package/dist/commonjs/extensions/prisma.d.ts +192 -0
- package/dist/commonjs/extensions/prisma.js +560 -0
- package/dist/commonjs/extensions/prisma.js.map +1 -0
- package/dist/commonjs/extensions/puppeteer.d.ts +8 -0
- package/dist/commonjs/extensions/puppeteer.js +36 -0
- package/dist/commonjs/extensions/puppeteer.js.map +1 -0
- package/dist/commonjs/extensions/secureExec.d.ts +35 -0
- package/dist/commonjs/extensions/secureExec.js +139 -0
- package/dist/commonjs/extensions/secureExec.js.map +1 -0
- package/dist/commonjs/extensions/typescript.d.ts +2 -0
- package/dist/commonjs/extensions/typescript.js +62 -0
- package/dist/commonjs/extensions/typescript.js.map +1 -0
- package/dist/commonjs/imports/mlly-cjs.cjs.map +1 -0
- package/dist/commonjs/imports/mlly.d.ts +1 -0
- package/dist/commonjs/imports/mlly.js +7 -0
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.js +19 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/internal/additionalFiles.d.ts +6 -0
- package/dist/commonjs/internal/additionalFiles.js +63 -0
- package/dist/commonjs/internal/additionalFiles.js.map +1 -0
- package/dist/commonjs/internal.d.ts +1 -0
- package/dist/commonjs/internal.js +18 -0
- package/dist/commonjs/internal.js.map +1 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/commonjs/version.d.ts +1 -0
- package/dist/commonjs/version.js +5 -0
- package/dist/commonjs/version.js.map +1 -0
- package/dist/esm/extensions/audioWaveform.d.ts +6 -0
- package/dist/esm/extensions/audioWaveform.js +42 -0
- package/dist/esm/extensions/audioWaveform.js.map +1 -0
- package/dist/esm/extensions/core/additionalFiles.d.ts +5 -0
- package/dist/esm/extensions/core/additionalFiles.js +10 -0
- package/dist/esm/extensions/core/additionalFiles.js.map +1 -0
- package/dist/esm/extensions/core/additionalPackages.d.ts +15 -0
- package/dist/esm/extensions/core/additionalPackages.js +74 -0
- package/dist/esm/extensions/core/additionalPackages.js.map +1 -0
- package/dist/esm/extensions/core/aptGet.d.ts +5 -0
- package/dist/esm/extensions/core/aptGet.js +20 -0
- package/dist/esm/extensions/core/aptGet.js.map +1 -0
- package/dist/esm/extensions/core/ffmpeg.d.ts +22 -0
- package/dist/esm/extensions/core/ffmpeg.js +65 -0
- package/dist/esm/extensions/core/ffmpeg.js.map +1 -0
- package/dist/esm/extensions/core/neonSyncEnvVars.d.ts +14 -0
- package/dist/esm/extensions/core/neonSyncEnvVars.js +198 -0
- package/dist/esm/extensions/core/neonSyncEnvVars.js.map +1 -0
- package/dist/esm/extensions/core/syncEnvVars.d.ts +18 -0
- package/dist/esm/extensions/core/syncEnvVars.js +147 -0
- package/dist/esm/extensions/core/syncEnvVars.js.map +1 -0
- package/dist/esm/extensions/core/syncSupabaseEnvVars.d.ts +12 -0
- package/dist/esm/extensions/core/syncSupabaseEnvVars.js +165 -0
- package/dist/esm/extensions/core/syncSupabaseEnvVars.js.map +1 -0
- package/dist/esm/extensions/core/vercelSyncEnvVars.d.ts +11 -0
- package/dist/esm/extensions/core/vercelSyncEnvVars.js +82 -0
- package/dist/esm/extensions/core/vercelSyncEnvVars.js.map +1 -0
- package/dist/esm/extensions/core.d.ts +8 -0
- package/dist/esm/extensions/core.js +9 -0
- package/dist/esm/extensions/core.js.map +1 -0
- package/dist/esm/extensions/index.d.ts +3 -0
- package/dist/esm/extensions/index.js +2 -0
- package/dist/esm/extensions/index.js.map +1 -0
- package/dist/esm/extensions/lightpanda.d.ts +7 -0
- package/dist/esm/extensions/lightpanda.js +26 -0
- package/dist/esm/extensions/lightpanda.js.map +1 -0
- package/dist/esm/extensions/playwright.d.ts +55 -0
- package/dist/esm/extensions/playwright.js +305 -0
- package/dist/esm/extensions/playwright.js.map +1 -0
- package/dist/esm/extensions/prisma.d.ts +192 -0
- package/dist/esm/extensions/prisma.js +550 -0
- package/dist/esm/extensions/prisma.js.map +1 -0
- package/dist/esm/extensions/puppeteer.d.ts +8 -0
- package/dist/esm/extensions/puppeteer.js +33 -0
- package/dist/esm/extensions/puppeteer.js.map +1 -0
- package/dist/esm/extensions/secureExec.d.ts +35 -0
- package/dist/esm/extensions/secureExec.js +136 -0
- package/dist/esm/extensions/secureExec.js.map +1 -0
- package/dist/esm/extensions/typescript.d.ts +2 -0
- package/dist/esm/extensions/typescript.js +56 -0
- package/dist/esm/extensions/typescript.js.map +1 -0
- package/dist/esm/imports/mlly.d.ts +2 -0
- package/dist/esm/imports/mlly.js +5 -0
- package/dist/esm/imports/mlly.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/additionalFiles.d.ts +6 -0
- package/dist/esm/internal/additionalFiles.js +60 -0
- package/dist/esm/internal/additionalFiles.js.map +1 -0
- package/dist/esm/internal.d.ts +1 -0
- package/dist/esm/internal.js +2 -0
- package/dist/esm/internal.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/version.d.ts +1 -0
- package/dist/esm/version.js +2 -0
- package/dist/esm/version.js.map +1 -0
- package/package.json +230 -0
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
import { binaryForRuntime } from "@trigger.dev/core/v3/build";
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import { existsSync, statSync } from "node:fs";
|
|
4
|
+
import { cp, readdir, readFile } from "node:fs/promises";
|
|
5
|
+
import { dirname, join, resolve } from "node:path";
|
|
6
|
+
import { resolvePathSync as esmResolveSync } from "../imports/mlly.js";
|
|
7
|
+
import { resolvePackageJSON } from "pkg-types";
|
|
8
|
+
const BINARY_TARGET = "linux-arm64-openssl-3.0.x";
|
|
9
|
+
/**
|
|
10
|
+
* Attempts to resolve the Prisma client version from the project.
|
|
11
|
+
* Tries @prisma/client first, then falls back to the prisma package.
|
|
12
|
+
*/
|
|
13
|
+
async function resolvePrismaClientVersion(workingDir, logger) {
|
|
14
|
+
// Try @prisma/client first
|
|
15
|
+
const clientVersion = await tryResolvePrismaPackageVersion("@prisma/client", workingDir, logger);
|
|
16
|
+
if (clientVersion) {
|
|
17
|
+
return clientVersion;
|
|
18
|
+
}
|
|
19
|
+
// Fall back to prisma package
|
|
20
|
+
const prismaVersion = await tryResolvePrismaPackageVersion("prisma", workingDir, logger);
|
|
21
|
+
if (prismaVersion) {
|
|
22
|
+
return prismaVersion;
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Attempts to resolve a specific Prisma package and extract its version
|
|
28
|
+
*/
|
|
29
|
+
async function tryResolvePrismaPackageVersion(packageName, workingDir, logger) {
|
|
30
|
+
try {
|
|
31
|
+
// Try to resolve the package using esmResolveSync
|
|
32
|
+
const resolvedPath = esmResolveSync(packageName, {
|
|
33
|
+
url: workingDir,
|
|
34
|
+
});
|
|
35
|
+
logger.debug(`Resolved ${packageName} module path`, {
|
|
36
|
+
resolvedPath,
|
|
37
|
+
workingDir,
|
|
38
|
+
packageName,
|
|
39
|
+
});
|
|
40
|
+
// Find the package.json for this resolved module
|
|
41
|
+
const packageJsonPath = await resolvePackageJSON(dirname(resolvedPath), {
|
|
42
|
+
test: async (filePath) => {
|
|
43
|
+
try {
|
|
44
|
+
const content = await readFile(filePath, "utf-8");
|
|
45
|
+
const candidate = JSON.parse(content);
|
|
46
|
+
// Exclude esm type markers
|
|
47
|
+
return Object.keys(candidate).length > 1 || !candidate.type;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger.debug("Error during package.json test", {
|
|
51
|
+
error: error instanceof Error ? error.message : error,
|
|
52
|
+
filePath,
|
|
53
|
+
});
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
if (!packageJsonPath) {
|
|
59
|
+
logger.debug(`No package.json found for ${packageName}`, {
|
|
60
|
+
resolvedPath,
|
|
61
|
+
});
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
logger.debug(`Found package.json for ${packageName}`, {
|
|
65
|
+
packageJsonPath,
|
|
66
|
+
});
|
|
67
|
+
// Read and parse the package.json
|
|
68
|
+
const packageJsonContent = await readFile(packageJsonPath, "utf-8");
|
|
69
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
70
|
+
if (packageJson.name === packageName && packageJson.version) {
|
|
71
|
+
logger.debug(`Detected ${packageName} version`, {
|
|
72
|
+
version: packageJson.version,
|
|
73
|
+
});
|
|
74
|
+
return packageJson.version;
|
|
75
|
+
}
|
|
76
|
+
logger.debug(`Package name mismatch or no version in package.json for ${packageName}`, {
|
|
77
|
+
expectedName: packageName,
|
|
78
|
+
actualName: packageJson.name,
|
|
79
|
+
version: packageJson.version,
|
|
80
|
+
});
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
logger.debug(`Failed to resolve ${packageName}`, {
|
|
85
|
+
error: error instanceof Error ? error.message : error,
|
|
86
|
+
workingDir,
|
|
87
|
+
});
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Loads a Prisma config file using @prisma/config and extracts the schema path and other configuration
|
|
93
|
+
*/
|
|
94
|
+
async function loadPrismaConfig(configFilePath, workingDir, logger) {
|
|
95
|
+
try {
|
|
96
|
+
// Resolve the config file path relative to the working directory
|
|
97
|
+
const resolvedConfigPath = resolve(workingDir, configFilePath);
|
|
98
|
+
logger.debug(`[PrismaExtension] loadPrismaConfig called`, {
|
|
99
|
+
configFilePath,
|
|
100
|
+
resolvedConfigPath,
|
|
101
|
+
workingDir,
|
|
102
|
+
});
|
|
103
|
+
// Check that the config file exists
|
|
104
|
+
if (!existsSync(resolvedConfigPath)) {
|
|
105
|
+
throw new Error(`Prisma config file not found at ${resolvedConfigPath}. Make sure the path is correct: ${configFilePath}, relative to the working dir ${workingDir}`);
|
|
106
|
+
}
|
|
107
|
+
logger.debug(`[PrismaExtension] Config file exists, loading with @prisma/config`);
|
|
108
|
+
// Dynamically import @prisma/config
|
|
109
|
+
const { loadConfigFromFile } = await import("@prisma/config");
|
|
110
|
+
// Load the config using @prisma/config
|
|
111
|
+
const configResult = await loadConfigFromFile({
|
|
112
|
+
configFile: resolvedConfigPath,
|
|
113
|
+
configRoot: workingDir,
|
|
114
|
+
});
|
|
115
|
+
logger.debug(`[PrismaExtension] loadConfigFromFile completed`, {
|
|
116
|
+
hasError: !!configResult.error,
|
|
117
|
+
errorTag: configResult.error?._tag,
|
|
118
|
+
});
|
|
119
|
+
function prettyConfigError(error) {
|
|
120
|
+
switch (error._tag) {
|
|
121
|
+
case "ConfigFileNotFound":
|
|
122
|
+
return `Config file not found at ${resolvedConfigPath}`;
|
|
123
|
+
case "ConfigLoadError":
|
|
124
|
+
return `Config file parse error: ${error.error.message}`;
|
|
125
|
+
case "ConfigFileSyntaxError":
|
|
126
|
+
return `Config file syntax error: ${error.error.message}`;
|
|
127
|
+
default:
|
|
128
|
+
return `Unknown config error: ${String(error.error.message)}`;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (configResult.error) {
|
|
132
|
+
throw new Error(`Failed to load Prisma config from ${resolvedConfigPath}: ${prettyConfigError(configResult.error)}`);
|
|
133
|
+
}
|
|
134
|
+
logger.debug(`[PrismaExtension] Config parsed successfully`, {
|
|
135
|
+
schema: configResult.config.schema,
|
|
136
|
+
migrationsPath: configResult.config.migrations?.path,
|
|
137
|
+
fullMigrations: configResult.config.migrations,
|
|
138
|
+
});
|
|
139
|
+
// Extract the schema path
|
|
140
|
+
if (!configResult.config.schema) {
|
|
141
|
+
throw new Error(`Prisma config file at ${resolvedConfigPath} does not specify a schema path`);
|
|
142
|
+
}
|
|
143
|
+
const result = {
|
|
144
|
+
schema: configResult.config.schema,
|
|
145
|
+
migrationsPath: configResult.config.migrations?.path,
|
|
146
|
+
};
|
|
147
|
+
logger.debug(`[PrismaExtension] Returning config result`, result);
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
logger.debug(`[PrismaExtension] Error loading config`, {
|
|
152
|
+
error: error instanceof Error ? error.message : error,
|
|
153
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
154
|
+
});
|
|
155
|
+
throw new Error(`Failed to load Prisma config from ${configFilePath}: ${error instanceof Error ? error.message : error}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Prisma build extension for Trigger.dev deployments.
|
|
160
|
+
*
|
|
161
|
+
* **Three modes available:**
|
|
162
|
+
* - `"legacy"` - Prisma 5.x/6.x with `prisma-client-js`, automatic generation
|
|
163
|
+
* - `"engine-only"` - Custom output paths, manual generation control
|
|
164
|
+
* - `"modern"` - Prisma 6.16+/7.x with `prisma-client` provider
|
|
165
|
+
*
|
|
166
|
+
* @example Legacy mode (most common)
|
|
167
|
+
* ```ts
|
|
168
|
+
* prismaExtension({
|
|
169
|
+
* mode: "legacy",
|
|
170
|
+
* schema: "prisma/schema.prisma",
|
|
171
|
+
* migrate: true,
|
|
172
|
+
* typedSql: true,
|
|
173
|
+
* });
|
|
174
|
+
* ```
|
|
175
|
+
*
|
|
176
|
+
* @example Engine-only mode (custom output)
|
|
177
|
+
* ```ts
|
|
178
|
+
* prismaExtension({
|
|
179
|
+
* mode: "engine-only",
|
|
180
|
+
* version: "6.19.0",
|
|
181
|
+
* });
|
|
182
|
+
* ```
|
|
183
|
+
*
|
|
184
|
+
* @example Modern mode (Prisma 7)
|
|
185
|
+
* ```ts
|
|
186
|
+
* prismaExtension({
|
|
187
|
+
* mode: "modern",
|
|
188
|
+
* });
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
export function prismaExtension(options) {
|
|
192
|
+
switch (options.mode) {
|
|
193
|
+
case "legacy":
|
|
194
|
+
return new PrismaLegacyModeExtension(options);
|
|
195
|
+
case "engine-only":
|
|
196
|
+
return new PrismaEngineOnlyModeExtension(options);
|
|
197
|
+
case "modern":
|
|
198
|
+
return new PrismaEngineModernModeExtension(options);
|
|
199
|
+
default:
|
|
200
|
+
return new PrismaLegacyModeExtension(options);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export class PrismaLegacyModeExtension {
|
|
204
|
+
options;
|
|
205
|
+
moduleExternals;
|
|
206
|
+
name = "PrismaExtension";
|
|
207
|
+
_resolvedSchemaPath;
|
|
208
|
+
_loadedConfig;
|
|
209
|
+
constructor(options) {
|
|
210
|
+
this.options = options;
|
|
211
|
+
this.moduleExternals = ["@prisma/client", "@prisma/engines"];
|
|
212
|
+
}
|
|
213
|
+
externalsForTarget(target) {
|
|
214
|
+
if (target === "dev") {
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
return this.moduleExternals;
|
|
218
|
+
}
|
|
219
|
+
async onBuildStart(context) {
|
|
220
|
+
if (context.target === "dev") {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
context.logger.debug(`[PrismaExtension] onBuildStart called`, {
|
|
224
|
+
workingDir: context.workingDir,
|
|
225
|
+
options: {
|
|
226
|
+
schema: this.options.schema,
|
|
227
|
+
configFile: this.options.configFile,
|
|
228
|
+
migrate: this.options.migrate,
|
|
229
|
+
version: this.options.version,
|
|
230
|
+
typedSql: this.options.typedSql,
|
|
231
|
+
clientGenerator: this.options.clientGenerator,
|
|
232
|
+
directUrlEnvVarName: this.options.directUrlEnvVarName,
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
// Validate that either schema or configFile is provided, but not both
|
|
236
|
+
if (!this.options.schema && !this.options.configFile) {
|
|
237
|
+
throw new Error(`PrismaExtension requires either 'schema' or 'configFile' to be specified in the options`);
|
|
238
|
+
}
|
|
239
|
+
if (this.options.schema && this.options.configFile) {
|
|
240
|
+
throw new Error(`PrismaExtension cannot have both 'schema' and 'configFile' specified. Please use only one.`);
|
|
241
|
+
}
|
|
242
|
+
let schemaPath;
|
|
243
|
+
// If configFile is specified, load it and extract the schema path
|
|
244
|
+
if (this.options.configFile) {
|
|
245
|
+
context.logger.debug(`[PrismaExtension] Loading Prisma config from ${this.options.configFile}`);
|
|
246
|
+
this._loadedConfig = await loadPrismaConfig(this.options.configFile, context.workingDir, context.logger);
|
|
247
|
+
schemaPath = this._loadedConfig.schema;
|
|
248
|
+
context.logger.debug(`[PrismaExtension] Config loaded successfully`, {
|
|
249
|
+
schema: this._loadedConfig.schema,
|
|
250
|
+
migrationsPath: this._loadedConfig.migrationsPath,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
schemaPath = this.options.schema;
|
|
255
|
+
context.logger.debug(`[PrismaExtension] Using schema from options: ${schemaPath}`);
|
|
256
|
+
}
|
|
257
|
+
// Resolve the path to the prisma schema, relative to the config.directory
|
|
258
|
+
this._resolvedSchemaPath = resolve(context.workingDir, schemaPath);
|
|
259
|
+
context.logger.debug(`[PrismaExtension] Resolved schema path`, {
|
|
260
|
+
schemaPath,
|
|
261
|
+
resolvedSchemaPath: this._resolvedSchemaPath,
|
|
262
|
+
workingDir: context.workingDir,
|
|
263
|
+
});
|
|
264
|
+
// Check that the prisma schema exists
|
|
265
|
+
if (!existsSync(this._resolvedSchemaPath)) {
|
|
266
|
+
throw new Error(`PrismaExtension could not find the prisma schema at ${this._resolvedSchemaPath}. Make sure the path is correct: ${schemaPath}, relative to the working dir ${context.workingDir}`);
|
|
267
|
+
}
|
|
268
|
+
context.logger.debug(`[PrismaExtension] Schema file exists at ${this._resolvedSchemaPath}`);
|
|
269
|
+
}
|
|
270
|
+
async onBuildComplete(context, manifest) {
|
|
271
|
+
if (context.target === "dev") {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
context.logger.debug(`[PrismaExtension] onBuildComplete called`);
|
|
275
|
+
assert(this._resolvedSchemaPath, "Resolved schema path is not set");
|
|
276
|
+
context.logger.debug(`[PrismaExtension] Looking for @prisma/client in the externals`, {
|
|
277
|
+
externals: manifest.externals,
|
|
278
|
+
});
|
|
279
|
+
const prismaExternal = manifest.externals?.find((external) => external.name === "@prisma/client");
|
|
280
|
+
let version = prismaExternal?.version ?? this.options.version;
|
|
281
|
+
// If we couldn't find the version in externals or options, try to resolve it from the filesystem
|
|
282
|
+
if (!version) {
|
|
283
|
+
context.logger.debug(`[PrismaExtension] Version not found in externals, attempting to detect from filesystem`);
|
|
284
|
+
version = await resolvePrismaClientVersion(context.workingDir, context.logger);
|
|
285
|
+
if (version) {
|
|
286
|
+
context.logger.debug(`[PrismaExtension] Detected version from filesystem: ${version}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (!version) {
|
|
290
|
+
throw new Error(`PrismaExtension could not determine the version of @prisma/client. It's possible that the @prisma/client was not used in the project. If this isn't the case, please provide a version in the PrismaExtension options.`);
|
|
291
|
+
}
|
|
292
|
+
context.logger.debug(`[PrismaExtension] Using Prisma version ${version}`, {
|
|
293
|
+
source: prismaExternal ? "externals" : this.options.version ? "options" : "filesystem",
|
|
294
|
+
});
|
|
295
|
+
// Detect if this is a multi-file schema (directory) or single file schema
|
|
296
|
+
const isMultiFileSchema = statSync(this._resolvedSchemaPath).isDirectory();
|
|
297
|
+
const usingSchemaFolder = !isMultiFileSchema && dirname(this._resolvedSchemaPath).endsWith("schema");
|
|
298
|
+
context.logger.debug(`Schema detection`, {
|
|
299
|
+
isMultiFileSchema,
|
|
300
|
+
usingSchemaFolder,
|
|
301
|
+
resolvedSchemaPath: this._resolvedSchemaPath,
|
|
302
|
+
});
|
|
303
|
+
let commands = [];
|
|
304
|
+
let prismaDir;
|
|
305
|
+
const generatorFlags = [];
|
|
306
|
+
if (this.options.clientGenerator) {
|
|
307
|
+
generatorFlags.push(`--generator=${this.options.clientGenerator}`);
|
|
308
|
+
}
|
|
309
|
+
if (this.options.typedSql) {
|
|
310
|
+
generatorFlags.push(`--sql`);
|
|
311
|
+
// Determine the prisma directory based on the schema structure
|
|
312
|
+
let prismaDirForSql;
|
|
313
|
+
if (isMultiFileSchema) {
|
|
314
|
+
// For multi-file schemas, the resolved path IS the prisma directory
|
|
315
|
+
prismaDirForSql = this._resolvedSchemaPath;
|
|
316
|
+
}
|
|
317
|
+
else if (usingSchemaFolder) {
|
|
318
|
+
// For schema folders (e.g., prisma/schema/*.prisma), go up two levels
|
|
319
|
+
prismaDirForSql = dirname(dirname(this._resolvedSchemaPath));
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
// For single file schemas (e.g., prisma/schema.prisma), go up one level
|
|
323
|
+
prismaDirForSql = dirname(this._resolvedSchemaPath);
|
|
324
|
+
}
|
|
325
|
+
context.logger.debug(`Using typedSql`, {
|
|
326
|
+
prismaDirForSql,
|
|
327
|
+
});
|
|
328
|
+
// Find all the files prisma/sql/*.sql
|
|
329
|
+
const sqlFiles = await readdir(join(prismaDirForSql, "sql")).then((files) => files.filter((file) => file.endsWith(".sql")));
|
|
330
|
+
context.logger.debug(`Found sql files`, {
|
|
331
|
+
sqlFiles,
|
|
332
|
+
});
|
|
333
|
+
const sqlDestinationPath = join(manifest.outputPath, "prisma", "sql");
|
|
334
|
+
for (const file of sqlFiles) {
|
|
335
|
+
const destination = join(sqlDestinationPath, file);
|
|
336
|
+
const source = join(prismaDirForSql, "sql", file);
|
|
337
|
+
context.logger.debug(`Copying the sql from ${source} to ${destination}`);
|
|
338
|
+
await cp(source, destination);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
if (isMultiFileSchema) {
|
|
342
|
+
// For multi-file schemas, the resolved path IS the prisma directory
|
|
343
|
+
prismaDir = this._resolvedSchemaPath;
|
|
344
|
+
context.logger.debug(`Using multi-file schema directory: ${prismaDir}`);
|
|
345
|
+
// Copy the entire prisma directory to the build output path
|
|
346
|
+
const prismaDestinationPath = join(manifest.outputPath, "prisma");
|
|
347
|
+
context.logger.debug(`Copying the prisma directory from ${prismaDir} to ${prismaDestinationPath}`);
|
|
348
|
+
const prismaDirForFilter = prismaDir;
|
|
349
|
+
await cp(prismaDir, prismaDestinationPath, {
|
|
350
|
+
recursive: true,
|
|
351
|
+
// Filter out migrations and sql directories as they're handled separately if needed
|
|
352
|
+
filter: (source) => {
|
|
353
|
+
const relativePath = source.replace(prismaDirForFilter, "");
|
|
354
|
+
// Skip migrations and sql directories during initial copy
|
|
355
|
+
return !relativePath.startsWith("/migrations") && !relativePath.startsWith("/sql");
|
|
356
|
+
},
|
|
357
|
+
});
|
|
358
|
+
commands.push(`${binaryForRuntime(manifest.runtime)} node_modules/prisma/build/index.js generate ${generatorFlags.join(" ")}` // Don't add the --schema flag when using directory
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
else if (usingSchemaFolder) {
|
|
362
|
+
const schemaDir = dirname(this._resolvedSchemaPath);
|
|
363
|
+
prismaDir = dirname(schemaDir);
|
|
364
|
+
context.logger.debug(`Using the schema folder: ${schemaDir}`);
|
|
365
|
+
// Find all the files in schemaDir that end with .prisma (excluding the schema.prisma file)
|
|
366
|
+
const prismaFiles = await readdir(schemaDir).then((files) => files.filter((file) => file.endsWith(".prisma")));
|
|
367
|
+
context.logger.debug(`Found prisma files in the schema folder`, {
|
|
368
|
+
prismaFiles,
|
|
369
|
+
});
|
|
370
|
+
const schemaDestinationPath = join(manifest.outputPath, "prisma", "schema");
|
|
371
|
+
const allPrismaFiles = [...prismaFiles];
|
|
372
|
+
for (const file of allPrismaFiles) {
|
|
373
|
+
const destination = join(schemaDestinationPath, file);
|
|
374
|
+
const source = join(schemaDir, file);
|
|
375
|
+
context.logger.debug(`Copying the prisma schema from ${source} to ${destination}`);
|
|
376
|
+
await cp(source, destination);
|
|
377
|
+
}
|
|
378
|
+
commands.push(`${binaryForRuntime(manifest.runtime)} node_modules/prisma/build/index.js generate ${generatorFlags.join(" ")}` // Don't add the --schema flag or this will fail
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
prismaDir = dirname(this._resolvedSchemaPath);
|
|
383
|
+
// Now we need to add a layer that:
|
|
384
|
+
// Copies the prisma schema to the build outputPath
|
|
385
|
+
// Adds the `prisma` CLI dependency to the dependencies
|
|
386
|
+
// Adds the `prisma generate` command, which generates the Prisma client
|
|
387
|
+
const schemaDestinationPath = join(manifest.outputPath, "prisma", "schema.prisma");
|
|
388
|
+
// Copy the prisma schema to the build output path
|
|
389
|
+
context.logger.debug(`Copying the prisma schema from ${this._resolvedSchemaPath} to ${schemaDestinationPath}`);
|
|
390
|
+
await cp(this._resolvedSchemaPath, schemaDestinationPath);
|
|
391
|
+
commands.push(`${binaryForRuntime(manifest.runtime)} node_modules/prisma/build/index.js generate --schema=./prisma/schema.prisma ${generatorFlags.join(" ")}`);
|
|
392
|
+
}
|
|
393
|
+
const env = {};
|
|
394
|
+
context.logger.debug(`[PrismaExtension] Checking if migrations are enabled`, {
|
|
395
|
+
migrate: this.options.migrate,
|
|
396
|
+
loadedConfigMigrationsPath: this._loadedConfig?.migrationsPath,
|
|
397
|
+
prismaDir,
|
|
398
|
+
});
|
|
399
|
+
if (this.options.migrate) {
|
|
400
|
+
context.logger.debug(`[PrismaExtension] Migrations enabled, determining migrations directory`);
|
|
401
|
+
// Determine the migrations directory path
|
|
402
|
+
let migrationsDir;
|
|
403
|
+
if (this._loadedConfig?.migrationsPath) {
|
|
404
|
+
// Use the migrations path from the config file
|
|
405
|
+
migrationsDir = resolve(context.workingDir, this._loadedConfig.migrationsPath);
|
|
406
|
+
context.logger.debug(`[PrismaExtension] Using migrations path from config`, {
|
|
407
|
+
configMigrationsPath: this._loadedConfig.migrationsPath,
|
|
408
|
+
resolvedMigrationsDir: migrationsDir,
|
|
409
|
+
workingDir: context.workingDir,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
// Fall back to the default migrations directory
|
|
414
|
+
migrationsDir = join(prismaDir, "migrations");
|
|
415
|
+
context.logger.debug(`[PrismaExtension] Using default migrations path`, {
|
|
416
|
+
prismaDir,
|
|
417
|
+
migrationsDir,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
const migrationsDestinationPath = join(manifest.outputPath, "prisma", "migrations");
|
|
421
|
+
context.logger.debug(`[PrismaExtension] Checking if migrations directory exists`, {
|
|
422
|
+
migrationsDir,
|
|
423
|
+
exists: existsSync(migrationsDir),
|
|
424
|
+
});
|
|
425
|
+
if (!existsSync(migrationsDir)) {
|
|
426
|
+
context.logger.warn(`[PrismaExtension] Migrations directory not found at ${migrationsDir}. Skipping migrations copy.`);
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
context.logger.debug(`[PrismaExtension] Copying prisma migrations from ${migrationsDir} to ${migrationsDestinationPath}`);
|
|
430
|
+
await cp(migrationsDir, migrationsDestinationPath, { recursive: true });
|
|
431
|
+
context.logger.debug(`[PrismaExtension] Migrations copied successfully`);
|
|
432
|
+
commands = [
|
|
433
|
+
`${binaryForRuntime(manifest.runtime)} node_modules/prisma/build/index.js migrate deploy`,
|
|
434
|
+
...commands,
|
|
435
|
+
];
|
|
436
|
+
context.logger.debug(`[PrismaExtension] Added migrate deploy command to commands array`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
context.logger.debug(`[PrismaExtension] Migrations not enabled (migrate: ${this.options.migrate})`);
|
|
441
|
+
}
|
|
442
|
+
env.DATABASE_URL = manifest.deploy.env?.DATABASE_URL;
|
|
443
|
+
// Handle directUrl environment variable configuration
|
|
444
|
+
if (this.options.directUrlEnvVarName) {
|
|
445
|
+
env[this.options.directUrlEnvVarName] =
|
|
446
|
+
manifest.deploy.env?.[this.options.directUrlEnvVarName] ??
|
|
447
|
+
process.env[this.options.directUrlEnvVarName];
|
|
448
|
+
if (!env[this.options.directUrlEnvVarName]) {
|
|
449
|
+
context.logger.warn(`prismaExtension could not resolve the ${this.options.directUrlEnvVarName} environment variable. Make sure you add it to your environment variables or provide it as an environment variable to the deploy CLI command. See our docs for more info: https://trigger.dev/docs/deploy-environment-variables`);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
env.DIRECT_URL = manifest.deploy.env?.DIRECT_URL;
|
|
454
|
+
env.DIRECT_DATABASE_URL = manifest.deploy.env?.DIRECT_DATABASE_URL;
|
|
455
|
+
}
|
|
456
|
+
if (!env.DATABASE_URL) {
|
|
457
|
+
context.logger.warn(`prismaExtension could not resolve the DATABASE_URL environment variable. Make sure you add it to your environment variables. See our docs for more info: https://trigger.dev/docs/deploy-environment-variables`);
|
|
458
|
+
}
|
|
459
|
+
context.logger.debug(`[PrismaExtension] Final layer configuration`, {
|
|
460
|
+
commands,
|
|
461
|
+
commandsCount: commands.length,
|
|
462
|
+
env: Object.keys(env),
|
|
463
|
+
dependencies: {
|
|
464
|
+
prisma: version,
|
|
465
|
+
},
|
|
466
|
+
});
|
|
467
|
+
context.logger.debug(`[PrismaExtension] Commands to be executed:`, {
|
|
468
|
+
commands: commands.map((cmd, idx) => `${idx + 1}. ${cmd}`),
|
|
469
|
+
});
|
|
470
|
+
context.addLayer({
|
|
471
|
+
id: "prisma",
|
|
472
|
+
commands,
|
|
473
|
+
dependencies: {
|
|
474
|
+
prisma: version,
|
|
475
|
+
},
|
|
476
|
+
build: {
|
|
477
|
+
env,
|
|
478
|
+
},
|
|
479
|
+
});
|
|
480
|
+
context.logger.debug(`[PrismaExtension] Layer added successfully`);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
export class PrismaEngineOnlyModeExtension {
|
|
484
|
+
options;
|
|
485
|
+
name = "PrismaEngineOnlyModeExtension";
|
|
486
|
+
_binaryTarget;
|
|
487
|
+
constructor(options) {
|
|
488
|
+
this.options = options;
|
|
489
|
+
this._binaryTarget = options.binaryTarget ?? "debian-openssl-3.0.x";
|
|
490
|
+
}
|
|
491
|
+
async onBuildComplete(context, manifest) {
|
|
492
|
+
if (context.target === "dev") {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
// Try to detect the version if not provided
|
|
496
|
+
let version = this.options.version;
|
|
497
|
+
if (!version) {
|
|
498
|
+
context.logger.debug("Attempting to detect @prisma/client version from the project");
|
|
499
|
+
version = await resolvePrismaClientVersion(context.workingDir, context.logger);
|
|
500
|
+
if (version) {
|
|
501
|
+
// Log a nice message to the user which version was detected, and give them instructions on how to override it
|
|
502
|
+
context.logger.progress(`prismaExtension: detected prisma ${version}. Override via prismaExtension({ mode: "engine-only", version: "6.19.0" })`);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
if (!version) {
|
|
506
|
+
throw new Error(`PrismaEngineOnlyModeExtension could not determine the version of @prisma/client. Please provide a version in the PrismaExtension options: prismaExtension({ mode: "engine-only", version: "6.19.0" })`);
|
|
507
|
+
}
|
|
508
|
+
context.logger.debug(`PrismaEngineOnlyModeExtension is installing engines for version ${version}`);
|
|
509
|
+
const commands = [
|
|
510
|
+
// Install the engines package
|
|
511
|
+
`npm install @prisma/engines@${version}`,
|
|
512
|
+
...generateCpCommandsForLocation("/app/prisma-engines", this._binaryTarget),
|
|
513
|
+
];
|
|
514
|
+
context.addLayer({
|
|
515
|
+
id: "prisma-engines",
|
|
516
|
+
commands,
|
|
517
|
+
deploy: {
|
|
518
|
+
env: {
|
|
519
|
+
PRISMA_QUERY_ENGINE_LIBRARY: `/app/prisma-engines/libquery_engine-${this._binaryTarget}.so.node`,
|
|
520
|
+
PRISMA_QUERY_ENGINE_SCHEMA_ENGINE: `/app/prisma-engines/schema-engine-${this._binaryTarget}`,
|
|
521
|
+
},
|
|
522
|
+
},
|
|
523
|
+
});
|
|
524
|
+
if (!this.options.silent) {
|
|
525
|
+
context.logger.progress("prismaExtension: setting PRISMA_QUERY_ENGINE_LIBRARY and PRISMA_QUERY_ENGINE_SCHEMA_ENGINE env variables");
|
|
526
|
+
// Now logs output a pretty message to the user that they need to make sure they have already run `prisma generate` and they also have added
|
|
527
|
+
// the binary target to the prisma schema file like so: binaryTargets = ["native", "debian-openssl-3.0.x"]
|
|
528
|
+
context.logger.progress(`prismaExtension: in engine-only mode you are required to run \`prisma generate\` and ensure your schema.prisma file has binaryTargets = ["native", "${this._binaryTarget}"]`);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
function generateCpCommandsForLocation(location, binaryTarget) {
|
|
533
|
+
return [
|
|
534
|
+
`mkdir -p ${location} && cp node_modules/@prisma/engines/libquery_engine-${binaryTarget}.so.node ${location}/`,
|
|
535
|
+
`mkdir -p ${location} && cp node_modules/@prisma/engines/schema-engine-${binaryTarget} ${location}/`,
|
|
536
|
+
];
|
|
537
|
+
}
|
|
538
|
+
export class PrismaEngineModernModeExtension {
|
|
539
|
+
options;
|
|
540
|
+
moduleExternals;
|
|
541
|
+
name = "PrismaEngineModernModeExtension";
|
|
542
|
+
constructor(options) {
|
|
543
|
+
this.options = options;
|
|
544
|
+
this.moduleExternals = ["@prisma/client"];
|
|
545
|
+
}
|
|
546
|
+
externalsForTarget(target) {
|
|
547
|
+
return this.moduleExternals;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
//# sourceMappingURL=prisma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../../src/extensions/prisma.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BuildManifest } from "@trigger.dev/core/v3";
|
|
2
|
+
import { BuildContext, BuildExtension } from "@trigger.dev/core/v3/build";
|
|
3
|
+
export declare function puppeteer(): PuppeteerExtension;
|
|
4
|
+
declare class PuppeteerExtension implements BuildExtension {
|
|
5
|
+
readonly name = "PuppeteerExtension";
|
|
6
|
+
onBuildComplete(context: BuildContext, manifest: BuildManifest): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export function puppeteer() {
|
|
2
|
+
return new PuppeteerExtension();
|
|
3
|
+
}
|
|
4
|
+
class PuppeteerExtension {
|
|
5
|
+
name = "PuppeteerExtension";
|
|
6
|
+
async onBuildComplete(context, manifest) {
|
|
7
|
+
if (context.target === "dev") {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
context.logger.debug(`Adding ${this.name} to the build`);
|
|
11
|
+
const instructions = [
|
|
12
|
+
`RUN apt-get update && apt-get install curl gnupg -y \
|
|
13
|
+
&& curl --location --silent https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
|
|
14
|
+
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
|
|
15
|
+
&& apt-get update \
|
|
16
|
+
&& apt-get install google-chrome-stable -y --no-install-recommends \
|
|
17
|
+
&& rm -rf /var/lib/apt/lists/*`,
|
|
18
|
+
];
|
|
19
|
+
context.addLayer({
|
|
20
|
+
id: "puppeteer",
|
|
21
|
+
image: {
|
|
22
|
+
instructions,
|
|
23
|
+
},
|
|
24
|
+
deploy: {
|
|
25
|
+
env: {
|
|
26
|
+
PUPPETEER_EXECUTABLE_PATH: "/usr/bin/google-chrome-stable",
|
|
27
|
+
},
|
|
28
|
+
override: true,
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=puppeteer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../../../src/extensions/puppeteer.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,kBAAkB,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,kBAAkB;IACN,IAAI,GAAG,oBAAoB,CAAC;IAE5C,KAAK,CAAC,eAAe,CAAC,OAAqB,EAAE,QAAuB;QAClE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,eAAe,CAAC,CAAC;QAEzD,MAAM,YAAY,GAAG;YACnB;;;;;iCAK2B;SAC5B,CAAC;QAEF,OAAO,CAAC,QAAQ,CAAC;YACf,EAAE,EAAE,WAAW;YACf,KAAK,EAAE;gBACL,YAAY;aACb;YACD,MAAM,EAAE;gBACN,GAAG,EAAE;oBACH,yBAAyB,EAAE,+BAA+B;iBAC3D;gBACD,QAAQ,EAAE,IAAI;aACf;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { BuildExtension } from "@trigger.dev/core/v3/build";
|
|
2
|
+
export type SecureExecOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* Packages available inside the sandbox at runtime.
|
|
5
|
+
*
|
|
6
|
+
* These are `require()`'d inside the V8 isolate at runtime — the bundler
|
|
7
|
+
* never sees them statically. They are marked external and installed as
|
|
8
|
+
* deploy dependencies.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* secureExec({ packages: ["jszip", "lodash"] })
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
packages?: string[];
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Build extension for [secure-exec](https://secureexec.dev) — run untrusted
|
|
19
|
+
* JavaScript/TypeScript in V8 isolates with configurable permissions.
|
|
20
|
+
*
|
|
21
|
+
* Handles the esbuild workarounds needed for secure-exec's runtime
|
|
22
|
+
* `require.resolve` calls, native binaries, and module-scope resolution.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { secureExec } from "@trigger.dev/build/extensions/secureExec";
|
|
27
|
+
*
|
|
28
|
+
* export default defineConfig({
|
|
29
|
+
* build: {
|
|
30
|
+
* extensions: [secureExec()],
|
|
31
|
+
* },
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function secureExec(options?: SecureExecOptions): BuildExtension;
|