@mastra/deployer 1.68.0 → 1.69.0-alpha.0
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/dist/{analyze-ClD1cvPT.cjs → analyze-CcnwZxfN.cjs} +2 -2
- package/dist/{analyze-ClD1cvPT.cjs.map → analyze-CcnwZxfN.cjs.map} +1 -1
- package/dist/{analyze-DEk6PGTI.js → analyze-D1BPc4_P.js} +2 -2
- package/dist/{analyze-DEk6PGTI.js.map → analyze-D1BPc4_P.js.map} +1 -1
- package/dist/build/analyze.cjs +1 -1
- package/dist/build/analyze.js +1 -1
- package/dist/build/index.cjs +3 -3
- package/dist/build/index.js +3 -3
- package/dist/{build-JNlRQOvG.js → build-Dcbrde_a.js} +3 -3
- package/dist/{build-JNlRQOvG.js.map → build-Dcbrde_a.js.map} +1 -1
- package/dist/{build-DJMEiMA1.cjs → build-FfLGNT2X.cjs} +3 -3
- package/dist/{build-DJMEiMA1.cjs.map → build-FfLGNT2X.cjs.map} +1 -1
- package/dist/bundler/index.cjs +2 -2
- package/dist/bundler/index.js +2 -2
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.js +2 -2
- package/dist/server/index.cjs +5 -5
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +5 -5
- package/dist/server/index.js.map +1 -1
- package/dist/services/deps.d.ts +40 -0
- package/dist/services/deps.d.ts.map +1 -1
- package/dist/services/index.cjs +1 -1
- package/dist/services/index.js +1 -1
- package/dist/{services-Lm6PRS4D.js → services-D_C2Onjo.js} +146 -2
- package/dist/services-D_C2Onjo.js.map +1 -0
- package/dist/{services-Beob47UW.cjs → services-m8tlZVRv.cjs} +146 -2
- package/dist/services-m8tlZVRv.cjs.map +1 -0
- package/package.json +6 -6
- package/dist/services-Beob47UW.cjs.map +0 -1
- package/dist/services-Lm6PRS4D.js.map +0 -1
package/dist/services/deps.d.ts
CHANGED
|
@@ -7,8 +7,15 @@ interface ArchitectureOptions {
|
|
|
7
7
|
interface InstallOptions extends ArchitectureOptions {
|
|
8
8
|
pnpmOverrides?: Record<string, string>;
|
|
9
9
|
pnpmNodeLinker?: 'hoisted';
|
|
10
|
+
/** Patch key -> path relative to the output directory. */
|
|
11
|
+
patchedDependencies?: Record<string, string>;
|
|
10
12
|
}
|
|
11
13
|
export declare function getPnpmIgnoredBuildPackages(output: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Reads the `patchedDependencies` map from a pnpm workspace file. Paths are returned as declared,
|
|
16
|
+
* i.e. relative to the workspace root. Returns an empty map for absent or unusable declarations.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parsePnpmPatchedDependencies(source: string): Record<string, string>;
|
|
12
19
|
export declare function copyPnpmWorkspaceSettings(source: string, options?: InstallOptions): string;
|
|
13
20
|
export declare class Deps extends MastraBase {
|
|
14
21
|
private packageManager;
|
|
@@ -27,7 +34,40 @@ export declare class Deps extends MastraBase {
|
|
|
27
34
|
}): Promise<unknown>;
|
|
28
35
|
private findPnpmWorkspaceFile;
|
|
29
36
|
private writePnpmConfig;
|
|
37
|
+
/**
|
|
38
|
+
* Resolves a declared patch path against the source workspace and verifies that, once symlinks
|
|
39
|
+
* are followed, it still resolves inside the workspace. Returns the real path to copy from, or
|
|
40
|
+
* `undefined` when the patch escapes the workspace or its file cannot be resolved.
|
|
41
|
+
*/
|
|
42
|
+
private resolvePatchSource;
|
|
43
|
+
/**
|
|
44
|
+
* Copies the patch files declared by the source workspace into the output directory and returns
|
|
45
|
+
* the patch map rewritten to output-relative paths, so the patches survive the output install.
|
|
46
|
+
*/
|
|
47
|
+
private copyPnpmPatches;
|
|
48
|
+
/**
|
|
49
|
+
* Writes the `.yarnrc.yml` for the bundled output, recording the supported architectures so the
|
|
50
|
+
* output install only resolves optional native binaries that match the deployment target.
|
|
51
|
+
*/
|
|
30
52
|
private writeYarnConfig;
|
|
53
|
+
/**
|
|
54
|
+
* Copies the source workspace's `.yarn/patches/` directory (Yarn Berry) into the output
|
|
55
|
+
* directory so patches survive the output install. Yarn auto-discovers patches from this
|
|
56
|
+
* directory and applies them per the lockfile references.
|
|
57
|
+
*/
|
|
58
|
+
private copyYarnPatches;
|
|
59
|
+
/**
|
|
60
|
+
* Copies the patch files referenced by the source workspace's `patchedDependencies` in
|
|
61
|
+
* package.json into the output directory and returns the map rewritten to output-relative
|
|
62
|
+
* paths, so bun patches survive the output install.
|
|
63
|
+
*/
|
|
64
|
+
private copyBunPatches;
|
|
65
|
+
/**
|
|
66
|
+
* Reads `patchedDependencies` from the source package.json, copies the referenced patch
|
|
67
|
+
* files into the output directory, and writes the output-relative patch map into the
|
|
68
|
+
* output's package.json so `bun install` preserves patches in the bundled output.
|
|
69
|
+
*/
|
|
70
|
+
private copyBunPatchesToOutput;
|
|
31
71
|
private getNpmArgs;
|
|
32
72
|
/**
|
|
33
73
|
* Depending on whether we want to install or add a package, this function returns the appropriate commands.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/services/deps.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAgB/C,UAAU,mBAAmB;IAC3B,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,UAAU,cAAe,SAAQ,mBAAmB;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,cAAc,CAAC,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/services/deps.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAgB/C,UAAU,mBAAmB;IAC3B,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,UAAU,cAAe,SAAQ,mBAAmB;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9C;AAyBD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBpE;AA6CD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBnF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,UAyErF;AAED,qBAAa,IAAK,SAAQ,UAAU;IAClC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAsB;gBAE1B,OAAO,SAAgB;IAQnC,OAAO,CAAC,YAAY;IAoBb,0BAA0B,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAI/E,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IA6BlH,OAAO,CAAC,qBAAqB;YAcf,eAAe;IAiB7B;;;;OAIG;YACW,kBAAkB;IAmChC;;;OAGG;YACW,eAAe;IA+B7B;;;OAGG;YACW,eAAe;IAkB7B;;;;OAIG;YACW,eAAe;IAQ7B;;;;OAIG;YACW,cAAc;IA8B5B;;;;OAIG;YACW,sBAAsB;IAsBpC,OAAO,CAAC,UAAU;IAQlB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAmBnB,OAAO,CAAC,EACnB,GAAkB,EAClB,YAAY,EACZ,aAAa,EACb,cAAc,GACf,GAAE;QACD,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,YAAY,CAAC,EAAE,mBAAmB,CAAC;QACnC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,cAAc,CAAC,EAAE,SAAS,CAAC;KACvB;IA4EO,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE;IAwBlC,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAwB1D,cAAc;IAUd,iBAAiB;IASjB,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAQrE;AAED,qBAAa,WAAY,SAAQ,IAAI;CAAG"}
|
package/dist/services/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_services = require("../services-
|
|
2
|
+
const require_services = require("../services-m8tlZVRv.cjs");
|
|
3
3
|
exports.DepsService = require_services.DepsService;
|
|
4
4
|
exports.EnvService = require_services.EnvService;
|
|
5
5
|
exports.FileService = require_services.FileService;
|
package/dist/services/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as DepsService, n as EnvService, t as FileService } from "../services-
|
|
1
|
+
import { i as DepsService, n as EnvService, t as FileService } from "../services-D_C2Onjo.js";
|
|
2
2
|
export { DepsService, EnvService, FileService };
|
|
@@ -84,6 +84,8 @@ function createChildProcessLogger({ logger, root }) {
|
|
|
84
84
|
}
|
|
85
85
|
//#endregion
|
|
86
86
|
//#region src/services/deps.ts
|
|
87
|
+
const PNPM_PATCHES_DIR = "pnpm-patches";
|
|
88
|
+
const BUN_PATCHES_DIR = "bun-patches";
|
|
87
89
|
const PNPM_CONFIG_KEYS_TO_COPY = /* @__PURE__ */ new Set([
|
|
88
90
|
"allowBuilds",
|
|
89
91
|
"onlyBuiltDependencies",
|
|
@@ -139,6 +141,23 @@ function validatePnpmBuildApprovals(key, block) {
|
|
|
139
141
|
text: `Invalid pnpm ${key} entries: ${invalidEntryNames}`
|
|
140
142
|
});
|
|
141
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Reads the `patchedDependencies` map from a pnpm workspace file. Paths are returned as declared,
|
|
146
|
+
* i.e. relative to the workspace root. Returns an empty map for absent or unusable declarations.
|
|
147
|
+
*/
|
|
148
|
+
function parsePnpmPatchedDependencies(source) {
|
|
149
|
+
let parsed;
|
|
150
|
+
try {
|
|
151
|
+
parsed = parse(source);
|
|
152
|
+
} catch {
|
|
153
|
+
return {};
|
|
154
|
+
}
|
|
155
|
+
const patched = parsed?.patchedDependencies;
|
|
156
|
+
if (!patched || typeof patched !== "object" || Array.isArray(patched)) return {};
|
|
157
|
+
const result = {};
|
|
158
|
+
for (const [key, value] of Object.entries(patched)) if (typeof value === "string" && value.trim() && key.trim()) result[key] = value.trim();
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
142
161
|
function copyPnpmWorkspaceSettings(source, options = {}) {
|
|
143
162
|
const hasArchitecture = Boolean(options.os?.length || options.cpu?.length || options.libc?.length);
|
|
144
163
|
const lines = source.split(/\r?\n/);
|
|
@@ -167,6 +186,10 @@ function copyPnpmWorkspaceSettings(source, options = {}) {
|
|
|
167
186
|
blocks.push(architectureBlock.join("\n"));
|
|
168
187
|
}
|
|
169
188
|
if (options.pnpmOverrides && Object.keys(options.pnpmOverrides).length > 0) blocks.push(["overrides:", ...Object.entries(options.pnpmOverrides).map(([key, value]) => ` ${JSON.stringify(key)}: ${JSON.stringify(value)}`)].join("\n"));
|
|
189
|
+
if (options.patchedDependencies && Object.keys(options.patchedDependencies).length > 0) {
|
|
190
|
+
blocks.push(["patchedDependencies:", ...Object.entries(options.patchedDependencies).map(([key, value]) => ` ${JSON.stringify(key)}: ${JSON.stringify(value)}`)].join("\n"));
|
|
191
|
+
blocks.push("allowUnusedPatches: true");
|
|
192
|
+
}
|
|
170
193
|
if (options.pnpmNodeLinker) blocks.push(`nodeLinker: ${options.pnpmNodeLinker}`);
|
|
171
194
|
return ["packages:\n - '.'", ...blocks].join("\n\n") + "\n";
|
|
172
195
|
}
|
|
@@ -243,8 +266,65 @@ var Deps = class extends MastraBase {
|
|
|
243
266
|
async writePnpmConfig(dir, options = {}) {
|
|
244
267
|
const sourceWorkspaceYamlPath = this.findPnpmWorkspaceFile(this.rootDir);
|
|
245
268
|
const sourceWorkspaceYaml = sourceWorkspaceYamlPath ? await fsPromises.readFile(sourceWorkspaceYamlPath, "utf-8") : "";
|
|
246
|
-
await
|
|
269
|
+
const patchedDependencies = sourceWorkspaceYamlPath ? await this.copyPnpmPatches(sourceWorkspaceYaml, path.dirname(sourceWorkspaceYamlPath), dir) : void 0;
|
|
270
|
+
await fsPromises.writeFile(path.join(dir, "pnpm-workspace.yaml"), copyPnpmWorkspaceSettings(sourceWorkspaceYaml, {
|
|
271
|
+
...options,
|
|
272
|
+
patchedDependencies
|
|
273
|
+
}), "utf-8");
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Resolves a declared patch path against the source workspace and verifies that, once symlinks
|
|
277
|
+
* are followed, it still resolves inside the workspace. Returns the real path to copy from, or
|
|
278
|
+
* `undefined` when the patch escapes the workspace or its file cannot be resolved.
|
|
279
|
+
*/
|
|
280
|
+
async resolvePatchSource(resolvedWorkspaceRoot, declaredPath, { key, label }) {
|
|
281
|
+
const sourcePath = path.resolve(resolvedWorkspaceRoot, declaredPath);
|
|
282
|
+
if (!sourcePath.startsWith(`${resolvedWorkspaceRoot}${path.sep}`)) {
|
|
283
|
+
this.logger.warn(`Skipping ${label} patch for "${key}": patch file is outside the workspace at ${sourcePath}`);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
let realWorkspaceRoot;
|
|
287
|
+
let realSourcePath;
|
|
288
|
+
try {
|
|
289
|
+
[realWorkspaceRoot, realSourcePath] = await Promise.all([fsPromises.realpath(resolvedWorkspaceRoot), fsPromises.realpath(sourcePath)]);
|
|
290
|
+
} catch {
|
|
291
|
+
this.logger.warn(`Skipping ${label} patch for "${key}": patch file not found at ${sourcePath}`);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
if (!realSourcePath.startsWith(`${realWorkspaceRoot}${path.sep}`)) {
|
|
295
|
+
this.logger.warn(`Skipping ${label} patch for "${key}": patch file is outside the workspace at ${realSourcePath}`);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
return realSourcePath;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Copies the patch files declared by the source workspace into the output directory and returns
|
|
302
|
+
* the patch map rewritten to output-relative paths, so the patches survive the output install.
|
|
303
|
+
*/
|
|
304
|
+
async copyPnpmPatches(sourceWorkspaceYaml, sourceWorkspaceRoot, dir) {
|
|
305
|
+
const declared = parsePnpmPatchedDependencies(sourceWorkspaceYaml);
|
|
306
|
+
const rewritten = {};
|
|
307
|
+
const usedFileNames = /* @__PURE__ */ new Set();
|
|
308
|
+
const resolvedWorkspaceRoot = path.resolve(sourceWorkspaceRoot);
|
|
309
|
+
for (const [key, declaredPath] of Object.entries(declared)) {
|
|
310
|
+
const sourcePath = await this.resolvePatchSource(resolvedWorkspaceRoot, declaredPath, {
|
|
311
|
+
key,
|
|
312
|
+
label: "pnpm"
|
|
313
|
+
});
|
|
314
|
+
if (!sourcePath) continue;
|
|
315
|
+
let fileName = path.basename(sourcePath);
|
|
316
|
+
if (usedFileNames.has(fileName)) fileName = `${key.replace(/[^a-zA-Z0-9._-]/g, "_")}-${fileName}`;
|
|
317
|
+
usedFileNames.add(fileName);
|
|
318
|
+
await fsPromises.mkdir(path.join(dir, PNPM_PATCHES_DIR), { recursive: true });
|
|
319
|
+
await fsPromises.copyFile(sourcePath, path.join(dir, PNPM_PATCHES_DIR, fileName));
|
|
320
|
+
rewritten[key] = `${PNPM_PATCHES_DIR}/${fileName}`;
|
|
321
|
+
}
|
|
322
|
+
return rewritten;
|
|
247
323
|
}
|
|
324
|
+
/**
|
|
325
|
+
* Writes the `.yarnrc.yml` for the bundled output, recording the supported architectures so the
|
|
326
|
+
* output install only resolves optional native binaries that match the deployment target.
|
|
327
|
+
*/
|
|
248
328
|
async writeYarnConfig(dir, options) {
|
|
249
329
|
const yarnrcPath = path.join(dir, ".yarnrc.yml");
|
|
250
330
|
const config = { supportedArchitectures: {
|
|
@@ -254,6 +334,66 @@ var Deps = class extends MastraBase {
|
|
|
254
334
|
} };
|
|
255
335
|
await fsPromises.writeFile(yarnrcPath, `supportedArchitectures:\n${Object.entries(config.supportedArchitectures).map(([key, value]) => ` ${key}: ${JSON.stringify(value)}`).join("\n")}`);
|
|
256
336
|
}
|
|
337
|
+
/**
|
|
338
|
+
* Copies the source workspace's `.yarn/patches/` directory (Yarn Berry) into the output
|
|
339
|
+
* directory so patches survive the output install. Yarn auto-discovers patches from this
|
|
340
|
+
* directory and applies them per the lockfile references.
|
|
341
|
+
*/
|
|
342
|
+
async copyYarnPatches(dir) {
|
|
343
|
+
const sourcePatchesDir = path.join(this.rootDir, ".yarn", "patches");
|
|
344
|
+
if (!fs.existsSync(sourcePatchesDir)) return;
|
|
345
|
+
const outputPatchesDir = path.join(dir, ".yarn", "patches");
|
|
346
|
+
await fsPromises.cp(sourcePatchesDir, outputPatchesDir, {
|
|
347
|
+
recursive: true,
|
|
348
|
+
errorOnExist: false
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Copies the patch files referenced by the source workspace's `patchedDependencies` in
|
|
353
|
+
* package.json into the output directory and returns the map rewritten to output-relative
|
|
354
|
+
* paths, so bun patches survive the output install.
|
|
355
|
+
*/
|
|
356
|
+
async copyBunPatches(declared, sourceRoot, dir) {
|
|
357
|
+
const rewritten = {};
|
|
358
|
+
const usedFileNames = /* @__PURE__ */ new Set();
|
|
359
|
+
const resolvedRoot = path.resolve(sourceRoot);
|
|
360
|
+
for (const [key, declaredPath] of Object.entries(declared)) {
|
|
361
|
+
const sourcePath = await this.resolvePatchSource(resolvedRoot, declaredPath, {
|
|
362
|
+
key,
|
|
363
|
+
label: "bun"
|
|
364
|
+
});
|
|
365
|
+
if (!sourcePath) continue;
|
|
366
|
+
let fileName = path.basename(sourcePath);
|
|
367
|
+
if (usedFileNames.has(fileName)) fileName = `${key.replace(/[^a-zA-Z0-9._-]/g, "_")}-${fileName}`;
|
|
368
|
+
usedFileNames.add(fileName);
|
|
369
|
+
await fsPromises.mkdir(path.join(dir, BUN_PATCHES_DIR), { recursive: true });
|
|
370
|
+
await fsPromises.copyFile(sourcePath, path.join(dir, BUN_PATCHES_DIR, fileName));
|
|
371
|
+
rewritten[key] = `${BUN_PATCHES_DIR}/${fileName}`;
|
|
372
|
+
}
|
|
373
|
+
return rewritten;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Reads `patchedDependencies` from the source package.json, copies the referenced patch
|
|
377
|
+
* files into the output directory, and writes the output-relative patch map into the
|
|
378
|
+
* output's package.json so `bun install` preserves patches in the bundled output.
|
|
379
|
+
*/
|
|
380
|
+
async copyBunPatchesToOutput(dir) {
|
|
381
|
+
const sourcePackageJsonPath = path.join(this.rootDir, "package.json");
|
|
382
|
+
if (!fs.existsSync(sourcePackageJsonPath)) return;
|
|
383
|
+
const patchedDeps = (await readJSON(sourcePackageJsonPath)).patchedDependencies;
|
|
384
|
+
if (!patchedDeps || Object.keys(patchedDeps).length === 0) return;
|
|
385
|
+
const rewritten = await this.copyBunPatches(patchedDeps, this.rootDir, dir);
|
|
386
|
+
if (Object.keys(rewritten).length === 0) return;
|
|
387
|
+
const outputPackageJsonPath = path.join(dir, "package.json");
|
|
388
|
+
let outputPkg;
|
|
389
|
+
try {
|
|
390
|
+
outputPkg = await readJSON(outputPackageJsonPath);
|
|
391
|
+
} catch {
|
|
392
|
+
outputPkg = {};
|
|
393
|
+
}
|
|
394
|
+
outputPkg.patchedDependencies = rewritten;
|
|
395
|
+
await writeJSON(outputPackageJsonPath, outputPkg, { spaces: 2 });
|
|
396
|
+
}
|
|
257
397
|
getNpmArgs(options) {
|
|
258
398
|
const args = [];
|
|
259
399
|
if (options.cpu) args.push(`--cpu=${options.cpu.join(",")}`);
|
|
@@ -298,6 +438,10 @@ var Deps = class extends MastraBase {
|
|
|
298
438
|
case "yarn":
|
|
299
439
|
await ensureFile(path.join(dir, "yarn.lock"));
|
|
300
440
|
if (architecture) await this.writeYarnConfig(dir, architecture);
|
|
441
|
+
await this.copyYarnPatches(dir);
|
|
442
|
+
break;
|
|
443
|
+
case "bun":
|
|
444
|
+
await this.copyBunPatchesToOutput(dir);
|
|
301
445
|
break;
|
|
302
446
|
case "npm":
|
|
303
447
|
if (architecture) args = this.getNpmArgs(architecture);
|
|
@@ -495,4 +639,4 @@ var FileService = class {
|
|
|
495
639
|
//#endregion
|
|
496
640
|
export { createChildProcessLogger as a, DepsService as i, EnvService as n, createPinoStream as o, Deps as r, FileService as t };
|
|
497
641
|
|
|
498
|
-
//# sourceMappingURL=services-
|
|
642
|
+
//# sourceMappingURL=services-D_C2Onjo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services-D_C2Onjo.js","names":[],"sources":["../src/deploy/log.ts","../src/services/deps.ts","../src/services/env.ts","../src/services/fs.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport { Writable } from 'node:stream';\nimport type { IMastraLogger } from '@mastra/core/logger';\n\nexport const createPinoStream = (logger: IMastraLogger) => {\n return new Writable({\n write(chunk, _encoding, callback) {\n // Convert Buffer/string to string and trim whitespace\n const line = chunk.toString().trim();\n\n if (line) {\n console.info(line);\n // Log each line through Pino\n logger.info(line);\n }\n\n callback();\n },\n });\n};\n\n/**\n * Args are joined into a shell command (`shell: true` is required for package\n * manager shims on Windows), so only allow characters that appear in package\n * specifiers and CLI flags — never shell metacharacters (CodeQL\n * js/shell-command-constructed-from-input).\n */\nconst SAFE_SHELL_ARG = /^[\\w@%+=:,./^~-]*$/;\n\nexport function createChildProcessLogger({ logger, root }: { logger: IMastraLogger; root: string }) {\n const pinoStream = createPinoStream(logger);\n return async ({ cmd, args, env }: { cmd: string; args: string[]; env: Record<string, string> }) => {\n try {\n for (const arg of args) {\n if (!SAFE_SHELL_ARG.test(arg)) {\n throw new Error(`Refusing to pass unsafe argument to shell command: ${JSON.stringify(arg)}`);\n }\n }\n const subprocess = spawn(cmd, args, {\n cwd: root,\n shell: true,\n env,\n // No stdin for the child process — it doesn't need interactive input\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n subprocess.stdout?.on('data', chunk => {\n stdout += chunk.toString();\n });\n subprocess.stderr?.on('data', chunk => {\n stderr += chunk.toString();\n });\n\n // Pipe stdout and stderr through the logging stream.\n // { end: false } prevents the first stream to close from ending pinoStream\n // while the other may still be writing.\n subprocess.stdout?.pipe(pinoStream, { end: false });\n subprocess.stderr?.pipe(pinoStream, { end: false });\n\n // Wait for the process to complete\n return new Promise((resolve, reject) => {\n subprocess.on('close', code => {\n pinoStream.end();\n if (code === 0) {\n resolve({ success: true, stdout, stderr });\n } else {\n reject(Object.assign(new Error(`Process exited with code ${code}`), { stdout, stderr }));\n }\n });\n\n subprocess.on('error', error => {\n pinoStream.end();\n logger.error('Process failed', { error });\n reject(error);\n });\n });\n } catch (error) {\n console.error(error);\n logger.error('Process failed', { error });\n pinoStream.end();\n return { success: false, error };\n }\n };\n}\n","import fs from 'node:fs';\nimport fsPromises from 'node:fs/promises';\nimport path, { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { readJSON, writeJSON, ensureFile } from 'fs-extra/esm';\nimport type { PackageJson } from 'type-fest';\nimport { parse } from 'yaml';\n\nimport { createChildProcessLogger } from '../deploy/log.js';\n\ntype PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\ninterface LockFileInfo {\n path: string;\n filename: string;\n packageManager: PackageManager;\n}\n\ninterface ArchitectureOptions {\n os?: string[];\n cpu?: string[];\n libc?: string[];\n}\n\ninterface InstallOptions extends ArchitectureOptions {\n pnpmOverrides?: Record<string, string>;\n pnpmNodeLinker?: 'hoisted';\n /** Patch key -> path relative to the output directory. */\n patchedDependencies?: Record<string, string>;\n}\n\nconst PNPM_PATCHES_DIR = 'pnpm-patches';\nconst BUN_PATCHES_DIR = 'bun-patches';\n\nconst PNPM_CONFIG_KEYS_TO_COPY = new Set([\n 'allowBuilds',\n 'onlyBuiltDependencies',\n 'ignoredBuiltDependencies',\n 'neverBuiltDependencies',\n 'minimumReleaseAge',\n 'minimumReleaseAgeExclude',\n 'trustPolicy',\n 'trustPolicyExclude',\n 'trustPolicyIgnoreAfter',\n 'supportedArchitectures',\n]);\n\nfunction getTopLevelYamlKey(line: string) {\n const match = /^(?!\\s)([\\w-]+):/.exec(line);\n return match?.[1];\n}\n\nconst PNPM_IGNORED_BUILDS_ERROR = 'ERR_PNPM_IGNORED_BUILDS';\n\nexport function getPnpmIgnoredBuildPackages(output: string): string[] {\n const match = new RegExp(`\\\\[?${PNPM_IGNORED_BUILDS_ERROR}\\\\]?[^\\\\n]*Ignored build scripts:\\\\s*([^\\\\n]+)`).exec(\n output,\n );\n if (!match?.[1]) return [];\n\n return match[1]\n .split(',')\n .map(specifier => specifier.trim())\n .filter(Boolean)\n .map(specifier => {\n if (specifier.startsWith('@')) {\n const versionSeparator = specifier.indexOf('@', 1);\n return versionSeparator === -1 ? specifier : specifier.slice(0, versionSeparator);\n }\n return specifier.split('@', 1)[0]!;\n });\n}\n\nfunction validatePnpmBuildApprovals(key: string, block: string): void {\n if (key !== 'allowBuilds' && key !== 'onlyBuiltDependencies') return;\n\n let value: unknown;\n try {\n value = (parse(block) as Record<string, unknown>)[key];\n } catch (error) {\n throw new MastraError(\n {\n id: 'DEPLOYER_INVALID_PNPM_BUILD_APPROVAL_CONFIG',\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.USER,\n details: { key },\n text: `Invalid pnpm ${key} configuration`,\n },\n error,\n );\n }\n\n const invalidEntries =\n key === 'allowBuilds'\n ? value && typeof value === 'object' && !Array.isArray(value)\n ? Object.entries(value).filter(\n ([dependency, approval]) => dependency.trim().length === 0 || typeof approval !== 'boolean',\n )\n : [[key, value]]\n : Array.isArray(value) &&\n value.every(dependency => typeof dependency === 'string' && dependency.trim().length > 0)\n ? []\n : [[key, value]];\n\n if (invalidEntries.length === 0) return;\n const invalidEntryNames = invalidEntries.map(([entry]) => entry).join(', ');\n\n throw new MastraError({\n id: 'DEPLOYER_INVALID_PNPM_BUILD_APPROVAL_CONFIG',\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.USER,\n details: { key, invalidEntries: invalidEntryNames },\n text: `Invalid pnpm ${key} entries: ${invalidEntryNames}`,\n });\n}\n\n/**\n * Reads the `patchedDependencies` map from a pnpm workspace file. Paths are returned as declared,\n * i.e. relative to the workspace root. Returns an empty map for absent or unusable declarations.\n */\nexport function parsePnpmPatchedDependencies(source: string): Record<string, string> {\n let parsed: unknown;\n try {\n parsed = parse(source);\n } catch {\n return {};\n }\n\n const patched = (parsed as { patchedDependencies?: unknown } | null)?.patchedDependencies;\n if (!patched || typeof patched !== 'object' || Array.isArray(patched)) {\n return {};\n }\n\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(patched as Record<string, unknown>)) {\n if (typeof value === 'string' && value.trim() && key.trim()) {\n result[key] = value.trim();\n }\n }\n\n return result;\n}\n\nexport function copyPnpmWorkspaceSettings(source: string, options: InstallOptions = {}) {\n const hasArchitecture = Boolean(options.os?.length || options.cpu?.length || options.libc?.length);\n const lines = source.split(/\\r?\\n/);\n const blocks: string[] = [];\n\n for (let index = 0; index < lines.length;) {\n const key = getTopLevelYamlKey(lines[index] ?? '');\n if (!key) {\n index += 1;\n continue;\n }\n\n const start = index;\n index += 1;\n while (index < lines.length && !getTopLevelYamlKey(lines[index] ?? '')) {\n index += 1;\n }\n\n if (!PNPM_CONFIG_KEYS_TO_COPY.has(key) || (key === 'supportedArchitectures' && hasArchitecture)) {\n continue;\n }\n\n const block = lines.slice(start, index).join('\\n').trimEnd();\n if (block) {\n validatePnpmBuildApprovals(key, block);\n blocks.push(block);\n }\n }\n\n if (hasArchitecture) {\n const architectureBlock = ['supportedArchitectures:'];\n if (options.os?.length) {\n architectureBlock.push(` os: ${JSON.stringify(options.os)}`);\n }\n if (options.cpu?.length) {\n architectureBlock.push(` cpu: ${JSON.stringify(options.cpu)}`);\n }\n if (options.libc?.length) {\n architectureBlock.push(` libc: ${JSON.stringify(options.libc)}`);\n }\n blocks.push(architectureBlock.join('\\n'));\n }\n\n if (options.pnpmOverrides && Object.keys(options.pnpmOverrides).length > 0) {\n blocks.push(\n [\n 'overrides:',\n ...Object.entries(options.pnpmOverrides).map(\n ([key, value]) => ` ${JSON.stringify(key)}: ${JSON.stringify(value)}`,\n ),\n ].join('\\n'),\n );\n }\n\n if (options.patchedDependencies && Object.keys(options.patchedDependencies).length > 0) {\n blocks.push(\n [\n 'patchedDependencies:',\n ...Object.entries(options.patchedDependencies).map(\n ([key, value]) => ` ${JSON.stringify(key)}: ${JSON.stringify(value)}`,\n ),\n ].join('\\n'),\n );\n // The bundled output only installs runtime dependencies, so patches declared for\n // dev-only or bundled-away packages are legitimately unused here.\n blocks.push('allowUnusedPatches: true');\n }\n\n if (options.pnpmNodeLinker) {\n blocks.push(`nodeLinker: ${options.pnpmNodeLinker}`);\n }\n\n return [\"packages:\\n - '.'\", ...blocks].join('\\n\\n') + '\\n';\n}\n\nexport class Deps extends MastraBase {\n private packageManager: PackageManager;\n private rootDir: string;\n private lockFile: LockFileInfo | null;\n\n constructor(rootDir = process.cwd()) {\n super({ component: 'DEPLOYER', name: 'DEPS' });\n\n this.rootDir = rootDir;\n this.lockFile = this.findLockFile(rootDir);\n this.packageManager = this.lockFile?.packageManager ?? 'npm';\n }\n\n private findLockFile(dir: string): LockFileInfo | null {\n const lockFiles: Array<{ filename: string; packageManager: PackageManager }> = [\n { filename: 'pnpm-lock.yaml', packageManager: 'pnpm' },\n { filename: 'package-lock.json', packageManager: 'npm' },\n { filename: 'yarn.lock', packageManager: 'yarn' },\n { filename: 'bun.lock', packageManager: 'bun' },\n ];\n for (const lockFile of lockFiles) {\n const lockFilePath = path.join(dir, lockFile.filename);\n if (fs.existsSync(lockFilePath)) {\n return { ...lockFile, path: lockFilePath };\n }\n }\n const parentDir = path.resolve(dir, '..');\n if (parentDir !== dir) {\n return this.findLockFile(parentDir);\n }\n return null;\n }\n\n public getWorkspaceDependencyPath({ pkgName, version }: { pkgName: string; version: string }) {\n return `file:./workspace-module/${pkgName}-${version}.tgz`;\n }\n\n public async pack({ dir, destination, sanitizedName }: { dir: string; destination: string; sanitizedName: string }) {\n const cpLogger = createChildProcessLogger({\n logger: this.logger,\n root: dir,\n });\n\n let packCmd = 'pack';\n let destinationFlag = `--pack-destination ${destination}`;\n if (this.packageManager === 'yarn') {\n // %s includes an '@' at the start of packages names with an '@'\n // so we need to use our sanitizedName instead.\n destinationFlag = `--out ${destination}/${sanitizedName}-%v.tgz`;\n }\n if (this.packageManager === 'bun') {\n // bun uses `pm pack` instead of `pack`\n packCmd = 'pm pack';\n // bun uses --destination instead of --pack-destination\n destinationFlag = `--destination ${destination}`;\n }\n\n return cpLogger({\n cmd: `${this.packageManager} ${packCmd} ${destinationFlag}`,\n args: [],\n env: {\n PATH: process.env.PATH!,\n },\n });\n }\n\n private findPnpmWorkspaceFile(dir: string): string | null {\n const workspaceYamlPath = path.join(dir, 'pnpm-workspace.yaml');\n if (fs.existsSync(workspaceYamlPath)) {\n return workspaceYamlPath;\n }\n\n const parentDir = path.resolve(dir, '..');\n if (parentDir !== dir) {\n return this.findPnpmWorkspaceFile(parentDir);\n }\n\n return null;\n }\n\n private async writePnpmConfig(dir: string, options: InstallOptions = {}) {\n const sourceWorkspaceYamlPath = this.findPnpmWorkspaceFile(this.rootDir);\n const sourceWorkspaceYaml = sourceWorkspaceYamlPath\n ? await fsPromises.readFile(sourceWorkspaceYamlPath, 'utf-8')\n : '';\n\n const patchedDependencies = sourceWorkspaceYamlPath\n ? await this.copyPnpmPatches(sourceWorkspaceYaml, path.dirname(sourceWorkspaceYamlPath), dir)\n : undefined;\n\n await fsPromises.writeFile(\n path.join(dir, 'pnpm-workspace.yaml'),\n copyPnpmWorkspaceSettings(sourceWorkspaceYaml, { ...options, patchedDependencies }),\n 'utf-8',\n );\n }\n\n /**\n * Resolves a declared patch path against the source workspace and verifies that, once symlinks\n * are followed, it still resolves inside the workspace. Returns the real path to copy from, or\n * `undefined` when the patch escapes the workspace or its file cannot be resolved.\n */\n private async resolvePatchSource(\n resolvedWorkspaceRoot: string,\n declaredPath: string,\n { key, label }: { key: string; label: string },\n ): Promise<string | undefined> {\n const sourcePath = path.resolve(resolvedWorkspaceRoot, declaredPath);\n if (!sourcePath.startsWith(`${resolvedWorkspaceRoot}${path.sep}`)) {\n this.logger.warn(`Skipping ${label} patch for \"${key}\": patch file is outside the workspace at ${sourcePath}`);\n return undefined;\n }\n\n // A patch path can stay lexically under the workspace while traversing a symlink whose target\n // lives outside it. copyFile follows symlinks, so compare the resolved real paths before copying.\n let realWorkspaceRoot: string;\n let realSourcePath: string;\n try {\n [realWorkspaceRoot, realSourcePath] = await Promise.all([\n fsPromises.realpath(resolvedWorkspaceRoot),\n fsPromises.realpath(sourcePath),\n ]);\n } catch {\n this.logger.warn(`Skipping ${label} patch for \"${key}\": patch file not found at ${sourcePath}`);\n return undefined;\n }\n\n if (!realSourcePath.startsWith(`${realWorkspaceRoot}${path.sep}`)) {\n this.logger.warn(\n `Skipping ${label} patch for \"${key}\": patch file is outside the workspace at ${realSourcePath}`,\n );\n return undefined;\n }\n\n return realSourcePath;\n }\n\n /**\n * Copies the patch files declared by the source workspace into the output directory and returns\n * the patch map rewritten to output-relative paths, so the patches survive the output install.\n */\n private async copyPnpmPatches(\n sourceWorkspaceYaml: string,\n sourceWorkspaceRoot: string,\n dir: string,\n ): Promise<Record<string, string>> {\n const declared = parsePnpmPatchedDependencies(sourceWorkspaceYaml);\n const rewritten: Record<string, string> = {};\n const usedFileNames = new Set<string>();\n const resolvedWorkspaceRoot = path.resolve(sourceWorkspaceRoot);\n\n for (const [key, declaredPath] of Object.entries(declared)) {\n const sourcePath = await this.resolvePatchSource(resolvedWorkspaceRoot, declaredPath, {\n key,\n label: 'pnpm',\n });\n if (!sourcePath) continue;\n\n let fileName = path.basename(sourcePath);\n if (usedFileNames.has(fileName)) {\n fileName = `${key.replace(/[^a-zA-Z0-9._-]/g, '_')}-${fileName}`;\n }\n usedFileNames.add(fileName);\n\n await fsPromises.mkdir(path.join(dir, PNPM_PATCHES_DIR), { recursive: true });\n await fsPromises.copyFile(sourcePath, path.join(dir, PNPM_PATCHES_DIR, fileName));\n rewritten[key] = `${PNPM_PATCHES_DIR}/${fileName}`;\n }\n\n return rewritten;\n }\n\n /**\n * Writes the `.yarnrc.yml` for the bundled output, recording the supported architectures so the\n * output install only resolves optional native binaries that match the deployment target.\n */\n private async writeYarnConfig(dir: string, options: ArchitectureOptions) {\n const yarnrcPath = path.join(dir, '.yarnrc.yml');\n const config = {\n supportedArchitectures: {\n cpu: options.cpu || [],\n os: options.os || [],\n libc: options.libc || [],\n },\n };\n\n await fsPromises.writeFile(\n yarnrcPath,\n `supportedArchitectures:\\n${Object.entries(config.supportedArchitectures)\n .map(([key, value]) => ` ${key}: ${JSON.stringify(value)}`)\n .join('\\n')}`,\n );\n }\n\n /**\n * Copies the source workspace's `.yarn/patches/` directory (Yarn Berry) into the output\n * directory so patches survive the output install. Yarn auto-discovers patches from this\n * directory and applies them per the lockfile references.\n */\n private async copyYarnPatches(dir: string): Promise<void> {\n const sourcePatchesDir = path.join(this.rootDir, '.yarn', 'patches');\n if (!fs.existsSync(sourcePatchesDir)) return;\n\n const outputPatchesDir = path.join(dir, '.yarn', 'patches');\n await fsPromises.cp(sourcePatchesDir, outputPatchesDir, { recursive: true, errorOnExist: false });\n }\n\n /**\n * Copies the patch files referenced by the source workspace's `patchedDependencies` in\n * package.json into the output directory and returns the map rewritten to output-relative\n * paths, so bun patches survive the output install.\n */\n private async copyBunPatches(\n declared: Record<string, string>,\n sourceRoot: string,\n dir: string,\n ): Promise<Record<string, string>> {\n const rewritten: Record<string, string> = {};\n const usedFileNames = new Set<string>();\n const resolvedRoot = path.resolve(sourceRoot);\n\n for (const [key, declaredPath] of Object.entries(declared)) {\n const sourcePath = await this.resolvePatchSource(resolvedRoot, declaredPath, {\n key,\n label: 'bun',\n });\n if (!sourcePath) continue;\n\n let fileName = path.basename(sourcePath);\n if (usedFileNames.has(fileName)) {\n fileName = `${key.replace(/[^a-zA-Z0-9._-]/g, '_')}-${fileName}`;\n }\n usedFileNames.add(fileName);\n\n await fsPromises.mkdir(path.join(dir, BUN_PATCHES_DIR), { recursive: true });\n await fsPromises.copyFile(sourcePath, path.join(dir, BUN_PATCHES_DIR, fileName));\n rewritten[key] = `${BUN_PATCHES_DIR}/${fileName}`;\n }\n\n return rewritten;\n }\n\n /**\n * Reads `patchedDependencies` from the source package.json, copies the referenced patch\n * files into the output directory, and writes the output-relative patch map into the\n * output's package.json so `bun install` preserves patches in the bundled output.\n */\n private async copyBunPatchesToOutput(dir: string): Promise<void> {\n const sourcePackageJsonPath = path.join(this.rootDir, 'package.json');\n if (!fs.existsSync(sourcePackageJsonPath)) return;\n\n const sourcePkg = await readJSON(sourcePackageJsonPath);\n const patchedDeps = sourcePkg.patchedDependencies as Record<string, string> | undefined;\n if (!patchedDeps || Object.keys(patchedDeps).length === 0) return;\n\n const rewritten = await this.copyBunPatches(patchedDeps, this.rootDir, dir);\n if (Object.keys(rewritten).length === 0) return;\n\n const outputPackageJsonPath = path.join(dir, 'package.json');\n let outputPkg: Record<string, unknown>;\n try {\n outputPkg = (await readJSON(outputPackageJsonPath)) as Record<string, unknown>;\n } catch {\n outputPkg = {};\n }\n outputPkg.patchedDependencies = rewritten;\n await writeJSON(outputPackageJsonPath, outputPkg, { spaces: 2 });\n }\n\n private getNpmArgs(options: ArchitectureOptions): string[] {\n const args: string[] = [];\n if (options.cpu) args.push(`--cpu=${options.cpu.join(',')}`);\n if (options.os) args.push(`--os=${options.os.join(',')}`);\n if (options.libc) args.push(`--libc=${options.libc.join(',')}`);\n return args;\n }\n\n /**\n * Depending on whether we want to install or add a package, this function returns the appropriate commands.\n * All package managers support both commands (e.g. npm install has an alias on \"add\")\n */\n private getPackageManagerCommand(\n pm: PackageManager,\n type: 'install' | 'add',\n { yarnClassic = false }: { yarnClassic?: boolean } = {},\n ): string {\n const cmd = type === 'install' ? 'install' : 'add';\n\n switch (pm) {\n case 'npm':\n return `${cmd} --audit=false --fund=false --loglevel=error --progress=false --update-notifier=false`;\n case 'yarn':\n return type === 'install' && !yarnClassic ? `${cmd} --no-immutable` : cmd;\n case 'pnpm':\n return type === 'install' ? `${cmd} --no-frozen-lockfile --loglevel=error` : `${cmd} --loglevel=error`;\n default:\n return cmd;\n }\n }\n\n public async install({\n dir = this.rootDir,\n architecture,\n pnpmOverrides,\n pnpmNodeLinker,\n }: {\n dir?: string;\n architecture?: ArchitectureOptions;\n pnpmOverrides?: Record<string, string>;\n pnpmNodeLinker?: 'hoisted';\n } = {}) {\n const pm = this.packageManager;\n let yarnClassic = false;\n if (this.lockFile) {\n const destination = path.join(dir, this.lockFile.filename);\n if (path.resolve(this.lockFile.path) !== path.resolve(destination)) {\n await fsPromises.copyFile(this.lockFile.path, destination);\n }\n\n if (pm === 'yarn') {\n const lockfileContents = await fsPromises.readFile(destination, 'utf-8');\n yarnClassic = /^# yarn lockfile v1\\r?$/m.test(lockfileContents);\n }\n }\n\n const installCommand = this.getPackageManagerCommand(pm, 'install', { yarnClassic });\n let args: string[] = [];\n\n switch (pm) {\n case 'pnpm':\n await this.writePnpmConfig(dir, { ...architecture, pnpmOverrides, pnpmNodeLinker });\n break;\n case 'yarn':\n // similar to --ignore-workspace but for yarn\n await ensureFile(path.join(dir, 'yarn.lock'));\n if (architecture) {\n await this.writeYarnConfig(dir, architecture);\n }\n await this.copyYarnPatches(dir);\n break;\n case 'bun':\n await this.copyBunPatchesToOutput(dir);\n break;\n case 'npm':\n if (architecture) {\n args = this.getNpmArgs(architecture);\n }\n break;\n default:\n // Do nothing\n }\n\n const cpLogger = createChildProcessLogger({\n logger: this.logger,\n root: dir,\n });\n\n try {\n return await cpLogger({\n cmd: `${pm} ${installCommand}`,\n args,\n env: process.env as Record<string, string>,\n });\n } catch (error) {\n if (pm !== 'pnpm') throw error;\n\n const processOutput =\n error && typeof error === 'object'\n ? `${'stdout' in error ? String(error.stdout) : ''}\\n${'stderr' in error ? String(error.stderr) : ''}`\n : '';\n const ignoredPackages = getPnpmIgnoredBuildPackages(processOutput);\n if (ignoredPackages.length === 0) throw error;\n\n throw new MastraError(\n {\n id: 'DEPLOYER_PNPM_IGNORED_BUILDS',\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.USER,\n details: { packageNames: ignoredPackages.join(', ') },\n text: `pnpm blocked build scripts for: ${ignoredPackages.join(', ')}. Add these packages to allowBuilds in pnpm-workspace.yaml and retry the build.`,\n },\n error,\n );\n }\n }\n\n public async installPackages(packages: string[]) {\n const pm = this.packageManager;\n const installCommand = this.getPackageManagerCommand(pm, 'add');\n\n const env: Record<string, string> = {\n PATH: process.env.PATH!,\n };\n\n if (process.env.npm_config_registry) {\n env.npm_config_registry = process.env.npm_config_registry;\n }\n\n const cpLogger = createChildProcessLogger({\n logger: this.logger,\n root: '',\n });\n\n return cpLogger({\n cmd: `${pm} ${installCommand}`,\n args: packages,\n env,\n });\n }\n\n public async checkDependencies(dependencies: string[]): Promise<string> {\n try {\n const packageJsonPath = path.join(this.rootDir, 'package.json');\n\n try {\n await fsPromises.access(packageJsonPath);\n } catch {\n return 'No package.json file found in the current directory';\n }\n\n const packageJson = await readJSON(packageJsonPath);\n for (const dependency of dependencies) {\n if (!packageJson.dependencies || !packageJson.dependencies[dependency]) {\n return `Please install ${dependency} before running this command (${this.packageManager} install ${dependency})`;\n }\n }\n\n return 'ok';\n } catch (err) {\n console.error(err);\n return 'Could not check dependencies';\n }\n }\n\n public async getProjectName() {\n try {\n const packageJsonPath = path.join(this.rootDir, 'package.json');\n const pkg = await readJSON(packageJsonPath);\n return pkg.name;\n } catch (err) {\n throw err;\n }\n }\n\n public async getPackageVersion() {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const pkgJsonPath = path.join(__dirname, '..', '..', 'package.json');\n\n const content = (await readJSON(pkgJsonPath)) as PackageJson;\n return content.version;\n }\n\n public async addScriptsToPackageJson(scripts: Record<string, string>) {\n const packageJson = await readJSON('package.json');\n packageJson.scripts = {\n ...packageJson.scripts,\n ...scripts,\n };\n await writeJSON('package.json', packageJson, { spaces: 2 });\n }\n}\n\nexport class DepsService extends Deps {}\n","import * as fs from 'node:fs';\n\nexport abstract class EnvService {\n abstract getEnvValue(key: string): Promise<string | null>;\n abstract setEnvValue(key: string, value: string): Promise<void>;\n}\n\nexport class FileEnvService extends EnvService {\n private filePath: string;\n\n constructor(filePath: string) {\n super();\n this.filePath = filePath;\n }\n\n private readFile(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n fs.readFile(filePath, 'utf8', (err: NodeJS.ErrnoException | null, data: string) => {\n if (err) reject(err);\n else resolve(data);\n });\n });\n }\n\n private writeFile({ filePath, data }: { filePath: string; data: string }): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.writeFile(filePath, data, 'utf8', (err: NodeJS.ErrnoException | null) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n private async updateEnvData({\n key,\n value,\n filePath = this.filePath,\n data,\n }: {\n key: string;\n value: string;\n filePath?: string;\n data: string;\n }): Promise<string> {\n const regex = new RegExp(`^${key}=.*$`, 'm');\n if (data.match(regex)) {\n // Use a replacement function so `$` sequences in the value (e.g. `$&`,\n // `$$`) are written literally instead of being interpreted as\n // String.prototype.replace special patterns.\n data = data.replace(regex, () => `${key}=${value}`);\n } else {\n data += `\\n${key}=${value}`;\n }\n await this.writeFile({ filePath, data });\n console.info(`${key} set to ${value} in ENV file.`);\n return data;\n }\n\n async getEnvValue(key: string): Promise<string | null> {\n try {\n const data = await this.readFile(this.filePath);\n const regex = new RegExp(`^${key}=(.*)$`, 'm');\n const match = data.match(regex);\n return match?.[1] || null;\n } catch (err) {\n console.error(`Error reading ENV value: ${err}`);\n return null;\n }\n }\n\n async setEnvValue(key: string, value: string): Promise<void> {\n try {\n const data = await this.readFile(this.filePath);\n await this.updateEnvData({ key, value, data });\n } catch (err) {\n console.error(`Error writing ENV value: ${err}`);\n }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport fsExtra from 'fs-extra/esm';\n\nimport { FileEnvService } from './env.js';\n\nexport class FileService {\n /**\n *\n * @param inputFile the file in the starter files directory to copy\n * @param outputFilePath the destination path\n * @param replaceIfExists flag to replace if it exists\n * @returns\n */\n public async copyStarterFile(inputFile: string, outputFilePath: string, replaceIfExists?: boolean) {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const filePath = path.resolve(__dirname, '..', 'starter-files', inputFile);\n const fileString = fs.readFileSync(filePath, 'utf8');\n\n if (fs.existsSync(outputFilePath) && !replaceIfExists) {\n console.info(`${outputFilePath} already exists`);\n return false;\n }\n\n await fsExtra.outputFile(outputFilePath, fileString);\n\n return true;\n }\n\n public async setupEnvFile({ dbUrl }: { dbUrl: string }) {\n const envPath = path.join(process.cwd(), '.env.development');\n\n await fsExtra.ensureFile(envPath);\n\n const fileEnvService = new FileEnvService(envPath);\n await fileEnvService.setEnvValue('DB_URL', dbUrl);\n }\n\n public getFirstExistingFile(files: string[]): string {\n for (const f of files) {\n if (fs.existsSync(f)) {\n return f;\n }\n }\n\n throw new Error('Missing required file, checked the following paths: ' + files.join(', '));\n }\n\n /**\n * Returns every existing file from the provided array in the same order.\n * Callers supply files from the lowest to highest precedence so later dotenv\n * files override earlier values when the bundler loads them.\n */\n public getExistingFiles(files: string[]): string[] {\n return files.filter(file => fs.existsSync(file));\n }\n\n /**\n * Returns the first existing file from the provided array, or undefined if none exist\n * @param files array of file paths to check\n * @returns the first existing file path or undefined\n */\n public getFirstExistingFileOrUndefined(files: string[]): string | undefined {\n for (const f of files) {\n if (fs.existsSync(f)) {\n return f;\n }\n }\n\n return undefined;\n }\n\n public replaceValuesInFile({\n filePath,\n replacements,\n }: {\n filePath: string;\n replacements: { search: string; replace: string }[];\n }) {\n let fileContent = fs.readFileSync(filePath, 'utf8');\n replacements.forEach(({ search, replace }) => {\n fileContent = fileContent.replaceAll(search, replace);\n });\n\n fs.writeFileSync(filePath, fileContent);\n }\n}\n"],"mappings":"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"}
|
|
@@ -88,6 +88,8 @@ function createChildProcessLogger({ logger, root }) {
|
|
|
88
88
|
}
|
|
89
89
|
//#endregion
|
|
90
90
|
//#region src/services/deps.ts
|
|
91
|
+
const PNPM_PATCHES_DIR = "pnpm-patches";
|
|
92
|
+
const BUN_PATCHES_DIR = "bun-patches";
|
|
91
93
|
const PNPM_CONFIG_KEYS_TO_COPY = /* @__PURE__ */ new Set([
|
|
92
94
|
"allowBuilds",
|
|
93
95
|
"onlyBuiltDependencies",
|
|
@@ -143,6 +145,23 @@ function validatePnpmBuildApprovals(key, block) {
|
|
|
143
145
|
text: `Invalid pnpm ${key} entries: ${invalidEntryNames}`
|
|
144
146
|
});
|
|
145
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Reads the `patchedDependencies` map from a pnpm workspace file. Paths are returned as declared,
|
|
150
|
+
* i.e. relative to the workspace root. Returns an empty map for absent or unusable declarations.
|
|
151
|
+
*/
|
|
152
|
+
function parsePnpmPatchedDependencies(source) {
|
|
153
|
+
let parsed;
|
|
154
|
+
try {
|
|
155
|
+
parsed = (0, yaml.parse)(source);
|
|
156
|
+
} catch {
|
|
157
|
+
return {};
|
|
158
|
+
}
|
|
159
|
+
const patched = parsed?.patchedDependencies;
|
|
160
|
+
if (!patched || typeof patched !== "object" || Array.isArray(patched)) return {};
|
|
161
|
+
const result = {};
|
|
162
|
+
for (const [key, value] of Object.entries(patched)) if (typeof value === "string" && value.trim() && key.trim()) result[key] = value.trim();
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
146
165
|
function copyPnpmWorkspaceSettings(source, options = {}) {
|
|
147
166
|
const hasArchitecture = Boolean(options.os?.length || options.cpu?.length || options.libc?.length);
|
|
148
167
|
const lines = source.split(/\r?\n/);
|
|
@@ -171,6 +190,10 @@ function copyPnpmWorkspaceSettings(source, options = {}) {
|
|
|
171
190
|
blocks.push(architectureBlock.join("\n"));
|
|
172
191
|
}
|
|
173
192
|
if (options.pnpmOverrides && Object.keys(options.pnpmOverrides).length > 0) blocks.push(["overrides:", ...Object.entries(options.pnpmOverrides).map(([key, value]) => ` ${JSON.stringify(key)}: ${JSON.stringify(value)}`)].join("\n"));
|
|
193
|
+
if (options.patchedDependencies && Object.keys(options.patchedDependencies).length > 0) {
|
|
194
|
+
blocks.push(["patchedDependencies:", ...Object.entries(options.patchedDependencies).map(([key, value]) => ` ${JSON.stringify(key)}: ${JSON.stringify(value)}`)].join("\n"));
|
|
195
|
+
blocks.push("allowUnusedPatches: true");
|
|
196
|
+
}
|
|
174
197
|
if (options.pnpmNodeLinker) blocks.push(`nodeLinker: ${options.pnpmNodeLinker}`);
|
|
175
198
|
return ["packages:\n - '.'", ...blocks].join("\n\n") + "\n";
|
|
176
199
|
}
|
|
@@ -247,8 +270,65 @@ var Deps = class extends _mastra_core_base.MastraBase {
|
|
|
247
270
|
async writePnpmConfig(dir, options = {}) {
|
|
248
271
|
const sourceWorkspaceYamlPath = this.findPnpmWorkspaceFile(this.rootDir);
|
|
249
272
|
const sourceWorkspaceYaml = sourceWorkspaceYamlPath ? await fs_promises.default.readFile(sourceWorkspaceYamlPath, "utf-8") : "";
|
|
250
|
-
await
|
|
273
|
+
const patchedDependencies = sourceWorkspaceYamlPath ? await this.copyPnpmPatches(sourceWorkspaceYaml, path.default.dirname(sourceWorkspaceYamlPath), dir) : void 0;
|
|
274
|
+
await fs_promises.default.writeFile(path.default.join(dir, "pnpm-workspace.yaml"), copyPnpmWorkspaceSettings(sourceWorkspaceYaml, {
|
|
275
|
+
...options,
|
|
276
|
+
patchedDependencies
|
|
277
|
+
}), "utf-8");
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Resolves a declared patch path against the source workspace and verifies that, once symlinks
|
|
281
|
+
* are followed, it still resolves inside the workspace. Returns the real path to copy from, or
|
|
282
|
+
* `undefined` when the patch escapes the workspace or its file cannot be resolved.
|
|
283
|
+
*/
|
|
284
|
+
async resolvePatchSource(resolvedWorkspaceRoot, declaredPath, { key, label }) {
|
|
285
|
+
const sourcePath = path.default.resolve(resolvedWorkspaceRoot, declaredPath);
|
|
286
|
+
if (!sourcePath.startsWith(`${resolvedWorkspaceRoot}${path.default.sep}`)) {
|
|
287
|
+
this.logger.warn(`Skipping ${label} patch for "${key}": patch file is outside the workspace at ${sourcePath}`);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
let realWorkspaceRoot;
|
|
291
|
+
let realSourcePath;
|
|
292
|
+
try {
|
|
293
|
+
[realWorkspaceRoot, realSourcePath] = await Promise.all([fs_promises.default.realpath(resolvedWorkspaceRoot), fs_promises.default.realpath(sourcePath)]);
|
|
294
|
+
} catch {
|
|
295
|
+
this.logger.warn(`Skipping ${label} patch for "${key}": patch file not found at ${sourcePath}`);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (!realSourcePath.startsWith(`${realWorkspaceRoot}${path.default.sep}`)) {
|
|
299
|
+
this.logger.warn(`Skipping ${label} patch for "${key}": patch file is outside the workspace at ${realSourcePath}`);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
return realSourcePath;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Copies the patch files declared by the source workspace into the output directory and returns
|
|
306
|
+
* the patch map rewritten to output-relative paths, so the patches survive the output install.
|
|
307
|
+
*/
|
|
308
|
+
async copyPnpmPatches(sourceWorkspaceYaml, sourceWorkspaceRoot, dir) {
|
|
309
|
+
const declared = parsePnpmPatchedDependencies(sourceWorkspaceYaml);
|
|
310
|
+
const rewritten = {};
|
|
311
|
+
const usedFileNames = /* @__PURE__ */ new Set();
|
|
312
|
+
const resolvedWorkspaceRoot = path.default.resolve(sourceWorkspaceRoot);
|
|
313
|
+
for (const [key, declaredPath] of Object.entries(declared)) {
|
|
314
|
+
const sourcePath = await this.resolvePatchSource(resolvedWorkspaceRoot, declaredPath, {
|
|
315
|
+
key,
|
|
316
|
+
label: "pnpm"
|
|
317
|
+
});
|
|
318
|
+
if (!sourcePath) continue;
|
|
319
|
+
let fileName = path.default.basename(sourcePath);
|
|
320
|
+
if (usedFileNames.has(fileName)) fileName = `${key.replace(/[^a-zA-Z0-9._-]/g, "_")}-${fileName}`;
|
|
321
|
+
usedFileNames.add(fileName);
|
|
322
|
+
await fs_promises.default.mkdir(path.default.join(dir, PNPM_PATCHES_DIR), { recursive: true });
|
|
323
|
+
await fs_promises.default.copyFile(sourcePath, path.default.join(dir, PNPM_PATCHES_DIR, fileName));
|
|
324
|
+
rewritten[key] = `${PNPM_PATCHES_DIR}/${fileName}`;
|
|
325
|
+
}
|
|
326
|
+
return rewritten;
|
|
251
327
|
}
|
|
328
|
+
/**
|
|
329
|
+
* Writes the `.yarnrc.yml` for the bundled output, recording the supported architectures so the
|
|
330
|
+
* output install only resolves optional native binaries that match the deployment target.
|
|
331
|
+
*/
|
|
252
332
|
async writeYarnConfig(dir, options) {
|
|
253
333
|
const yarnrcPath = path.default.join(dir, ".yarnrc.yml");
|
|
254
334
|
const config = { supportedArchitectures: {
|
|
@@ -258,6 +338,66 @@ var Deps = class extends _mastra_core_base.MastraBase {
|
|
|
258
338
|
} };
|
|
259
339
|
await fs_promises.default.writeFile(yarnrcPath, `supportedArchitectures:\n${Object.entries(config.supportedArchitectures).map(([key, value]) => ` ${key}: ${JSON.stringify(value)}`).join("\n")}`);
|
|
260
340
|
}
|
|
341
|
+
/**
|
|
342
|
+
* Copies the source workspace's `.yarn/patches/` directory (Yarn Berry) into the output
|
|
343
|
+
* directory so patches survive the output install. Yarn auto-discovers patches from this
|
|
344
|
+
* directory and applies them per the lockfile references.
|
|
345
|
+
*/
|
|
346
|
+
async copyYarnPatches(dir) {
|
|
347
|
+
const sourcePatchesDir = path.default.join(this.rootDir, ".yarn", "patches");
|
|
348
|
+
if (!fs.default.existsSync(sourcePatchesDir)) return;
|
|
349
|
+
const outputPatchesDir = path.default.join(dir, ".yarn", "patches");
|
|
350
|
+
await fs_promises.default.cp(sourcePatchesDir, outputPatchesDir, {
|
|
351
|
+
recursive: true,
|
|
352
|
+
errorOnExist: false
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Copies the patch files referenced by the source workspace's `patchedDependencies` in
|
|
357
|
+
* package.json into the output directory and returns the map rewritten to output-relative
|
|
358
|
+
* paths, so bun patches survive the output install.
|
|
359
|
+
*/
|
|
360
|
+
async copyBunPatches(declared, sourceRoot, dir) {
|
|
361
|
+
const rewritten = {};
|
|
362
|
+
const usedFileNames = /* @__PURE__ */ new Set();
|
|
363
|
+
const resolvedRoot = path.default.resolve(sourceRoot);
|
|
364
|
+
for (const [key, declaredPath] of Object.entries(declared)) {
|
|
365
|
+
const sourcePath = await this.resolvePatchSource(resolvedRoot, declaredPath, {
|
|
366
|
+
key,
|
|
367
|
+
label: "bun"
|
|
368
|
+
});
|
|
369
|
+
if (!sourcePath) continue;
|
|
370
|
+
let fileName = path.default.basename(sourcePath);
|
|
371
|
+
if (usedFileNames.has(fileName)) fileName = `${key.replace(/[^a-zA-Z0-9._-]/g, "_")}-${fileName}`;
|
|
372
|
+
usedFileNames.add(fileName);
|
|
373
|
+
await fs_promises.default.mkdir(path.default.join(dir, BUN_PATCHES_DIR), { recursive: true });
|
|
374
|
+
await fs_promises.default.copyFile(sourcePath, path.default.join(dir, BUN_PATCHES_DIR, fileName));
|
|
375
|
+
rewritten[key] = `${BUN_PATCHES_DIR}/${fileName}`;
|
|
376
|
+
}
|
|
377
|
+
return rewritten;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Reads `patchedDependencies` from the source package.json, copies the referenced patch
|
|
381
|
+
* files into the output directory, and writes the output-relative patch map into the
|
|
382
|
+
* output's package.json so `bun install` preserves patches in the bundled output.
|
|
383
|
+
*/
|
|
384
|
+
async copyBunPatchesToOutput(dir) {
|
|
385
|
+
const sourcePackageJsonPath = path.default.join(this.rootDir, "package.json");
|
|
386
|
+
if (!fs.default.existsSync(sourcePackageJsonPath)) return;
|
|
387
|
+
const patchedDeps = (await (0, fs_extra_esm.readJSON)(sourcePackageJsonPath)).patchedDependencies;
|
|
388
|
+
if (!patchedDeps || Object.keys(patchedDeps).length === 0) return;
|
|
389
|
+
const rewritten = await this.copyBunPatches(patchedDeps, this.rootDir, dir);
|
|
390
|
+
if (Object.keys(rewritten).length === 0) return;
|
|
391
|
+
const outputPackageJsonPath = path.default.join(dir, "package.json");
|
|
392
|
+
let outputPkg;
|
|
393
|
+
try {
|
|
394
|
+
outputPkg = await (0, fs_extra_esm.readJSON)(outputPackageJsonPath);
|
|
395
|
+
} catch {
|
|
396
|
+
outputPkg = {};
|
|
397
|
+
}
|
|
398
|
+
outputPkg.patchedDependencies = rewritten;
|
|
399
|
+
await (0, fs_extra_esm.writeJSON)(outputPackageJsonPath, outputPkg, { spaces: 2 });
|
|
400
|
+
}
|
|
261
401
|
getNpmArgs(options) {
|
|
262
402
|
const args = [];
|
|
263
403
|
if (options.cpu) args.push(`--cpu=${options.cpu.join(",")}`);
|
|
@@ -302,6 +442,10 @@ var Deps = class extends _mastra_core_base.MastraBase {
|
|
|
302
442
|
case "yarn":
|
|
303
443
|
await (0, fs_extra_esm.ensureFile)(path.default.join(dir, "yarn.lock"));
|
|
304
444
|
if (architecture) await this.writeYarnConfig(dir, architecture);
|
|
445
|
+
await this.copyYarnPatches(dir);
|
|
446
|
+
break;
|
|
447
|
+
case "bun":
|
|
448
|
+
await this.copyBunPatchesToOutput(dir);
|
|
305
449
|
break;
|
|
306
450
|
case "npm":
|
|
307
451
|
if (architecture) args = this.getNpmArgs(architecture);
|
|
@@ -534,4 +678,4 @@ Object.defineProperty(exports, "createPinoStream", {
|
|
|
534
678
|
}
|
|
535
679
|
});
|
|
536
680
|
|
|
537
|
-
//# sourceMappingURL=services-
|
|
681
|
+
//# sourceMappingURL=services-m8tlZVRv.cjs.map
|