@trigger.dev/build 0.0.0-prerelease-20250204161430 → 0.0.0-prerelease-20250211141853

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.
@@ -4,7 +4,7 @@ exports.audioWaveform = audioWaveform;
4
4
  const AUDIOWAVEFORM_VERSION = "1.10.1";
5
5
  const AUDIOWAVEFORM_CHECKSUM = "sha256:00b41ea4d6e7a5b4affcfe4ac99951ec89da81a8cba40af19e9b98c3a8f9b4b8";
6
6
  function audioWaveform(options = {}) {
7
- return new AudioWaveformExtension();
7
+ return new AudioWaveformExtension(options);
8
8
  }
9
9
  class AudioWaveformExtension {
10
10
  options;
@@ -1 +1 @@
1
- {"version":3,"file":"audioWaveform.js","sourceRoot":"","sources":["../../../src/extensions/audioWaveform.ts"],"names":[],"mappings":";;AAYA,sCAEC;AAND,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AACvC,MAAM,sBAAsB,GAC1B,yEAAyE,CAAC;AAE5E,SAAgB,aAAa,CAAC,UAAgC,EAAE;IAC9D,OAAO,IAAI,sBAAsB,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,sBAAsB;IAGN;IAFJ,IAAI,GAAG,wBAAwB,CAAC;IAEhD,YAAoB,UAAgC,EAAE;QAAlC,YAAO,GAAP,OAAO,CAA2B;IAAG,CAAC;IAE1D,KAAK,CAAC,eAAe,CAAC,OAAqB,EAAE,QAAuB;QAClE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;YAC/B,CAAC,CAAC;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC7B,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;aAChC;YACH,CAAC,CAAC;gBACE,OAAO,EAAE,qBAAqB;gBAC9B,QAAQ,EAAE,sBAAsB;aACjC,CAAC;QAEN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;YACxD,GAAG,IAAI;SACR,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG;YACnB,OACE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAClD,2DAA2D,IAAI,CAAC,OAAO,kBACrE,IAAI,CAAC,OACP,mBAAmB;YACnB,6BAA6B,IAAI,CAAC,OAAO,yBAAyB;YAClE,2BAA2B;YAC3B,qCAAqC;SACtC,CAAC;QAEF,OAAO,CAAC,QAAQ,CAAC;YACf,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK,CAAC;gBACb,YAAY;aACb;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"audioWaveform.js","sourceRoot":"","sources":["../../../src/extensions/audioWaveform.ts"],"names":[],"mappings":";;AAYA,sCAEC;AAND,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AACvC,MAAM,sBAAsB,GAC1B,yEAAyE,CAAC;AAE5E,SAAgB,aAAa,CAAC,UAAgC,EAAE;IAC9D,OAAO,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,sBAAsB;IAGN;IAFJ,IAAI,GAAG,wBAAwB,CAAC;IAEhD,YAAoB,UAAgC,EAAE;QAAlC,YAAO,GAAP,OAAO,CAA2B;IAAG,CAAC;IAE1D,KAAK,CAAC,eAAe,CAAC,OAAqB,EAAE,QAAuB;QAClE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;YAC/B,CAAC,CAAC;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC7B,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;aAChC;YACH,CAAC,CAAC;gBACE,OAAO,EAAE,qBAAqB;gBAC9B,QAAQ,EAAE,sBAAsB;aACjC,CAAC;QAEN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;YACxD,GAAG,IAAI;SACR,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG;YACnB,OACE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAClD,2DAA2D,IAAI,CAAC,OAAO,kBACrE,IAAI,CAAC,OACP,mBAAmB;YACnB,6BAA6B,IAAI,CAAC,OAAO,yBAAyB;YAClE,2BAA2B;YAC3B,qCAAqC;SACtC,CAAC;QAEF,OAAO,CAAC,QAAQ,CAAC;YACf,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK,CAAC;gBACb,YAAY;aACb;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import { BuildExtension } from "@trigger.dev/core/v3/build";
2
+ import { Options as XOptions, Result } from "tinyexec";
3
+ export type PythonOptions = {
4
+ requirements?: string[];
5
+ requirementsFile?: string;
6
+ /**
7
+ * [Dev-only] The path to the python binary.
8
+ *
9
+ * @remarks
10
+ * This option is typically used during local development or in specific testing environments
11
+ * where a particular Python installation needs to be targeted. It should point to the full path of the python executable.
12
+ *
13
+ * Example: `/usr/bin/python3` or `C:\\Python39\\python.exe`
14
+ */
15
+ pythonBinaryPath?: string;
16
+ /**
17
+ * An array of glob patterns that specify which Python scripts are allowed to be executed.
18
+ *
19
+ * @remarks
20
+ * These scripts will be copied to the container during the build process.
21
+ */
22
+ scripts?: string[];
23
+ };
24
+ export declare function pythonExtension(options?: PythonOptions): BuildExtension;
25
+ export declare const run: (scriptArgs?: string[], options?: Partial<XOptions>) => Promise<Result>;
26
+ export declare const runScript: (scriptPath: string, scriptArgs?: string[], options?: Partial<XOptions>) => Promise<Result>;
27
+ export declare const runInline: (scriptContent: string, options?: Partial<XOptions>) => Promise<import("tinyexec").Output>;
28
+ declare const _default: {
29
+ run: (scriptArgs?: string[], options?: Partial<XOptions>) => Promise<Result>;
30
+ runScript: (scriptPath: string, scriptArgs?: string[], options?: Partial<XOptions>) => Promise<Result>;
31
+ runInline: (scriptContent: string, options?: Partial<XOptions>) => Promise<import("tinyexec").Output>;
32
+ };
33
+ export default _default;
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runInline = exports.runScript = exports.run = void 0;
7
+ exports.pythonExtension = pythonExtension;
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_assert_1 = __importDefault(require("node:assert"));
10
+ const additionalFiles_js_1 = require("./core/additionalFiles.js");
11
+ const v3_1 = require("@trigger.dev/sdk/v3");
12
+ const tinyexec_1 = require("tinyexec");
13
+ const splitAndCleanComments = (str) => str
14
+ .split("\n")
15
+ .map((line) => line.trim())
16
+ .filter((line) => line && !line.startsWith("#"));
17
+ function pythonExtension(options = {}) {
18
+ return new PythonExtension(options);
19
+ }
20
+ class PythonExtension {
21
+ options;
22
+ name = "PythonExtension";
23
+ constructor(options = {}) {
24
+ this.options = options;
25
+ (0, node_assert_1.default)(!(this.options.requirements && this.options.requirementsFile), "Cannot specify both requirements and requirementsFile");
26
+ if (this.options.requirementsFile) {
27
+ (0, node_assert_1.default)(node_fs_1.default.existsSync(this.options.requirementsFile), `Requirements file not found: ${this.options.requirementsFile}`);
28
+ this.options.requirements = splitAndCleanComments(node_fs_1.default.readFileSync(this.options.requirementsFile, "utf-8"));
29
+ }
30
+ }
31
+ async onBuildComplete(context, manifest) {
32
+ await (0, additionalFiles_js_1.additionalFiles)({
33
+ files: this.options.scripts ?? [],
34
+ }).onBuildComplete(context, manifest);
35
+ if (context.target === "dev") {
36
+ if (this.options.pythonBinaryPath) {
37
+ process.env.PYTHON_BIN_PATH = this.options.pythonBinaryPath;
38
+ }
39
+ return;
40
+ }
41
+ context.logger.debug(`Adding ${this.name} to the build`);
42
+ context.addLayer({
43
+ id: "python-installation",
44
+ image: {
45
+ instructions: splitAndCleanComments(`
46
+ # Install Python
47
+ RUN apt-get update && apt-get install -y --no-install-recommends \
48
+ python3 python3-pip python3-venv && \
49
+ apt-get clean && rm -rf /var/lib/apt/lists/*
50
+
51
+ # Set up Python environment
52
+ RUN python3 -m venv /opt/venv
53
+ ENV PATH="/opt/venv/bin:$PATH"
54
+ `),
55
+ },
56
+ deploy: {
57
+ env: {
58
+ PYTHON_BIN_PATH: `/opt/venv/bin/python`,
59
+ },
60
+ override: true,
61
+ },
62
+ });
63
+ context.addLayer({
64
+ id: "python-dependencies",
65
+ build: {
66
+ env: {
67
+ REQUIREMENTS_CONTENT: this.options.requirements?.join("\n") || "",
68
+ },
69
+ },
70
+ image: {
71
+ instructions: splitAndCleanComments(`
72
+ ARG REQUIREMENTS_CONTENT
73
+ RUN echo "$REQUIREMENTS_CONTENT" > requirements.txt
74
+
75
+ # Install dependencies
76
+ RUN pip install --no-cache-dir -r requirements.txt
77
+ `),
78
+ },
79
+ deploy: {
80
+ override: true,
81
+ },
82
+ });
83
+ }
84
+ }
85
+ const run = async (scriptArgs = [], options = {}) => {
86
+ const pythonBin = process.env.PYTHON_BIN_PATH || "python";
87
+ const result = await (0, tinyexec_1.x)(pythonBin, scriptArgs, {
88
+ ...options,
89
+ throwOnError: false, // Ensure errors are handled manually
90
+ });
91
+ try {
92
+ (0, node_assert_1.default)(result.exitCode === 0, `Python command exited with non-zero code ${result.exitCode}\nStdout: ${result.stdout}\nStderr: ${result.stderr}`);
93
+ }
94
+ catch (error) {
95
+ v3_1.logger.error("Python command execution failed", {
96
+ error: error instanceof Error ? error.message : error,
97
+ command: `${pythonBin} ${scriptArgs.join(" ")}`,
98
+ stdout: result.stdout,
99
+ stderr: result.stderr,
100
+ exitCode: result.exitCode,
101
+ });
102
+ throw error;
103
+ }
104
+ return result;
105
+ };
106
+ exports.run = run;
107
+ const runScript = (scriptPath, scriptArgs = [], options = {}) => {
108
+ (0, node_assert_1.default)(scriptPath, "Script path is required");
109
+ (0, node_assert_1.default)(node_fs_1.default.existsSync(scriptPath), `Script does not exist: ${scriptPath}`);
110
+ return (0, exports.run)([scriptPath, ...scriptArgs], options);
111
+ };
112
+ exports.runScript = runScript;
113
+ const runInline = async (scriptContent, options = {}) => {
114
+ (0, node_assert_1.default)(scriptContent, "Script content is required");
115
+ const tmpFile = `/tmp/script_${Date.now()}.py`;
116
+ await node_fs_1.default.promises.writeFile(tmpFile, scriptContent, { mode: 0o600 });
117
+ try {
118
+ return await (0, exports.runScript)(tmpFile, [], options);
119
+ }
120
+ finally {
121
+ await node_fs_1.default.promises.unlink(tmpFile);
122
+ }
123
+ };
124
+ exports.runInline = runInline;
125
+ exports.default = { run: exports.run, runScript: exports.runScript, runInline: exports.runInline };
126
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/extensions/python.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = "0.0.0-prerelease-20250204161430";
4
+ exports.VERSION = "3.3.13";
5
5
  //# sourceMappingURL=version.js.map
@@ -1,7 +1,7 @@
1
1
  const AUDIOWAVEFORM_VERSION = "1.10.1";
2
2
  const AUDIOWAVEFORM_CHECKSUM = "sha256:00b41ea4d6e7a5b4affcfe4ac99951ec89da81a8cba40af19e9b98c3a8f9b4b8";
3
3
  export function audioWaveform(options = {}) {
4
- return new AudioWaveformExtension();
4
+ return new AudioWaveformExtension(options);
5
5
  }
6
6
  class AudioWaveformExtension {
7
7
  options;
@@ -1 +1 @@
1
- {"version":3,"file":"audioWaveform.js","sourceRoot":"","sources":["../../../src/extensions/audioWaveform.ts"],"names":[],"mappings":"AAQA,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AACvC,MAAM,sBAAsB,GAC1B,yEAAyE,CAAC;AAE5E,MAAM,UAAU,aAAa,CAAC,UAAgC,EAAE;IAC9D,OAAO,IAAI,sBAAsB,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,sBAAsB;IAGN;IAFJ,IAAI,GAAG,wBAAwB,CAAC;IAEhD,YAAoB,UAAgC,EAAE;QAAlC,YAAO,GAAP,OAAO,CAA2B;IAAG,CAAC;IAE1D,KAAK,CAAC,eAAe,CAAC,OAAqB,EAAE,QAAuB;QAClE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;YAC/B,CAAC,CAAC;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC7B,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;aAChC;YACH,CAAC,CAAC;gBACE,OAAO,EAAE,qBAAqB;gBAC9B,QAAQ,EAAE,sBAAsB;aACjC,CAAC;QAEN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;YACxD,GAAG,IAAI;SACR,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG;YACnB,OACE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAClD,2DAA2D,IAAI,CAAC,OAAO,kBACrE,IAAI,CAAC,OACP,mBAAmB;YACnB,6BAA6B,IAAI,CAAC,OAAO,yBAAyB;YAClE,2BAA2B;YAC3B,qCAAqC;SACtC,CAAC;QAEF,OAAO,CAAC,QAAQ,CAAC;YACf,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK,CAAC;gBACb,YAAY;aACb;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"audioWaveform.js","sourceRoot":"","sources":["../../../src/extensions/audioWaveform.ts"],"names":[],"mappings":"AAQA,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AACvC,MAAM,sBAAsB,GAC1B,yEAAyE,CAAC;AAE5E,MAAM,UAAU,aAAa,CAAC,UAAgC,EAAE;IAC9D,OAAO,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,sBAAsB;IAGN;IAFJ,IAAI,GAAG,wBAAwB,CAAC;IAEhD,YAAoB,UAAgC,EAAE;QAAlC,YAAO,GAAP,OAAO,CAA2B;IAAG,CAAC;IAE1D,KAAK,CAAC,eAAe,CAAC,OAAqB,EAAE,QAAuB;QAClE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;YAC/B,CAAC,CAAC;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC7B,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;aAChC;YACH,CAAC,CAAC;gBACE,OAAO,EAAE,qBAAqB;gBAC9B,QAAQ,EAAE,sBAAsB;aACjC,CAAC;QAEN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;YACxD,GAAG,IAAI;SACR,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG;YACnB,OACE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAClD,2DAA2D,IAAI,CAAC,OAAO,kBACrE,IAAI,CAAC,OACP,mBAAmB;YACnB,6BAA6B,IAAI,CAAC,OAAO,yBAAyB;YAClE,2BAA2B;YAC3B,qCAAqC;SACtC,CAAC;QAEF,OAAO,CAAC,QAAQ,CAAC;YACf,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK,CAAC;gBACb,YAAY;aACb;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import { BuildExtension } from "@trigger.dev/core/v3/build";
2
+ import { Options as XOptions, Result } from "tinyexec";
3
+ export type PythonOptions = {
4
+ requirements?: string[];
5
+ requirementsFile?: string;
6
+ /**
7
+ * [Dev-only] The path to the python binary.
8
+ *
9
+ * @remarks
10
+ * This option is typically used during local development or in specific testing environments
11
+ * where a particular Python installation needs to be targeted. It should point to the full path of the python executable.
12
+ *
13
+ * Example: `/usr/bin/python3` or `C:\\Python39\\python.exe`
14
+ */
15
+ pythonBinaryPath?: string;
16
+ /**
17
+ * An array of glob patterns that specify which Python scripts are allowed to be executed.
18
+ *
19
+ * @remarks
20
+ * These scripts will be copied to the container during the build process.
21
+ */
22
+ scripts?: string[];
23
+ };
24
+ export declare function pythonExtension(options?: PythonOptions): BuildExtension;
25
+ export declare const run: (scriptArgs?: string[], options?: Partial<XOptions>) => Promise<Result>;
26
+ export declare const runScript: (scriptPath: string, scriptArgs?: string[], options?: Partial<XOptions>) => Promise<Result>;
27
+ export declare const runInline: (scriptContent: string, options?: Partial<XOptions>) => Promise<import("tinyexec").Output>;
28
+ declare const _default: {
29
+ run: (scriptArgs?: string[], options?: Partial<XOptions>) => Promise<Result>;
30
+ runScript: (scriptPath: string, scriptArgs?: string[], options?: Partial<XOptions>) => Promise<Result>;
31
+ runInline: (scriptContent: string, options?: Partial<XOptions>) => Promise<import("tinyexec").Output>;
32
+ };
33
+ export default _default;
@@ -0,0 +1,116 @@
1
+ import fs from "node:fs";
2
+ import assert from "node:assert";
3
+ import { additionalFiles } from "./core/additionalFiles.js";
4
+ import { logger } from "@trigger.dev/sdk/v3";
5
+ import { x } from "tinyexec";
6
+ const splitAndCleanComments = (str) => str
7
+ .split("\n")
8
+ .map((line) => line.trim())
9
+ .filter((line) => line && !line.startsWith("#"));
10
+ export function pythonExtension(options = {}) {
11
+ return new PythonExtension(options);
12
+ }
13
+ class PythonExtension {
14
+ options;
15
+ name = "PythonExtension";
16
+ constructor(options = {}) {
17
+ this.options = options;
18
+ assert(!(this.options.requirements && this.options.requirementsFile), "Cannot specify both requirements and requirementsFile");
19
+ if (this.options.requirementsFile) {
20
+ assert(fs.existsSync(this.options.requirementsFile), `Requirements file not found: ${this.options.requirementsFile}`);
21
+ this.options.requirements = splitAndCleanComments(fs.readFileSync(this.options.requirementsFile, "utf-8"));
22
+ }
23
+ }
24
+ async onBuildComplete(context, manifest) {
25
+ await additionalFiles({
26
+ files: this.options.scripts ?? [],
27
+ }).onBuildComplete(context, manifest);
28
+ if (context.target === "dev") {
29
+ if (this.options.pythonBinaryPath) {
30
+ process.env.PYTHON_BIN_PATH = this.options.pythonBinaryPath;
31
+ }
32
+ return;
33
+ }
34
+ context.logger.debug(`Adding ${this.name} to the build`);
35
+ context.addLayer({
36
+ id: "python-installation",
37
+ image: {
38
+ instructions: splitAndCleanComments(`
39
+ # Install Python
40
+ RUN apt-get update && apt-get install -y --no-install-recommends \
41
+ python3 python3-pip python3-venv && \
42
+ apt-get clean && rm -rf /var/lib/apt/lists/*
43
+
44
+ # Set up Python environment
45
+ RUN python3 -m venv /opt/venv
46
+ ENV PATH="/opt/venv/bin:$PATH"
47
+ `),
48
+ },
49
+ deploy: {
50
+ env: {
51
+ PYTHON_BIN_PATH: `/opt/venv/bin/python`,
52
+ },
53
+ override: true,
54
+ },
55
+ });
56
+ context.addLayer({
57
+ id: "python-dependencies",
58
+ build: {
59
+ env: {
60
+ REQUIREMENTS_CONTENT: this.options.requirements?.join("\n") || "",
61
+ },
62
+ },
63
+ image: {
64
+ instructions: splitAndCleanComments(`
65
+ ARG REQUIREMENTS_CONTENT
66
+ RUN echo "$REQUIREMENTS_CONTENT" > requirements.txt
67
+
68
+ # Install dependencies
69
+ RUN pip install --no-cache-dir -r requirements.txt
70
+ `),
71
+ },
72
+ deploy: {
73
+ override: true,
74
+ },
75
+ });
76
+ }
77
+ }
78
+ export const run = async (scriptArgs = [], options = {}) => {
79
+ const pythonBin = process.env.PYTHON_BIN_PATH || "python";
80
+ const result = await x(pythonBin, scriptArgs, {
81
+ ...options,
82
+ throwOnError: false, // Ensure errors are handled manually
83
+ });
84
+ try {
85
+ assert(result.exitCode === 0, `Python command exited with non-zero code ${result.exitCode}\nStdout: ${result.stdout}\nStderr: ${result.stderr}`);
86
+ }
87
+ catch (error) {
88
+ logger.error("Python command execution failed", {
89
+ error: error instanceof Error ? error.message : error,
90
+ command: `${pythonBin} ${scriptArgs.join(" ")}`,
91
+ stdout: result.stdout,
92
+ stderr: result.stderr,
93
+ exitCode: result.exitCode,
94
+ });
95
+ throw error;
96
+ }
97
+ return result;
98
+ };
99
+ export const runScript = (scriptPath, scriptArgs = [], options = {}) => {
100
+ assert(scriptPath, "Script path is required");
101
+ assert(fs.existsSync(scriptPath), `Script does not exist: ${scriptPath}`);
102
+ return run([scriptPath, ...scriptArgs], options);
103
+ };
104
+ export const runInline = async (scriptContent, options = {}) => {
105
+ assert(scriptContent, "Script content is required");
106
+ const tmpFile = `/tmp/script_${Date.now()}.py`;
107
+ await fs.promises.writeFile(tmpFile, scriptContent, { mode: 0o600 });
108
+ try {
109
+ return await runScript(tmpFile, [], options);
110
+ }
111
+ finally {
112
+ await fs.promises.unlink(tmpFile);
113
+ }
114
+ };
115
+ export default { run, runScript, runInline };
116
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/extensions/python.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.0.0-prerelease-20250204161430";
1
+ export const VERSION = "3.3.13";
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trigger.dev/build",
3
- "version": "0.0.0-prerelease-20250204161430",
3
+ "version": "0.0.0-prerelease-20250211141853",
4
4
  "description": "trigger.dev build extensions",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -28,6 +28,7 @@
28
28
  "./extensions/prisma": "./src/extensions/prisma.ts",
29
29
  "./extensions/audioWaveform": "./src/extensions/audioWaveform.ts",
30
30
  "./extensions/typescript": "./src/extensions/typescript.ts",
31
+ "./extensions/python": "./src/extensions/python.ts",
31
32
  "./extensions/puppeteer": "./src/extensions/puppeteer.ts"
32
33
  },
33
34
  "sourceDialects": [
@@ -51,14 +52,19 @@
51
52
  "extensions/typescript": [
52
53
  "dist/commonjs/extensions/typescript.d.ts"
53
54
  ],
55
+ "extensions/python": [
56
+ "dist/commonjs/extensions/python.d.ts"
57
+ ],
54
58
  "extensions/puppeteer": [
55
59
  "dist/commonjs/extensions/puppeteer.d.ts"
56
60
  ]
57
61
  }
58
62
  },
59
63
  "dependencies": {
60
- "@trigger.dev/core": "0.0.0-prerelease-20250204161430",
64
+ "@trigger.dev/core": "0.0.0-prerelease-20250211141853",
65
+ "@trigger.dev/sdk": "0.0.0-prerelease-20250211141853",
61
66
  "pkg-types": "^1.1.3",
67
+ "tinyexec": "^0.3.2",
62
68
  "tinyglobby": "^0.2.2",
63
69
  "tsconfck": "3.1.3"
64
70
  },
@@ -142,6 +148,17 @@
142
148
  "default": "./dist/commonjs/extensions/typescript.js"
143
149
  }
144
150
  },
151
+ "./extensions/python": {
152
+ "import": {
153
+ "@triggerdotdev/source": "./src/extensions/python.ts",
154
+ "types": "./dist/esm/extensions/python.d.ts",
155
+ "default": "./dist/esm/extensions/python.js"
156
+ },
157
+ "require": {
158
+ "types": "./dist/commonjs/extensions/python.d.ts",
159
+ "default": "./dist/commonjs/extensions/python.js"
160
+ }
161
+ },
145
162
  "./extensions/puppeteer": {
146
163
  "import": {
147
164
  "@triggerdotdev/source": "./src/extensions/puppeteer.ts",