@mastra/deployer 1.63.0-alpha.0 → 1.63.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/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @mastra/deployer
2
2
 
3
+ ## 1.63.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Added a dedicated worker entry to standard build artifacts. The worker runtime exposes a /health endpoint that returns 503 during startup and 200 after workers initialize, so deployment platforms can gate rollout on worker readiness. ([#22393](https://github.com/mastra-ai/mastra/pull/22393))
8
+
9
+ - Updated dependencies [[`7176362`](https://github.com/mastra-ai/mastra/commit/717636281a3339911a05ea2cc8ae38afe4fd2cef), [`9045b8f`](https://github.com/mastra-ai/mastra/commit/9045b8fdf622e1d735b96ddd6500bd32556636d9), [`7677a2c`](https://github.com/mastra-ai/mastra/commit/7677a2cd47729221ca28afc5067d26e22d925b59), [`e3b796d`](https://github.com/mastra-ai/mastra/commit/e3b796d29a63f0d5c97dd815aadec40687346d70), [`f7a7467`](https://github.com/mastra-ai/mastra/commit/f7a74678193921e7ea4790232d707b3237626cac), [`49ccd14`](https://github.com/mastra-ai/mastra/commit/49ccd142268a61fb55ea75bc76287643a21f3677), [`f9c56f3`](https://github.com/mastra-ai/mastra/commit/f9c56f336ee8c250763a438990f8e60a428353c9), [`3855b38`](https://github.com/mastra-ai/mastra/commit/3855b38c4c25af32ab8e298e148becc963abe92c)]:
10
+ - @mastra/core@1.63.0
11
+ - @mastra/server@1.63.0
12
+
13
+ ## 1.63.0-alpha.1
14
+
15
+ ### Patch Changes
16
+
17
+ - Added a dedicated worker entry to standard build artifacts. The worker runtime exposes a /health endpoint that returns 503 during startup and 200 after workers initialize, so deployment platforms can gate rollout on worker readiness. ([#22393](https://github.com/mastra-ai/mastra/pull/22393))
18
+
19
+ - Updated dependencies [[`7677a2c`](https://github.com/mastra-ai/mastra/commit/7677a2cd47729221ca28afc5067d26e22d925b59), [`f7a7467`](https://github.com/mastra-ai/mastra/commit/f7a74678193921e7ea4790232d707b3237626cac), [`f9c56f3`](https://github.com/mastra-ai/mastra/commit/f9c56f336ee8c250763a438990f8e60a428353c9)]:
20
+ - @mastra/core@1.63.0-alpha.1
21
+ - @mastra/server@1.63.0-alpha.1
22
+
3
23
  ## 1.63.0-alpha.0
4
24
 
5
25
  ### Patch Changes
@@ -233,6 +233,9 @@ var Bundler = class extends _mastra_core_bundler.MastraBundler {
233
233
  }, this.logger);
234
234
  }
235
235
  pnpmNodeLinker;
236
+ getAdditionalEntries() {
237
+ return {};
238
+ }
236
239
  async installDependencies(outputDirectory, rootDir = process.cwd(), pnpmOverrides) {
237
240
  const deps = new require_services.DepsService(rootDir);
238
241
  deps.__setLogger(this.logger);
@@ -316,7 +319,7 @@ var Bundler = class extends _mastra_core_bundler.MastraBundler {
316
319
  }, null, 2));
317
320
  this.logger.info("Wrote mastra-project.json for Software Factory project");
318
321
  }
319
- async getBundlerOptions(serverFile, mastraEntryFile, analyzedBundleInfo, toolsPaths, { enableSourcemap, enableMinify, enableEsmShim, externals }) {
322
+ async getBundlerOptions(serverFile, mastraEntryFile, analyzedBundleInfo, toolsPaths, { enableSourcemap, enableMinify, enableEsmShim, externals }, additionalEntries) {
320
323
  const { workspaceRoot } = await require_analyze.getWorkspaceInformation({ mastraEntryFile });
321
324
  const closestPkgJson = empathic_package.up({ cwd: (0, path.dirname)(mastraEntryFile) });
322
325
  const projectRoot = closestPkgJson ? (0, path.dirname)(closestPkgJson) : process.cwd();
@@ -328,19 +331,24 @@ var Bundler = class extends _mastra_core_bundler.MastraBundler {
328
331
  enableEsmShim,
329
332
  externalsPreset: externals === true
330
333
  });
331
- const isVirtual = serverFile.includes("\n") || !(0, fs.existsSync)(serverFile);
332
334
  const toolsInputOptions = await this.listToolsInputOptions(toolsPaths);
333
- if (isVirtual) {
334
- inputOptions.input = {
335
- index: "#entry",
336
- ...toolsInputOptions
337
- };
338
- if (Array.isArray(inputOptions.plugins)) inputOptions.plugins.unshift((0, _rollup_plugin_virtual.default)({ "#entry": serverFile }));
339
- else inputOptions.plugins = [(0, _rollup_plugin_virtual.default)({ "#entry": serverFile })];
340
- } else inputOptions.input = {
335
+ const entryInputs = {};
336
+ const virtualEntries = {};
337
+ const entries = {
341
338
  index: serverFile,
339
+ ...additionalEntries
340
+ };
341
+ for (const [name, entry] of Object.entries(entries)) if (entry.includes("\n") || !(0, fs.existsSync)(entry)) {
342
+ const virtualId = name === "index" ? "#entry" : `#entry-${name}`;
343
+ entryInputs[name] = virtualId;
344
+ virtualEntries[virtualId] = entry;
345
+ } else entryInputs[name] = entry;
346
+ inputOptions.input = {
347
+ ...entryInputs,
342
348
  ...toolsInputOptions
343
349
  };
350
+ if (Object.keys(virtualEntries).length > 0) if (Array.isArray(inputOptions.plugins)) inputOptions.plugins.unshift((0, _rollup_plugin_virtual.default)(virtualEntries));
351
+ else inputOptions.plugins = [(0, _rollup_plugin_virtual.default)(virtualEntries)];
344
352
  return inputOptions;
345
353
  }
346
354
  getAllToolPaths(mastraDir, toolsPaths = []) {
@@ -375,6 +383,7 @@ var Bundler = class extends _mastra_core_bundler.MastraBundler {
375
383
  }
376
384
  async _bundle(serverFile, mastraEntryFile, { projectRoot, outputDirectory, enableEsmShim = true }, toolsPaths = [], bundleLocation = (0, path.join)(outputDirectory, this.outputDir)) {
377
385
  const analyzeDir = (0, path.join)(outputDirectory, this.analyzeOutputDir);
386
+ const additionalEntries = this.getAdditionalEntries();
378
387
  const bundlerOptions = await this.getUserBundlerOptions(mastraEntryFile, outputDirectory);
379
388
  const internalBundlerOptions = {
380
389
  enableSourcemap: !!bundlerOptions.sourcemap,
@@ -386,7 +395,11 @@ var Bundler = class extends _mastra_core_bundler.MastraBundler {
386
395
  let analyzedBundleInfo;
387
396
  try {
388
397
  const resolvedToolsPaths = await this.listToolsInputOptions(toolsPaths);
389
- analyzedBundleInfo = await require_analyze.analyzeBundle([serverFile, ...Object.values(resolvedToolsPaths)], mastraEntryFile, {
398
+ analyzedBundleInfo = await require_analyze.analyzeBundle([
399
+ serverFile,
400
+ ...Object.values(additionalEntries),
401
+ ...Object.values(resolvedToolsPaths)
402
+ ], mastraEntryFile, {
390
403
  outputDir: analyzeDir,
391
404
  projectRoot,
392
405
  platform: this.platform,
@@ -439,7 +452,7 @@ var Bundler = class extends _mastra_core_bundler.MastraBundler {
439
452
  logger: this.logger
440
453
  });
441
454
  this.logger.info("Bundling Mastra application");
442
- const inputOptions = await this.getBundlerOptions(serverFile, mastraEntryFile, analyzedBundleInfo, toolsPaths, internalBundlerOptions);
455
+ const inputOptions = await this.getBundlerOptions(serverFile, mastraEntryFile, analyzedBundleInfo, toolsPaths, internalBundlerOptions, additionalEntries);
443
456
  await (await this.createBundler({
444
457
  ...inputOptions,
445
458
  logLevel: inputOptions.logLevel === "silent" ? "warn" : inputOptions.logLevel,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["pkg","getPackageName","MastraBundler","createBundlerUtil","getBundlerOptions","analyzeBundle","DepsService","fsExtra","MastraError","ErrorDomain","ErrorCategory","getWorkspaceInformation","getInputOptions","slash","posix","path","FileService","isBareModuleSpecifier","collectTransitiveWorkspaceDependencies","packWorkspaceDependencies"],"sources":["../../src/bundler/index.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join, posix } from 'node:path';\nimport { MastraBundler } from '@mastra/core/bundler';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport type { Config } from '@mastra/core/mastra';\nimport virtual from '@rollup/plugin-virtual';\nimport * as pkg from 'empathic/package';\nimport fsExtra, { copy, ensureDir, emptyDir, readJSON } from 'fs-extra/esm';\nimport type { InputOptions, OutputOptions } from 'rollup';\nimport { glob } from 'tinyglobby';\nimport { analyzeBundle } from '../build/analyze';\nimport { createBundler as createBundlerUtil, getInputOptions } from '../build/bundler';\nimport { getBundlerOptions } from '../build/bundlerOptions';\nimport type { BundlerOptions, ExternalDependencyInfo } from '../build/types';\nimport type { BundlerPlatform } from '../build/utils';\nimport { getPackageName, isBareModuleSpecifier, slash } from '../build/utils';\nimport { DepsService } from '../services/deps';\nimport { FileService } from '../services/fs';\nimport {\n collectTransitiveWorkspaceDependencies,\n getWorkspaceInformation,\n packWorkspaceDependencies,\n} from './workspaceDependencies';\n\nexport type { BundlerOptions, ExternalDependencyInfo } from '../build/types';\nexport type { BundlerPlatform } from '../build/utils';\n\nexport const IS_DEFAULT = Symbol('IS_DEFAULT');\n\nconst NPM_ALIAS_PREFIX = 'npm:';\n/** Characters a registry range or dist tag can contain. Protocols need `:`, git shorthand needs `/` or `#`. */\nconst REGISTRY_SPEC_PATTERN = /^[A-Za-z0-9.+_^~><=*|!\\s-]+$/;\nconst PACKAGE_NAME_PATTERN = /^(?:@[A-Za-z0-9._-]+\\/)?[A-Za-z0-9._-]+$/;\nconst TARBALL_SUFFIX_PATTERN = /\\.(?:tgz|tar\\.gz|tar)$/i;\n/** npm reads a value starting like this as a path, whatever follows. A bare `~` is a semver range. */\nconst FILE_SPEC_PREFIX_PATTERN = /^(?:\\.|~[/\\\\]|[/\\\\]|[A-Za-z]:[/\\\\])/;\n/** A range admitting any published version: `*`, `x`, `>=0`, and any union containing one. */\nconst UNBOUNDED_RANGE_PATTERN = /(?:^|\\|\\||\\s)\\s*(?:[*xX]|>=?\\s*0(?:\\.0)*(?:\\.0)*)\\s*(?:$|\\|\\|)/;\n\n/**\n * Constraints declared by the source app, plus the packages some resolution field pins.\n *\n * Only `dependencies` values are read. Override fields contribute names, never values: which of\n * `overrides`, `resolutions`, `pnpm.overrides` or `pnpm-workspace.yaml` a given install honoured\n * depends on the package manager and its version, so reproducing that precedence would mean\n * emulating three package managers. A name appearing in any of them is enough to know the resolved\n * version was chosen deliberately, which is all this needs.\n */\nexport type SourceDependencyConstraints = {\n dependencies: Record<string, string>;\n pinnedByResolutionField: Set<string>;\n};\n\nconst toStringRecord = (value: unknown): Record<string, string> => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n};\n\n/**\n * True when a specifier is something the isolated install in `.mastra/output` can resolve from the\n * registry: a semver range, a dist tag, a wildcard, or an npm alias whose target is a registry\n * package and range.\n *\n * This is an allowlist rather than a denylist of known protocols, so an unfamiliar protocol is\n * rejected without this code having to know it exists. The output directory is not a workspace, has\n * no catalog definitions and has a different relative-path base, so `catalog:`, `workspace:`,\n * `file:`, `link:` and git specifiers are all either uninstallable there or point somewhere else.\n */\nexport const isRegistryVersionSpec = (spec: string): boolean => {\n if (FILE_SPEC_PREFIX_PATTERN.test(spec) || TARBALL_SUFFIX_PATTERN.test(spec)) {\n return false;\n }\n\n if (spec.startsWith(NPM_ALIAS_PREFIX)) {\n const alias = spec.slice(NPM_ALIAS_PREFIX.length);\n // Skip index 0 so `npm:@scope/pkg` reads as an alias with no range rather than an empty name.\n const rangeSeparator = alias.lastIndexOf('@');\n const name = rangeSeparator > 0 ? alias.slice(0, rangeSeparator) : alias;\n const range = rangeSeparator > 0 ? alias.slice(rangeSeparator + 1) : '*';\n\n return PACKAGE_NAME_PATTERN.test(name) && isRegistryVersionSpec(range);\n }\n\n return REGISTRY_SPEC_PATTERN.test(spec);\n};\n\n/**\n * True when a specifier names a version the output install can be held to.\n *\n * A range admitting anything (`*`, `latest`, `>=0`, an alias with no range) is looser than the\n * version already resolved, so writing it would let a later install pull something the bundle was\n * never analyzed against.\n */\nconst isBoundedVersionSpec = (spec: string): boolean => {\n const range = spec.startsWith(NPM_ALIAS_PREFIX)\n ? (() => {\n const alias = spec.slice(NPM_ALIAS_PREFIX.length);\n const rangeSeparator = alias.lastIndexOf('@');\n return rangeSeparator > 0 ? alias.slice(rangeSeparator + 1) : '';\n })()\n : spec;\n\n return /\\d/.test(range) && !UNBOUNDED_RANGE_PATTERN.test(range);\n};\n\nconst readManifest = async (manifestPath: string | undefined): Promise<Record<string, unknown> | undefined> => {\n if (!manifestPath) {\n return undefined;\n }\n\n try {\n const manifest = await readJSON(manifestPath);\n return manifest && typeof manifest === 'object' ? manifest : undefined;\n } catch {\n // A manifest that cannot be read tells us nothing about intent.\n return undefined;\n }\n};\n\n/** Collect the package names a manifest's resolution fields pin, ignoring their values. */\nconst collectManifestPinnedNames = (manifest: Record<string, unknown> | undefined, pinned: Set<string>) => {\n const pnpmSection = manifest?.pnpm;\n const records = [\n manifest?.overrides,\n manifest?.resolutions,\n pnpmSection && typeof pnpmSection === 'object' ? (pnpmSection as { overrides?: unknown }).overrides : undefined,\n ];\n\n for (const record of records) {\n if (record && typeof record === 'object' && !Array.isArray(record)) {\n for (const key of Object.keys(record)) {\n pinned.add(key);\n }\n }\n }\n};\n\n/**\n * Collect the names under a top-level `overrides:` block in `pnpm-workspace.yaml`.\n *\n * pnpm moved overrides out of `package.json` into this file, so a workspace on a current pnpm keeps\n * them only here. Reading names off the indented block avoids a YAML dependency, the same tradeoff\n * `copyPnpmWorkspaceSettings` already makes for the top-level keys it copies.\n */\nconst collectPnpmWorkspacePinnedNames = (source: string, pinned: Set<string>) => {\n const lines = source.split(/\\r?\\n/);\n let insideOverrides = false;\n\n for (const line of lines) {\n if (/^\\S/.test(line)) {\n insideOverrides = /^overrides:\\s*$/.test(line);\n continue;\n }\n\n if (!insideOverrides) {\n continue;\n }\n\n const key = /^\\s+(?:'([^']+)'|\"([^\"]+)\"|([^'\"\\s:][^:]*?))\\s*:/.exec(line);\n if (key) {\n pinned.add((key[1] ?? key[2] ?? key[3] ?? '').trim());\n }\n }\n};\n\n/**\n * Read the constraints the source app declared.\n *\n * `dependencies` come from the manifest at `projectRoot`, the package the build was invoked for and\n * whose directory receives the output, falling back to the manifest above the entry file. Anchoring\n * on `projectRoot` rather than the entry file keeps the answer deterministic when the entry handed\n * to the bundler is a generated wrapper rather than the app's own source file.\n *\n * Resolution-field names are collected from both that manifest and the workspace root, including the\n * root `pnpm-workspace.yaml`, because a name pinned anywhere means the resolved version may have been\n * chosen deliberately rather than hoisted by accident.\n */\nexport const getSourceDependencyConstraints = async ({\n projectRoot,\n mastraEntryFile,\n workspaceRoot,\n}: {\n projectRoot: string;\n mastraEntryFile: string;\n workspaceRoot?: string;\n}): Promise<SourceDependencyConstraints> => {\n const manifestPaths = [pkg.up({ cwd: projectRoot }), pkg.up({ cwd: dirname(mastraEntryFile) })].filter(\n (entry, index, entries): entry is string => !!entry && entries.indexOf(entry) === index,\n );\n\n if (workspaceRoot) {\n manifestPaths.push(join(workspaceRoot, 'package.json'));\n }\n\n const pinnedByResolutionField = new Set<string>();\n let dependencies: Record<string, string> | undefined;\n\n for (const manifestPath of manifestPaths) {\n const manifest = await readManifest(manifestPath);\n if (!manifest) {\n continue;\n }\n\n // Nearest manifest wins, and an empty `dependencies` record is still that package's answer.\n dependencies ??= toStringRecord(manifest.dependencies);\n collectManifestPinnedNames(manifest, pinnedByResolutionField);\n }\n\n if (workspaceRoot) {\n try {\n collectPnpmWorkspacePinnedNames(\n await readFile(join(workspaceRoot, 'pnpm-workspace.yaml'), 'utf-8'),\n pinnedByResolutionField,\n );\n } catch {\n // No pnpm workspace config, or unreadable: nothing to learn from it.\n }\n }\n\n return { dependencies: dependencies ?? {}, pinnedByResolutionField };\n};\n\nconst findDeclaredConstraint = (\n constraints: SourceDependencyConstraints,\n dependencyName: string,\n): string | undefined => {\n const names = [dependencyName, getPackageName(dependencyName)].filter(\n (name, index, all): name is string => !!name && all.indexOf(name) === index,\n );\n\n for (const name of names) {\n // A pinned package's resolved version is the deliberate answer, so leave it as `main` wrote it.\n if (constraints.pinnedByResolutionField.has(name)) {\n return undefined;\n }\n }\n\n for (const name of names) {\n const declared = (constraints.dependencies[name] ?? '').trim();\n if (declared && isBoundedVersionSpec(declared) && isRegistryVersionSpec(declared)) {\n return declared;\n }\n }\n\n return undefined;\n};\n\n/**\n * Prefer the constraint the app declared over the version resolved from `node_modules`.\n *\n * The resolved version is whatever the install happened to hoist, so an app declaring `zod: ^4.3.6`\n * next to a hoisted `zod@3.25.76` gets the hoisted version written into the output manifest and the\n * isolated install then locks it in.\n */\nexport const applySourceDependencyRange = (\n dependencyName: string,\n dependencyInfo: ExternalDependencyInfo,\n constraints: SourceDependencyConstraints,\n): ExternalDependencyInfo => {\n const declared = findDeclaredConstraint(constraints, dependencyName);\n if (!declared) {\n return dependencyInfo;\n }\n\n if (declared.startsWith(NPM_ALIAS_PREFIX)) {\n return { ...dependencyInfo, packageSpec: declared };\n }\n\n // `packageSpec` is set only when the resolved package's own name differs from the requested one, so\n // a bare range under this key describes a different package and the resolved alias is the answer.\n if (dependencyInfo.packageSpec) {\n return dependencyInfo;\n }\n\n return { ...dependencyInfo, version: declared };\n};\n\nexport abstract class Bundler extends MastraBundler {\n protected analyzeOutputDir = '.build';\n protected outputDir = 'output';\n protected platform: BundlerPlatform = 'node';\n\n constructor(name: string, component: 'BUNDLER' | 'DEPLOYER' = 'BUNDLER') {\n super({ name, component });\n }\n\n async prepare(outputDirectory: string): Promise<void> {\n // Clean up the output directory first\n await emptyDir(outputDirectory);\n\n await ensureDir(join(outputDirectory, this.analyzeOutputDir));\n await ensureDir(join(outputDirectory, this.outputDir));\n }\n\n async writePackageJson(\n outputDirectory: string,\n dependencies: Map<string, string | ExternalDependencyInfo>,\n resolutions?: Record<string, string>,\n ) {\n this.logger.debug(\"Writing project's package.json\");\n\n await ensureDir(outputDirectory);\n const pkgPath = join(outputDirectory, 'package.json');\n\n const dependenciesMap = new Map();\n for (const [key, value] of dependencies.entries()) {\n const dependencyValue = typeof value === 'string' ? value : (value.packageSpec ?? value.version ?? 'latest');\n if (key.startsWith('@')) {\n // Handle scoped packages (e.g. @org/package)\n const pkgChunks = key.split('/');\n dependenciesMap.set(`${pkgChunks[0]}/${pkgChunks[1]}`, dependencyValue);\n } else {\n // For non-scoped packages, take only the first part before any slash\n const pkgName = key.split('/')[0] || key;\n dependenciesMap.set(pkgName, dependencyValue);\n }\n }\n\n await writeFile(\n pkgPath,\n JSON.stringify(\n {\n name: 'server',\n version: '1.0.0',\n private: true,\n type: 'module',\n main: 'index.mjs',\n scripts: {\n start: 'node ./index.mjs',\n },\n dependencies: Object.fromEntries(dependenciesMap.entries()),\n ...(Object.keys(resolutions ?? {}).length > 0 && { resolutions }),\n },\n null,\n 2,\n ),\n );\n }\n\n protected createBundler(inputOptions: InputOptions, outputOptions: Partial<OutputOptions> & { dir: string }) {\n return createBundlerUtil(inputOptions, outputOptions);\n }\n\n protected async getUserBundlerOptions(\n mastraEntryFile: string,\n outputDirectory: string,\n ): Promise<NonNullable<Config['bundler']>> {\n const defaultBundlerOptions: Config['bundler'] = {\n externals: [],\n sourcemap: false,\n transpilePackages: [],\n [IS_DEFAULT]: true,\n } as const;\n\n try {\n const bundlerOptions = await getBundlerOptions(mastraEntryFile, outputDirectory);\n\n return bundlerOptions ?? defaultBundlerOptions;\n } catch (error) {\n this.logger.debug('Failed to get bundler options, sourcemap will be disabled', { error });\n }\n\n return defaultBundlerOptions;\n }\n\n protected async analyze(entry: string | string[], mastraFile: string, outputDirectory: string) {\n return await analyzeBundle(\n ([] as string[]).concat(entry),\n mastraFile,\n {\n outputDir: join(outputDirectory, this.analyzeOutputDir),\n projectRoot: outputDirectory,\n platform: this.platform,\n },\n this.logger,\n );\n }\n\n protected pnpmNodeLinker?: 'hoisted';\n\n protected async installDependencies(\n outputDirectory: string,\n rootDir = process.cwd(),\n pnpmOverrides?: Record<string, string>,\n ) {\n const deps = new DepsService(rootDir);\n deps.__setLogger(this.logger);\n\n await deps.install({\n dir: join(outputDirectory, this.outputDir),\n pnpmOverrides,\n pnpmNodeLinker: this.pnpmNodeLinker,\n });\n }\n\n /**\n * Generate a package-lock.json for the output directory so that deploy targets\n * can use `npm ci` instead of `npm install`, skipping version resolution entirely.\n * This is a lockfile-only operation — no packages are downloaded.\n *\n * Temporarily moves node_modules out of the way because pnpm's symlink-based\n * layout confuses npm's arborist, then restores it afterwards so that\n * `mastra start` (or wrangler) can still resolve dependencies at runtime.\n */\n private async generateNpmLockfile(outputDir: string): Promise<void> {\n const nodeModules = join(outputDir, 'node_modules');\n const nodeModulesTmp = join(outputDir, 'node_modules.__tmp');\n let movedNodeModules = false;\n try {\n // Move node_modules aside — pnpm's symlink layout confuses npm's arborist\n if (await fsExtra.pathExists(nodeModules)) {\n await fsExtra.move(nodeModules, nodeModulesTmp, { overwrite: true });\n movedNodeModules = true;\n }\n execSync('npm install --package-lock-only --force', {\n cwd: outputDir,\n stdio: 'pipe',\n timeout: 60_000,\n });\n } catch {\n this.logger.warn('Failed to generate package-lock.json — deploy will fall back to npm install');\n } finally {\n // Restore node_modules so runtime resolution works\n if (movedNodeModules) {\n await rm(nodeModules, { recursive: true, force: true });\n await fsExtra.move(nodeModulesTmp, nodeModules, { overwrite: true });\n }\n }\n }\n\n protected async copyPublic(mastraDir: string, outputDirectory: string) {\n const publicDir = join(mastraDir, 'public');\n\n try {\n await stat(publicDir);\n } catch {\n return;\n }\n\n await copy(publicDir, join(outputDirectory, this.outputDir));\n }\n\n protected async copyDOTNPMRC({\n rootDir = process.cwd(),\n outputDirectory,\n }: {\n rootDir?: string;\n outputDirectory: string;\n }) {\n const sourceDotNpmRcPath = join(rootDir, '.npmrc');\n const targetDotNpmRcPath = join(outputDirectory, this.outputDir, '.npmrc');\n\n try {\n await stat(sourceDotNpmRcPath);\n await copy(sourceDotNpmRcPath, targetDotNpmRcPath);\n } catch {\n return;\n }\n }\n\n /**\n * Writes the `mastra-project.json` deployment marker for Software Factory\n * projects after public assets have been copied. Verifies that the Factory\n * SPA (`factory/index.html`) exists in the output before emitting the marker.\n */\n protected async writeFactoryMarker(outputDirectory: string): Promise<void> {\n const outputDir = join(outputDirectory, this.outputDir);\n const factoryIndex = join(outputDir, 'factory', 'index.html');\n if (!existsSync(factoryIndex)) {\n throw new MastraError({\n id: 'DEPLOYER_BUNDLER_FACTORY_UI_MISSING',\n text: 'Software Factory project detected but factory/index.html was not found after copying the prebuilt Factory UI.',\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n });\n }\n await writeFile(\n join(outputDir, 'mastra-project.json'),\n JSON.stringify({ schemaVersion: 1, projectType: 'factory', assets: { ui: 'factory' } }, null, 2),\n );\n this.logger.info('Wrote mastra-project.json for Software Factory project');\n }\n\n protected async getBundlerOptions(\n serverFile: string,\n mastraEntryFile: string,\n analyzedBundleInfo: Awaited<ReturnType<typeof analyzeBundle>>,\n toolsPaths: (string | string[])[],\n { enableSourcemap, enableMinify, enableEsmShim, externals }: BundlerOptions,\n ) {\n const { workspaceRoot } = await getWorkspaceInformation({ mastraEntryFile });\n const closestPkgJson = pkg.up({ cwd: dirname(mastraEntryFile) });\n const projectRoot = closestPkgJson ? dirname(closestPkgJson) : process.cwd();\n\n const inputOptions: InputOptions = await getInputOptions(\n mastraEntryFile,\n analyzedBundleInfo,\n this.platform,\n {\n 'process.env.NODE_ENV': JSON.stringify('production'),\n },\n {\n sourcemap: enableSourcemap,\n minify: enableMinify,\n workspaceRoot,\n projectRoot,\n enableEsmShim,\n externalsPreset: externals === true,\n },\n );\n const isVirtual = serverFile.includes('\\n') || !existsSync(serverFile);\n const toolsInputOptions = await this.listToolsInputOptions(toolsPaths);\n\n if (isVirtual) {\n inputOptions.input = { index: '#entry', ...toolsInputOptions };\n\n if (Array.isArray(inputOptions.plugins)) {\n inputOptions.plugins.unshift(virtual({ '#entry': serverFile }));\n } else {\n inputOptions.plugins = [virtual({ '#entry': serverFile })];\n }\n } else {\n inputOptions.input = { index: serverFile, ...toolsInputOptions };\n }\n\n return inputOptions;\n }\n\n getAllToolPaths(mastraDir: string, toolsPaths: (string | string[])[] = []): (string | string[])[] {\n // Normalize Windows paths to forward slashes for consistent handling\n const normalizedMastraDir = slash(mastraDir);\n\n // Prepare default tools paths with glob patterns\n const defaultToolsPath = posix.join(normalizedMastraDir, 'tools/**/*.{js,ts}');\n const defaultToolsIgnorePaths = [\n `!${posix.join(normalizedMastraDir, 'tools/**/*.{test,spec}.{js,ts}')}`,\n `!${posix.join(normalizedMastraDir, 'tools/**/__tests__/**')}`,\n ];\n\n // Combine default path with ignore patterns\n const defaultPaths = [defaultToolsPath, ...defaultToolsIgnorePaths];\n\n // If no tools paths provided, use only the default paths\n if (toolsPaths.length === 0) {\n return [defaultPaths];\n }\n\n // If tools paths are provided, add the default paths to ensure standard tools are always included\n return [...toolsPaths, defaultPaths];\n }\n\n async listToolsInputOptions(toolsPaths: (string | string[])[]) {\n const inputs: Record<string, string> = {};\n\n for (const toolPath of toolsPaths) {\n const expandedPaths = await glob(toolPath, {\n absolute: true,\n expandDirectories: false,\n });\n\n for (const path of expandedPaths) {\n if (await fsExtra.pathExists(path)) {\n const fileService = new FileService();\n const entryFile = fileService.getFirstExistingFile([\n join(path, 'index.ts'),\n join(path, 'index.js'),\n path, // if path itself is a file\n ]);\n\n // if it doesn't exist or is a dir skip it. using a dir as a tool will crash the process\n if (!entryFile || (await stat(entryFile)).isDirectory()) {\n this.logger.warn('No entry file found, skipping', { path });\n continue;\n }\n\n const uniqueToolID = crypto.randomUUID();\n // Normalize Windows paths to forward slashes for consistent handling\n const normalizedEntryFile = entryFile.replaceAll('\\\\', '/');\n inputs[`tools/${uniqueToolID}`] = normalizedEntryFile;\n } else {\n this.logger.warn('Tool path does not exist, skipping', { path });\n }\n }\n }\n\n return inputs;\n }\n\n protected async _bundle(\n serverFile: string,\n mastraEntryFile: string,\n {\n projectRoot,\n outputDirectory,\n enableEsmShim = true,\n }: {\n projectRoot: string;\n outputDirectory: string;\n enableEsmShim?: boolean;\n },\n toolsPaths: (string | string[])[] = [],\n bundleLocation: string = join(outputDirectory, this.outputDir),\n ): Promise<void> {\n const analyzeDir = join(outputDirectory, this.analyzeOutputDir);\n\n const bundlerOptions = await this.getUserBundlerOptions(mastraEntryFile, outputDirectory);\n const internalBundlerOptions: BundlerOptions = {\n enableSourcemap: !!bundlerOptions.sourcemap,\n enableMinify: !!bundlerOptions.minify,\n externals: bundlerOptions.externals ?? [],\n enableEsmShim,\n dynamicPackages: bundlerOptions.dynamicPackages,\n };\n\n let analyzedBundleInfo;\n try {\n const resolvedToolsPaths = await this.listToolsInputOptions(toolsPaths);\n analyzedBundleInfo = await analyzeBundle(\n [serverFile, ...Object.values(resolvedToolsPaths)],\n mastraEntryFile,\n {\n outputDir: analyzeDir,\n projectRoot,\n platform: this.platform,\n bundlerOptions: internalBundlerOptions,\n },\n this.logger,\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw new MastraError(\n {\n id: 'DEPLOYER_BUNDLER_ANALYZE_FAILED',\n text: `Failed to analyze Mastra application: ${message}`,\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n },\n error,\n );\n }\n\n const { workspaceRoot } = await getWorkspaceInformation({ dir: projectRoot, mastraEntryFile });\n const sourceDependencyConstraints = await getSourceDependencyConstraints({\n projectRoot,\n mastraEntryFile,\n workspaceRoot,\n });\n const dependenciesToInstall = new Map<string, ExternalDependencyInfo>();\n for (const [dep, depInfo] of analyzedBundleInfo.externalDependencies) {\n if (analyzedBundleInfo.workspaceMap.has(dep) || !isBareModuleSpecifier(dep)) {\n continue;\n }\n\n dependenciesToInstall.set(dep, applySourceDependencyRange(dep, depInfo, sourceDependencyConstraints));\n }\n\n const initialWorkspaceDependencies = new Set<string>();\n for (const dep of analyzedBundleInfo.dependencies.keys()) {\n const pkgName = getPackageName(dep);\n if (pkgName && analyzedBundleInfo.workspaceMap.has(pkgName)) {\n initialWorkspaceDependencies.add(pkgName);\n }\n }\n\n const transitiveWorkspaceDependencies = collectTransitiveWorkspaceDependencies({\n workspaceMap: analyzedBundleInfo.workspaceMap,\n initialDependencies: initialWorkspaceDependencies,\n logger: this.logger,\n });\n\n for (const [dep, packageSpec] of Object.entries(transitiveWorkspaceDependencies.resolutions)) {\n dependenciesToInstall.set(dep, {\n version: analyzedBundleInfo.workspaceMap.get(dep)?.version,\n packageSpec,\n });\n }\n\n try {\n await this.writePackageJson(\n join(outputDirectory, this.outputDir),\n dependenciesToInstall,\n transitiveWorkspaceDependencies.resolutions,\n );\n if (transitiveWorkspaceDependencies.usedWorkspacePackages.size > 0) {\n await packWorkspaceDependencies({\n workspaceMap: analyzedBundleInfo.workspaceMap,\n usedWorkspacePackages: transitiveWorkspaceDependencies.usedWorkspacePackages,\n bundleOutputDir: join(outputDirectory, this.outputDir),\n logger: this.logger,\n });\n }\n\n this.logger.info('Bundling Mastra application');\n\n const inputOptions: InputOptions = await this.getBundlerOptions(\n serverFile,\n mastraEntryFile,\n analyzedBundleInfo,\n toolsPaths,\n internalBundlerOptions,\n );\n\n const bundler = await this.createBundler(\n {\n ...inputOptions,\n logLevel: inputOptions.logLevel === 'silent' ? 'warn' : inputOptions.logLevel,\n onwarn: warning => {\n if (warning.code === 'CIRCULAR_DEPENDENCY') {\n if (warning.ids?.[0]?.includes('node_modules')) {\n return;\n }\n\n this.logger.warn('Circular dependency found', {\n dependency: warning.message.replace('Circular dependency: ', ''),\n });\n }\n },\n },\n {\n dir: bundleLocation,\n manualChunks: {\n mastra: ['#mastra'],\n },\n sourcemap: internalBundlerOptions.enableSourcemap,\n },\n );\n\n await bundler.write();\n const toolImports: string[] = [];\n const toolsExports: string[] = [];\n Array.from(Object.keys(inputOptions.input || {}))\n .filter(key => key.startsWith('tools/'))\n .forEach((key, index) => {\n const toolExport = `tool${index}`;\n toolImports.push(`import * as ${toolExport} from './${key}.mjs';`);\n toolsExports.push(toolExport);\n });\n\n await writeFile(\n join(bundleLocation, 'tools.mjs'),\n `${toolImports.join('\\n')}\n\nexport const tools = [${toolsExports.join(', ')}]`,\n );\n this.logger.info('Bundling Mastra done');\n\n this.logger.info('Copying public files');\n await this.copyPublic(dirname(mastraEntryFile), outputDirectory);\n this.logger.info('Done copying public files');\n\n // For Software Factory projects, write a deterministic deployment marker\n // after public assets (including the SPA) have been copied.\n if (analyzedBundleInfo.projectType === 'factory') {\n await this.writeFactoryMarker(outputDirectory);\n }\n\n this.logger.info('Copying .npmrc file');\n await this.copyDOTNPMRC({ outputDirectory, rootDir: projectRoot });\n\n this.logger.info('Done copying .npmrc file');\n\n this.logger.info('Installing dependencies');\n await this.installDependencies(outputDirectory, projectRoot, transitiveWorkspaceDependencies.resolutions);\n this.logger.info('Done installing dependencies');\n\n if (Object.keys(transitiveWorkspaceDependencies.resolutions).length === 0) {\n this.logger.info('Generating package-lock.json for deploy');\n await this.generateNpmLockfile(join(outputDirectory, this.outputDir));\n this.logger.info('Done generating package-lock.json');\n } else {\n this.logger.warn(\n 'Skipping package-lock.json generation because the output contains packed workspace dependencies',\n );\n }\n } catch (error) {\n if (\n error instanceof MastraError &&\n (error.id === 'DEPLOYER_BUNDLER_FACTORY_UI_MISSING' || error.id === 'DEPLOYER_PNPM_IGNORED_BUILDS')\n ) {\n throw error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n throw new MastraError(\n {\n id: 'DEPLOYER_BUNDLER_BUNDLE_STAGE_FAILED',\n text: `Failed during bundler bundle stage: ${message}`,\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n },\n error,\n );\n }\n }\n\n async lint(_entryFile: string, _outputDirectory: string, toolsPaths: (string | string[])[]): Promise<void> {\n const toolsInputOptions = await this.listToolsInputOptions(toolsPaths);\n const toolsLength = Object.keys(toolsInputOptions).length;\n if (toolsLength > 0) {\n this.logger.info('Found tools', { count: toolsLength });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["pkg","getPackageName","MastraBundler","createBundlerUtil","getBundlerOptions","analyzeBundle","DepsService","fsExtra","MastraError","ErrorDomain","ErrorCategory","getWorkspaceInformation","getInputOptions","slash","posix","path","FileService","isBareModuleSpecifier","collectTransitiveWorkspaceDependencies","packWorkspaceDependencies"],"sources":["../../src/bundler/index.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join, posix } from 'node:path';\nimport { MastraBundler } from '@mastra/core/bundler';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport type { Config } from '@mastra/core/mastra';\nimport virtual from '@rollup/plugin-virtual';\nimport * as pkg from 'empathic/package';\nimport fsExtra, { copy, ensureDir, emptyDir, readJSON } from 'fs-extra/esm';\nimport type { InputOptions, OutputOptions } from 'rollup';\nimport { glob } from 'tinyglobby';\nimport { analyzeBundle } from '../build/analyze';\nimport { createBundler as createBundlerUtil, getInputOptions } from '../build/bundler';\nimport { getBundlerOptions } from '../build/bundlerOptions';\nimport type { BundlerOptions, ExternalDependencyInfo } from '../build/types';\nimport type { BundlerPlatform } from '../build/utils';\nimport { getPackageName, isBareModuleSpecifier, slash } from '../build/utils';\nimport { DepsService } from '../services/deps';\nimport { FileService } from '../services/fs';\nimport {\n collectTransitiveWorkspaceDependencies,\n getWorkspaceInformation,\n packWorkspaceDependencies,\n} from './workspaceDependencies';\n\nexport type { BundlerOptions, ExternalDependencyInfo } from '../build/types';\nexport type { BundlerPlatform } from '../build/utils';\n\nexport const IS_DEFAULT = Symbol('IS_DEFAULT');\n\nconst NPM_ALIAS_PREFIX = 'npm:';\n/** Characters a registry range or dist tag can contain. Protocols need `:`, git shorthand needs `/` or `#`. */\nconst REGISTRY_SPEC_PATTERN = /^[A-Za-z0-9.+_^~><=*|!\\s-]+$/;\nconst PACKAGE_NAME_PATTERN = /^(?:@[A-Za-z0-9._-]+\\/)?[A-Za-z0-9._-]+$/;\nconst TARBALL_SUFFIX_PATTERN = /\\.(?:tgz|tar\\.gz|tar)$/i;\n/** npm reads a value starting like this as a path, whatever follows. A bare `~` is a semver range. */\nconst FILE_SPEC_PREFIX_PATTERN = /^(?:\\.|~[/\\\\]|[/\\\\]|[A-Za-z]:[/\\\\])/;\n/** A range admitting any published version: `*`, `x`, `>=0`, and any union containing one. */\nconst UNBOUNDED_RANGE_PATTERN = /(?:^|\\|\\||\\s)\\s*(?:[*xX]|>=?\\s*0(?:\\.0)*(?:\\.0)*)\\s*(?:$|\\|\\|)/;\n\n/**\n * Constraints declared by the source app, plus the packages some resolution field pins.\n *\n * Only `dependencies` values are read. Override fields contribute names, never values: which of\n * `overrides`, `resolutions`, `pnpm.overrides` or `pnpm-workspace.yaml` a given install honoured\n * depends on the package manager and its version, so reproducing that precedence would mean\n * emulating three package managers. A name appearing in any of them is enough to know the resolved\n * version was chosen deliberately, which is all this needs.\n */\nexport type SourceDependencyConstraints = {\n dependencies: Record<string, string>;\n pinnedByResolutionField: Set<string>;\n};\n\nconst toStringRecord = (value: unknown): Record<string, string> => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n};\n\n/**\n * True when a specifier is something the isolated install in `.mastra/output` can resolve from the\n * registry: a semver range, a dist tag, a wildcard, or an npm alias whose target is a registry\n * package and range.\n *\n * This is an allowlist rather than a denylist of known protocols, so an unfamiliar protocol is\n * rejected without this code having to know it exists. The output directory is not a workspace, has\n * no catalog definitions and has a different relative-path base, so `catalog:`, `workspace:`,\n * `file:`, `link:` and git specifiers are all either uninstallable there or point somewhere else.\n */\nexport const isRegistryVersionSpec = (spec: string): boolean => {\n if (FILE_SPEC_PREFIX_PATTERN.test(spec) || TARBALL_SUFFIX_PATTERN.test(spec)) {\n return false;\n }\n\n if (spec.startsWith(NPM_ALIAS_PREFIX)) {\n const alias = spec.slice(NPM_ALIAS_PREFIX.length);\n // Skip index 0 so `npm:@scope/pkg` reads as an alias with no range rather than an empty name.\n const rangeSeparator = alias.lastIndexOf('@');\n const name = rangeSeparator > 0 ? alias.slice(0, rangeSeparator) : alias;\n const range = rangeSeparator > 0 ? alias.slice(rangeSeparator + 1) : '*';\n\n return PACKAGE_NAME_PATTERN.test(name) && isRegistryVersionSpec(range);\n }\n\n return REGISTRY_SPEC_PATTERN.test(spec);\n};\n\n/**\n * True when a specifier names a version the output install can be held to.\n *\n * A range admitting anything (`*`, `latest`, `>=0`, an alias with no range) is looser than the\n * version already resolved, so writing it would let a later install pull something the bundle was\n * never analyzed against.\n */\nconst isBoundedVersionSpec = (spec: string): boolean => {\n const range = spec.startsWith(NPM_ALIAS_PREFIX)\n ? (() => {\n const alias = spec.slice(NPM_ALIAS_PREFIX.length);\n const rangeSeparator = alias.lastIndexOf('@');\n return rangeSeparator > 0 ? alias.slice(rangeSeparator + 1) : '';\n })()\n : spec;\n\n return /\\d/.test(range) && !UNBOUNDED_RANGE_PATTERN.test(range);\n};\n\nconst readManifest = async (manifestPath: string | undefined): Promise<Record<string, unknown> | undefined> => {\n if (!manifestPath) {\n return undefined;\n }\n\n try {\n const manifest = await readJSON(manifestPath);\n return manifest && typeof manifest === 'object' ? manifest : undefined;\n } catch {\n // A manifest that cannot be read tells us nothing about intent.\n return undefined;\n }\n};\n\n/** Collect the package names a manifest's resolution fields pin, ignoring their values. */\nconst collectManifestPinnedNames = (manifest: Record<string, unknown> | undefined, pinned: Set<string>) => {\n const pnpmSection = manifest?.pnpm;\n const records = [\n manifest?.overrides,\n manifest?.resolutions,\n pnpmSection && typeof pnpmSection === 'object' ? (pnpmSection as { overrides?: unknown }).overrides : undefined,\n ];\n\n for (const record of records) {\n if (record && typeof record === 'object' && !Array.isArray(record)) {\n for (const key of Object.keys(record)) {\n pinned.add(key);\n }\n }\n }\n};\n\n/**\n * Collect the names under a top-level `overrides:` block in `pnpm-workspace.yaml`.\n *\n * pnpm moved overrides out of `package.json` into this file, so a workspace on a current pnpm keeps\n * them only here. Reading names off the indented block avoids a YAML dependency, the same tradeoff\n * `copyPnpmWorkspaceSettings` already makes for the top-level keys it copies.\n */\nconst collectPnpmWorkspacePinnedNames = (source: string, pinned: Set<string>) => {\n const lines = source.split(/\\r?\\n/);\n let insideOverrides = false;\n\n for (const line of lines) {\n if (/^\\S/.test(line)) {\n insideOverrides = /^overrides:\\s*$/.test(line);\n continue;\n }\n\n if (!insideOverrides) {\n continue;\n }\n\n const key = /^\\s+(?:'([^']+)'|\"([^\"]+)\"|([^'\"\\s:][^:]*?))\\s*:/.exec(line);\n if (key) {\n pinned.add((key[1] ?? key[2] ?? key[3] ?? '').trim());\n }\n }\n};\n\n/**\n * Read the constraints the source app declared.\n *\n * `dependencies` come from the manifest at `projectRoot`, the package the build was invoked for and\n * whose directory receives the output, falling back to the manifest above the entry file. Anchoring\n * on `projectRoot` rather than the entry file keeps the answer deterministic when the entry handed\n * to the bundler is a generated wrapper rather than the app's own source file.\n *\n * Resolution-field names are collected from both that manifest and the workspace root, including the\n * root `pnpm-workspace.yaml`, because a name pinned anywhere means the resolved version may have been\n * chosen deliberately rather than hoisted by accident.\n */\nexport const getSourceDependencyConstraints = async ({\n projectRoot,\n mastraEntryFile,\n workspaceRoot,\n}: {\n projectRoot: string;\n mastraEntryFile: string;\n workspaceRoot?: string;\n}): Promise<SourceDependencyConstraints> => {\n const manifestPaths = [pkg.up({ cwd: projectRoot }), pkg.up({ cwd: dirname(mastraEntryFile) })].filter(\n (entry, index, entries): entry is string => !!entry && entries.indexOf(entry) === index,\n );\n\n if (workspaceRoot) {\n manifestPaths.push(join(workspaceRoot, 'package.json'));\n }\n\n const pinnedByResolutionField = new Set<string>();\n let dependencies: Record<string, string> | undefined;\n\n for (const manifestPath of manifestPaths) {\n const manifest = await readManifest(manifestPath);\n if (!manifest) {\n continue;\n }\n\n // Nearest manifest wins, and an empty `dependencies` record is still that package's answer.\n dependencies ??= toStringRecord(manifest.dependencies);\n collectManifestPinnedNames(manifest, pinnedByResolutionField);\n }\n\n if (workspaceRoot) {\n try {\n collectPnpmWorkspacePinnedNames(\n await readFile(join(workspaceRoot, 'pnpm-workspace.yaml'), 'utf-8'),\n pinnedByResolutionField,\n );\n } catch {\n // No pnpm workspace config, or unreadable: nothing to learn from it.\n }\n }\n\n return { dependencies: dependencies ?? {}, pinnedByResolutionField };\n};\n\nconst findDeclaredConstraint = (\n constraints: SourceDependencyConstraints,\n dependencyName: string,\n): string | undefined => {\n const names = [dependencyName, getPackageName(dependencyName)].filter(\n (name, index, all): name is string => !!name && all.indexOf(name) === index,\n );\n\n for (const name of names) {\n // A pinned package's resolved version is the deliberate answer, so leave it as `main` wrote it.\n if (constraints.pinnedByResolutionField.has(name)) {\n return undefined;\n }\n }\n\n for (const name of names) {\n const declared = (constraints.dependencies[name] ?? '').trim();\n if (declared && isBoundedVersionSpec(declared) && isRegistryVersionSpec(declared)) {\n return declared;\n }\n }\n\n return undefined;\n};\n\n/**\n * Prefer the constraint the app declared over the version resolved from `node_modules`.\n *\n * The resolved version is whatever the install happened to hoist, so an app declaring `zod: ^4.3.6`\n * next to a hoisted `zod@3.25.76` gets the hoisted version written into the output manifest and the\n * isolated install then locks it in.\n */\nexport const applySourceDependencyRange = (\n dependencyName: string,\n dependencyInfo: ExternalDependencyInfo,\n constraints: SourceDependencyConstraints,\n): ExternalDependencyInfo => {\n const declared = findDeclaredConstraint(constraints, dependencyName);\n if (!declared) {\n return dependencyInfo;\n }\n\n if (declared.startsWith(NPM_ALIAS_PREFIX)) {\n return { ...dependencyInfo, packageSpec: declared };\n }\n\n // `packageSpec` is set only when the resolved package's own name differs from the requested one, so\n // a bare range under this key describes a different package and the resolved alias is the answer.\n if (dependencyInfo.packageSpec) {\n return dependencyInfo;\n }\n\n return { ...dependencyInfo, version: declared };\n};\n\nexport abstract class Bundler extends MastraBundler {\n protected analyzeOutputDir = '.build';\n protected outputDir = 'output';\n protected platform: BundlerPlatform = 'node';\n\n constructor(name: string, component: 'BUNDLER' | 'DEPLOYER' = 'BUNDLER') {\n super({ name, component });\n }\n\n async prepare(outputDirectory: string): Promise<void> {\n // Clean up the output directory first\n await emptyDir(outputDirectory);\n\n await ensureDir(join(outputDirectory, this.analyzeOutputDir));\n await ensureDir(join(outputDirectory, this.outputDir));\n }\n\n async writePackageJson(\n outputDirectory: string,\n dependencies: Map<string, string | ExternalDependencyInfo>,\n resolutions?: Record<string, string>,\n ) {\n this.logger.debug(\"Writing project's package.json\");\n\n await ensureDir(outputDirectory);\n const pkgPath = join(outputDirectory, 'package.json');\n\n const dependenciesMap = new Map();\n for (const [key, value] of dependencies.entries()) {\n const dependencyValue = typeof value === 'string' ? value : (value.packageSpec ?? value.version ?? 'latest');\n if (key.startsWith('@')) {\n // Handle scoped packages (e.g. @org/package)\n const pkgChunks = key.split('/');\n dependenciesMap.set(`${pkgChunks[0]}/${pkgChunks[1]}`, dependencyValue);\n } else {\n // For non-scoped packages, take only the first part before any slash\n const pkgName = key.split('/')[0] || key;\n dependenciesMap.set(pkgName, dependencyValue);\n }\n }\n\n await writeFile(\n pkgPath,\n JSON.stringify(\n {\n name: 'server',\n version: '1.0.0',\n private: true,\n type: 'module',\n main: 'index.mjs',\n scripts: {\n start: 'node ./index.mjs',\n },\n dependencies: Object.fromEntries(dependenciesMap.entries()),\n ...(Object.keys(resolutions ?? {}).length > 0 && { resolutions }),\n },\n null,\n 2,\n ),\n );\n }\n\n protected createBundler(inputOptions: InputOptions, outputOptions: Partial<OutputOptions> & { dir: string }) {\n return createBundlerUtil(inputOptions, outputOptions);\n }\n\n protected async getUserBundlerOptions(\n mastraEntryFile: string,\n outputDirectory: string,\n ): Promise<NonNullable<Config['bundler']>> {\n const defaultBundlerOptions: Config['bundler'] = {\n externals: [],\n sourcemap: false,\n transpilePackages: [],\n [IS_DEFAULT]: true,\n } as const;\n\n try {\n const bundlerOptions = await getBundlerOptions(mastraEntryFile, outputDirectory);\n\n return bundlerOptions ?? defaultBundlerOptions;\n } catch (error) {\n this.logger.debug('Failed to get bundler options, sourcemap will be disabled', { error });\n }\n\n return defaultBundlerOptions;\n }\n\n protected async analyze(entry: string | string[], mastraFile: string, outputDirectory: string) {\n return await analyzeBundle(\n ([] as string[]).concat(entry),\n mastraFile,\n {\n outputDir: join(outputDirectory, this.analyzeOutputDir),\n projectRoot: outputDirectory,\n platform: this.platform,\n },\n this.logger,\n );\n }\n\n protected pnpmNodeLinker?: 'hoisted';\n\n protected getAdditionalEntries(): Record<string, string> {\n return {};\n }\n\n protected async installDependencies(\n outputDirectory: string,\n rootDir = process.cwd(),\n pnpmOverrides?: Record<string, string>,\n ) {\n const deps = new DepsService(rootDir);\n deps.__setLogger(this.logger);\n\n await deps.install({\n dir: join(outputDirectory, this.outputDir),\n pnpmOverrides,\n pnpmNodeLinker: this.pnpmNodeLinker,\n });\n }\n\n /**\n * Generate a package-lock.json for the output directory so that deploy targets\n * can use `npm ci` instead of `npm install`, skipping version resolution entirely.\n * This is a lockfile-only operation — no packages are downloaded.\n *\n * Temporarily moves node_modules out of the way because pnpm's symlink-based\n * layout confuses npm's arborist, then restores it afterwards so that\n * `mastra start` (or wrangler) can still resolve dependencies at runtime.\n */\n private async generateNpmLockfile(outputDir: string): Promise<void> {\n const nodeModules = join(outputDir, 'node_modules');\n const nodeModulesTmp = join(outputDir, 'node_modules.__tmp');\n let movedNodeModules = false;\n try {\n // Move node_modules aside — pnpm's symlink layout confuses npm's arborist\n if (await fsExtra.pathExists(nodeModules)) {\n await fsExtra.move(nodeModules, nodeModulesTmp, { overwrite: true });\n movedNodeModules = true;\n }\n execSync('npm install --package-lock-only --force', {\n cwd: outputDir,\n stdio: 'pipe',\n timeout: 60_000,\n });\n } catch {\n this.logger.warn('Failed to generate package-lock.json — deploy will fall back to npm install');\n } finally {\n // Restore node_modules so runtime resolution works\n if (movedNodeModules) {\n await rm(nodeModules, { recursive: true, force: true });\n await fsExtra.move(nodeModulesTmp, nodeModules, { overwrite: true });\n }\n }\n }\n\n protected async copyPublic(mastraDir: string, outputDirectory: string) {\n const publicDir = join(mastraDir, 'public');\n\n try {\n await stat(publicDir);\n } catch {\n return;\n }\n\n await copy(publicDir, join(outputDirectory, this.outputDir));\n }\n\n protected async copyDOTNPMRC({\n rootDir = process.cwd(),\n outputDirectory,\n }: {\n rootDir?: string;\n outputDirectory: string;\n }) {\n const sourceDotNpmRcPath = join(rootDir, '.npmrc');\n const targetDotNpmRcPath = join(outputDirectory, this.outputDir, '.npmrc');\n\n try {\n await stat(sourceDotNpmRcPath);\n await copy(sourceDotNpmRcPath, targetDotNpmRcPath);\n } catch {\n return;\n }\n }\n\n /**\n * Writes the `mastra-project.json` deployment marker for Software Factory\n * projects after public assets have been copied. Verifies that the Factory\n * SPA (`factory/index.html`) exists in the output before emitting the marker.\n */\n protected async writeFactoryMarker(outputDirectory: string): Promise<void> {\n const outputDir = join(outputDirectory, this.outputDir);\n const factoryIndex = join(outputDir, 'factory', 'index.html');\n if (!existsSync(factoryIndex)) {\n throw new MastraError({\n id: 'DEPLOYER_BUNDLER_FACTORY_UI_MISSING',\n text: 'Software Factory project detected but factory/index.html was not found after copying the prebuilt Factory UI.',\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n });\n }\n await writeFile(\n join(outputDir, 'mastra-project.json'),\n JSON.stringify({ schemaVersion: 1, projectType: 'factory', assets: { ui: 'factory' } }, null, 2),\n );\n this.logger.info('Wrote mastra-project.json for Software Factory project');\n }\n\n protected async getBundlerOptions(\n serverFile: string,\n mastraEntryFile: string,\n analyzedBundleInfo: Awaited<ReturnType<typeof analyzeBundle>>,\n toolsPaths: (string | string[])[],\n { enableSourcemap, enableMinify, enableEsmShim, externals }: BundlerOptions,\n additionalEntries: Record<string, string>,\n ) {\n const { workspaceRoot } = await getWorkspaceInformation({ mastraEntryFile });\n const closestPkgJson = pkg.up({ cwd: dirname(mastraEntryFile) });\n const projectRoot = closestPkgJson ? dirname(closestPkgJson) : process.cwd();\n\n const inputOptions: InputOptions = await getInputOptions(\n mastraEntryFile,\n analyzedBundleInfo,\n this.platform,\n {\n 'process.env.NODE_ENV': JSON.stringify('production'),\n },\n {\n sourcemap: enableSourcemap,\n minify: enableMinify,\n workspaceRoot,\n projectRoot,\n enableEsmShim,\n externalsPreset: externals === true,\n },\n );\n const toolsInputOptions = await this.listToolsInputOptions(toolsPaths);\n const entryInputs: Record<string, string> = {};\n const virtualEntries: Record<string, string> = {};\n const entries = { index: serverFile, ...additionalEntries };\n\n for (const [name, entry] of Object.entries(entries)) {\n if (entry.includes('\\n') || !existsSync(entry)) {\n const virtualId = name === 'index' ? '#entry' : `#entry-${name}`;\n entryInputs[name] = virtualId;\n virtualEntries[virtualId] = entry;\n } else {\n entryInputs[name] = entry;\n }\n }\n\n inputOptions.input = { ...entryInputs, ...toolsInputOptions };\n\n if (Object.keys(virtualEntries).length > 0) {\n if (Array.isArray(inputOptions.plugins)) {\n inputOptions.plugins.unshift(virtual(virtualEntries));\n } else {\n inputOptions.plugins = [virtual(virtualEntries)];\n }\n }\n\n return inputOptions;\n }\n\n getAllToolPaths(mastraDir: string, toolsPaths: (string | string[])[] = []): (string | string[])[] {\n // Normalize Windows paths to forward slashes for consistent handling\n const normalizedMastraDir = slash(mastraDir);\n\n // Prepare default tools paths with glob patterns\n const defaultToolsPath = posix.join(normalizedMastraDir, 'tools/**/*.{js,ts}');\n const defaultToolsIgnorePaths = [\n `!${posix.join(normalizedMastraDir, 'tools/**/*.{test,spec}.{js,ts}')}`,\n `!${posix.join(normalizedMastraDir, 'tools/**/__tests__/**')}`,\n ];\n\n // Combine default path with ignore patterns\n const defaultPaths = [defaultToolsPath, ...defaultToolsIgnorePaths];\n\n // If no tools paths provided, use only the default paths\n if (toolsPaths.length === 0) {\n return [defaultPaths];\n }\n\n // If tools paths are provided, add the default paths to ensure standard tools are always included\n return [...toolsPaths, defaultPaths];\n }\n\n async listToolsInputOptions(toolsPaths: (string | string[])[]) {\n const inputs: Record<string, string> = {};\n\n for (const toolPath of toolsPaths) {\n const expandedPaths = await glob(toolPath, {\n absolute: true,\n expandDirectories: false,\n });\n\n for (const path of expandedPaths) {\n if (await fsExtra.pathExists(path)) {\n const fileService = new FileService();\n const entryFile = fileService.getFirstExistingFile([\n join(path, 'index.ts'),\n join(path, 'index.js'),\n path, // if path itself is a file\n ]);\n\n // if it doesn't exist or is a dir skip it. using a dir as a tool will crash the process\n if (!entryFile || (await stat(entryFile)).isDirectory()) {\n this.logger.warn('No entry file found, skipping', { path });\n continue;\n }\n\n const uniqueToolID = crypto.randomUUID();\n // Normalize Windows paths to forward slashes for consistent handling\n const normalizedEntryFile = entryFile.replaceAll('\\\\', '/');\n inputs[`tools/${uniqueToolID}`] = normalizedEntryFile;\n } else {\n this.logger.warn('Tool path does not exist, skipping', { path });\n }\n }\n }\n\n return inputs;\n }\n\n protected async _bundle(\n serverFile: string,\n mastraEntryFile: string,\n {\n projectRoot,\n outputDirectory,\n enableEsmShim = true,\n }: {\n projectRoot: string;\n outputDirectory: string;\n enableEsmShim?: boolean;\n },\n toolsPaths: (string | string[])[] = [],\n bundleLocation: string = join(outputDirectory, this.outputDir),\n ): Promise<void> {\n const analyzeDir = join(outputDirectory, this.analyzeOutputDir);\n const additionalEntries = this.getAdditionalEntries();\n\n const bundlerOptions = await this.getUserBundlerOptions(mastraEntryFile, outputDirectory);\n const internalBundlerOptions: BundlerOptions = {\n enableSourcemap: !!bundlerOptions.sourcemap,\n enableMinify: !!bundlerOptions.minify,\n externals: bundlerOptions.externals ?? [],\n enableEsmShim,\n dynamicPackages: bundlerOptions.dynamicPackages,\n };\n\n let analyzedBundleInfo;\n try {\n const resolvedToolsPaths = await this.listToolsInputOptions(toolsPaths);\n analyzedBundleInfo = await analyzeBundle(\n [serverFile, ...Object.values(additionalEntries), ...Object.values(resolvedToolsPaths)],\n mastraEntryFile,\n {\n outputDir: analyzeDir,\n projectRoot,\n platform: this.platform,\n bundlerOptions: internalBundlerOptions,\n },\n this.logger,\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw new MastraError(\n {\n id: 'DEPLOYER_BUNDLER_ANALYZE_FAILED',\n text: `Failed to analyze Mastra application: ${message}`,\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n },\n error,\n );\n }\n\n const { workspaceRoot } = await getWorkspaceInformation({ dir: projectRoot, mastraEntryFile });\n const sourceDependencyConstraints = await getSourceDependencyConstraints({\n projectRoot,\n mastraEntryFile,\n workspaceRoot,\n });\n const dependenciesToInstall = new Map<string, ExternalDependencyInfo>();\n for (const [dep, depInfo] of analyzedBundleInfo.externalDependencies) {\n if (analyzedBundleInfo.workspaceMap.has(dep) || !isBareModuleSpecifier(dep)) {\n continue;\n }\n\n dependenciesToInstall.set(dep, applySourceDependencyRange(dep, depInfo, sourceDependencyConstraints));\n }\n\n const initialWorkspaceDependencies = new Set<string>();\n for (const dep of analyzedBundleInfo.dependencies.keys()) {\n const pkgName = getPackageName(dep);\n if (pkgName && analyzedBundleInfo.workspaceMap.has(pkgName)) {\n initialWorkspaceDependencies.add(pkgName);\n }\n }\n\n const transitiveWorkspaceDependencies = collectTransitiveWorkspaceDependencies({\n workspaceMap: analyzedBundleInfo.workspaceMap,\n initialDependencies: initialWorkspaceDependencies,\n logger: this.logger,\n });\n\n for (const [dep, packageSpec] of Object.entries(transitiveWorkspaceDependencies.resolutions)) {\n dependenciesToInstall.set(dep, {\n version: analyzedBundleInfo.workspaceMap.get(dep)?.version,\n packageSpec,\n });\n }\n\n try {\n await this.writePackageJson(\n join(outputDirectory, this.outputDir),\n dependenciesToInstall,\n transitiveWorkspaceDependencies.resolutions,\n );\n if (transitiveWorkspaceDependencies.usedWorkspacePackages.size > 0) {\n await packWorkspaceDependencies({\n workspaceMap: analyzedBundleInfo.workspaceMap,\n usedWorkspacePackages: transitiveWorkspaceDependencies.usedWorkspacePackages,\n bundleOutputDir: join(outputDirectory, this.outputDir),\n logger: this.logger,\n });\n }\n\n this.logger.info('Bundling Mastra application');\n\n const inputOptions: InputOptions = await this.getBundlerOptions(\n serverFile,\n mastraEntryFile,\n analyzedBundleInfo,\n toolsPaths,\n internalBundlerOptions,\n additionalEntries,\n );\n\n const bundler = await this.createBundler(\n {\n ...inputOptions,\n logLevel: inputOptions.logLevel === 'silent' ? 'warn' : inputOptions.logLevel,\n onwarn: warning => {\n if (warning.code === 'CIRCULAR_DEPENDENCY') {\n if (warning.ids?.[0]?.includes('node_modules')) {\n return;\n }\n\n this.logger.warn('Circular dependency found', {\n dependency: warning.message.replace('Circular dependency: ', ''),\n });\n }\n },\n },\n {\n dir: bundleLocation,\n manualChunks: {\n mastra: ['#mastra'],\n },\n sourcemap: internalBundlerOptions.enableSourcemap,\n },\n );\n\n await bundler.write();\n const toolImports: string[] = [];\n const toolsExports: string[] = [];\n Array.from(Object.keys(inputOptions.input || {}))\n .filter(key => key.startsWith('tools/'))\n .forEach((key, index) => {\n const toolExport = `tool${index}`;\n toolImports.push(`import * as ${toolExport} from './${key}.mjs';`);\n toolsExports.push(toolExport);\n });\n\n await writeFile(\n join(bundleLocation, 'tools.mjs'),\n `${toolImports.join('\\n')}\n\nexport const tools = [${toolsExports.join(', ')}]`,\n );\n this.logger.info('Bundling Mastra done');\n\n this.logger.info('Copying public files');\n await this.copyPublic(dirname(mastraEntryFile), outputDirectory);\n this.logger.info('Done copying public files');\n\n // For Software Factory projects, write a deterministic deployment marker\n // after public assets (including the SPA) have been copied.\n if (analyzedBundleInfo.projectType === 'factory') {\n await this.writeFactoryMarker(outputDirectory);\n }\n\n this.logger.info('Copying .npmrc file');\n await this.copyDOTNPMRC({ outputDirectory, rootDir: projectRoot });\n\n this.logger.info('Done copying .npmrc file');\n\n this.logger.info('Installing dependencies');\n await this.installDependencies(outputDirectory, projectRoot, transitiveWorkspaceDependencies.resolutions);\n this.logger.info('Done installing dependencies');\n\n if (Object.keys(transitiveWorkspaceDependencies.resolutions).length === 0) {\n this.logger.info('Generating package-lock.json for deploy');\n await this.generateNpmLockfile(join(outputDirectory, this.outputDir));\n this.logger.info('Done generating package-lock.json');\n } else {\n this.logger.warn(\n 'Skipping package-lock.json generation because the output contains packed workspace dependencies',\n );\n }\n } catch (error) {\n if (\n error instanceof MastraError &&\n (error.id === 'DEPLOYER_BUNDLER_FACTORY_UI_MISSING' || error.id === 'DEPLOYER_PNPM_IGNORED_BUILDS')\n ) {\n throw error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n throw new MastraError(\n {\n id: 'DEPLOYER_BUNDLER_BUNDLE_STAGE_FAILED',\n text: `Failed during bundler bundle stage: ${message}`,\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n },\n error,\n );\n }\n }\n\n async lint(_entryFile: string, _outputDirectory: string, toolsPaths: (string | string[])[]): Promise<void> {\n const toolsInputOptions = await this.listToolsInputOptions(toolsPaths);\n const toolsLength = Object.keys(toolsInputOptions).length;\n if (toolsLength > 0) {\n this.logger.info('Found tools', { count: toolsLength });\n }\n }\n}\n"],"mappings":"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"}
@@ -80,6 +80,7 @@ export declare abstract class Bundler extends MastraBundler {
80
80
  workspaceMap: Map<string, import("./workspaceDependencies").WorkspacePackageInfo>;
81
81
  }>;
82
82
  protected pnpmNodeLinker?: 'hoisted';
83
+ protected getAdditionalEntries(): Record<string, string>;
83
84
  protected installDependencies(outputDirectory: string, rootDir?: string, pnpmOverrides?: Record<string, string>): Promise<void>;
84
85
  /**
85
86
  * Generate a package-lock.json for the output directory so that deploy targets
@@ -102,7 +103,7 @@ export declare abstract class Bundler extends MastraBundler {
102
103
  * SPA (`factory/index.html`) exists in the output before emitting the marker.
103
104
  */
104
105
  protected writeFactoryMarker(outputDirectory: string): Promise<void>;
105
- protected getBundlerOptions(serverFile: string, mastraEntryFile: string, analyzedBundleInfo: Awaited<ReturnType<typeof analyzeBundle>>, toolsPaths: (string | string[])[], { enableSourcemap, enableMinify, enableEsmShim, externals }: BundlerOptions): Promise<InputOptions>;
106
+ protected getBundlerOptions(serverFile: string, mastraEntryFile: string, analyzedBundleInfo: Awaited<ReturnType<typeof analyzeBundle>>, toolsPaths: (string | string[])[], { enableSourcemap, enableMinify, enableEsmShim, externals }: BundlerOptions, additionalEntries: Record<string, string>): Promise<InputOptions>;
106
107
  getAllToolPaths(mastraDir: string, toolsPaths?: (string | string[])[]): (string | string[])[];
107
108
  listToolsInputOptions(toolsPaths: (string | string[])[]): Promise<Record<string, string>>;
108
109
  protected _bundle(serverFile: string, mastraEntryFile: string, { projectRoot, outputDirectory, enableEsmShim, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bundler/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bundler/index.ts"],"names":[],"mappings":"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"}
@@ -228,6 +228,9 @@ var Bundler = class extends MastraBundler {
228
228
  }, this.logger);
229
229
  }
230
230
  pnpmNodeLinker;
231
+ getAdditionalEntries() {
232
+ return {};
233
+ }
231
234
  async installDependencies(outputDirectory, rootDir = process.cwd(), pnpmOverrides) {
232
235
  const deps = new DepsService(rootDir);
233
236
  deps.__setLogger(this.logger);
@@ -311,7 +314,7 @@ var Bundler = class extends MastraBundler {
311
314
  }, null, 2));
312
315
  this.logger.info("Wrote mastra-project.json for Software Factory project");
313
316
  }
314
- async getBundlerOptions(serverFile, mastraEntryFile, analyzedBundleInfo, toolsPaths, { enableSourcemap, enableMinify, enableEsmShim, externals }) {
317
+ async getBundlerOptions(serverFile, mastraEntryFile, analyzedBundleInfo, toolsPaths, { enableSourcemap, enableMinify, enableEsmShim, externals }, additionalEntries) {
315
318
  const { workspaceRoot } = await getWorkspaceInformation({ mastraEntryFile });
316
319
  const closestPkgJson = pkg.up({ cwd: dirname(mastraEntryFile) });
317
320
  const projectRoot = closestPkgJson ? dirname(closestPkgJson) : process.cwd();
@@ -323,19 +326,24 @@ var Bundler = class extends MastraBundler {
323
326
  enableEsmShim,
324
327
  externalsPreset: externals === true
325
328
  });
326
- const isVirtual = serverFile.includes("\n") || !existsSync(serverFile);
327
329
  const toolsInputOptions = await this.listToolsInputOptions(toolsPaths);
328
- if (isVirtual) {
329
- inputOptions.input = {
330
- index: "#entry",
331
- ...toolsInputOptions
332
- };
333
- if (Array.isArray(inputOptions.plugins)) inputOptions.plugins.unshift(virtual({ "#entry": serverFile }));
334
- else inputOptions.plugins = [virtual({ "#entry": serverFile })];
335
- } else inputOptions.input = {
330
+ const entryInputs = {};
331
+ const virtualEntries = {};
332
+ const entries = {
336
333
  index: serverFile,
334
+ ...additionalEntries
335
+ };
336
+ for (const [name, entry] of Object.entries(entries)) if (entry.includes("\n") || !existsSync(entry)) {
337
+ const virtualId = name === "index" ? "#entry" : `#entry-${name}`;
338
+ entryInputs[name] = virtualId;
339
+ virtualEntries[virtualId] = entry;
340
+ } else entryInputs[name] = entry;
341
+ inputOptions.input = {
342
+ ...entryInputs,
337
343
  ...toolsInputOptions
338
344
  };
345
+ if (Object.keys(virtualEntries).length > 0) if (Array.isArray(inputOptions.plugins)) inputOptions.plugins.unshift(virtual(virtualEntries));
346
+ else inputOptions.plugins = [virtual(virtualEntries)];
339
347
  return inputOptions;
340
348
  }
341
349
  getAllToolPaths(mastraDir, toolsPaths = []) {
@@ -370,6 +378,7 @@ var Bundler = class extends MastraBundler {
370
378
  }
371
379
  async _bundle(serverFile, mastraEntryFile, { projectRoot, outputDirectory, enableEsmShim = true }, toolsPaths = [], bundleLocation = join(outputDirectory, this.outputDir)) {
372
380
  const analyzeDir = join(outputDirectory, this.analyzeOutputDir);
381
+ const additionalEntries = this.getAdditionalEntries();
373
382
  const bundlerOptions = await this.getUserBundlerOptions(mastraEntryFile, outputDirectory);
374
383
  const internalBundlerOptions = {
375
384
  enableSourcemap: !!bundlerOptions.sourcemap,
@@ -381,7 +390,11 @@ var Bundler = class extends MastraBundler {
381
390
  let analyzedBundleInfo;
382
391
  try {
383
392
  const resolvedToolsPaths = await this.listToolsInputOptions(toolsPaths);
384
- analyzedBundleInfo = await analyzeBundle([serverFile, ...Object.values(resolvedToolsPaths)], mastraEntryFile, {
393
+ analyzedBundleInfo = await analyzeBundle([
394
+ serverFile,
395
+ ...Object.values(additionalEntries),
396
+ ...Object.values(resolvedToolsPaths)
397
+ ], mastraEntryFile, {
385
398
  outputDir: analyzeDir,
386
399
  projectRoot,
387
400
  platform: this.platform,
@@ -434,7 +447,7 @@ var Bundler = class extends MastraBundler {
434
447
  logger: this.logger
435
448
  });
436
449
  this.logger.info("Bundling Mastra application");
437
- const inputOptions = await this.getBundlerOptions(serverFile, mastraEntryFile, analyzedBundleInfo, toolsPaths, internalBundlerOptions);
450
+ const inputOptions = await this.getBundlerOptions(serverFile, mastraEntryFile, analyzedBundleInfo, toolsPaths, internalBundlerOptions, additionalEntries);
438
451
  await (await this.createBundler({
439
452
  ...inputOptions,
440
453
  logLevel: inputOptions.logLevel === "silent" ? "warn" : inputOptions.logLevel,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["createBundlerUtil"],"sources":["../../src/bundler/index.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join, posix } from 'node:path';\nimport { MastraBundler } from '@mastra/core/bundler';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport type { Config } from '@mastra/core/mastra';\nimport virtual from '@rollup/plugin-virtual';\nimport * as pkg from 'empathic/package';\nimport fsExtra, { copy, ensureDir, emptyDir, readJSON } from 'fs-extra/esm';\nimport type { InputOptions, OutputOptions } from 'rollup';\nimport { glob } from 'tinyglobby';\nimport { analyzeBundle } from '../build/analyze';\nimport { createBundler as createBundlerUtil, getInputOptions } from '../build/bundler';\nimport { getBundlerOptions } from '../build/bundlerOptions';\nimport type { BundlerOptions, ExternalDependencyInfo } from '../build/types';\nimport type { BundlerPlatform } from '../build/utils';\nimport { getPackageName, isBareModuleSpecifier, slash } from '../build/utils';\nimport { DepsService } from '../services/deps';\nimport { FileService } from '../services/fs';\nimport {\n collectTransitiveWorkspaceDependencies,\n getWorkspaceInformation,\n packWorkspaceDependencies,\n} from './workspaceDependencies';\n\nexport type { BundlerOptions, ExternalDependencyInfo } from '../build/types';\nexport type { BundlerPlatform } from '../build/utils';\n\nexport const IS_DEFAULT = Symbol('IS_DEFAULT');\n\nconst NPM_ALIAS_PREFIX = 'npm:';\n/** Characters a registry range or dist tag can contain. Protocols need `:`, git shorthand needs `/` or `#`. */\nconst REGISTRY_SPEC_PATTERN = /^[A-Za-z0-9.+_^~><=*|!\\s-]+$/;\nconst PACKAGE_NAME_PATTERN = /^(?:@[A-Za-z0-9._-]+\\/)?[A-Za-z0-9._-]+$/;\nconst TARBALL_SUFFIX_PATTERN = /\\.(?:tgz|tar\\.gz|tar)$/i;\n/** npm reads a value starting like this as a path, whatever follows. A bare `~` is a semver range. */\nconst FILE_SPEC_PREFIX_PATTERN = /^(?:\\.|~[/\\\\]|[/\\\\]|[A-Za-z]:[/\\\\])/;\n/** A range admitting any published version: `*`, `x`, `>=0`, and any union containing one. */\nconst UNBOUNDED_RANGE_PATTERN = /(?:^|\\|\\||\\s)\\s*(?:[*xX]|>=?\\s*0(?:\\.0)*(?:\\.0)*)\\s*(?:$|\\|\\|)/;\n\n/**\n * Constraints declared by the source app, plus the packages some resolution field pins.\n *\n * Only `dependencies` values are read. Override fields contribute names, never values: which of\n * `overrides`, `resolutions`, `pnpm.overrides` or `pnpm-workspace.yaml` a given install honoured\n * depends on the package manager and its version, so reproducing that precedence would mean\n * emulating three package managers. A name appearing in any of them is enough to know the resolved\n * version was chosen deliberately, which is all this needs.\n */\nexport type SourceDependencyConstraints = {\n dependencies: Record<string, string>;\n pinnedByResolutionField: Set<string>;\n};\n\nconst toStringRecord = (value: unknown): Record<string, string> => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n};\n\n/**\n * True when a specifier is something the isolated install in `.mastra/output` can resolve from the\n * registry: a semver range, a dist tag, a wildcard, or an npm alias whose target is a registry\n * package and range.\n *\n * This is an allowlist rather than a denylist of known protocols, so an unfamiliar protocol is\n * rejected without this code having to know it exists. The output directory is not a workspace, has\n * no catalog definitions and has a different relative-path base, so `catalog:`, `workspace:`,\n * `file:`, `link:` and git specifiers are all either uninstallable there or point somewhere else.\n */\nexport const isRegistryVersionSpec = (spec: string): boolean => {\n if (FILE_SPEC_PREFIX_PATTERN.test(spec) || TARBALL_SUFFIX_PATTERN.test(spec)) {\n return false;\n }\n\n if (spec.startsWith(NPM_ALIAS_PREFIX)) {\n const alias = spec.slice(NPM_ALIAS_PREFIX.length);\n // Skip index 0 so `npm:@scope/pkg` reads as an alias with no range rather than an empty name.\n const rangeSeparator = alias.lastIndexOf('@');\n const name = rangeSeparator > 0 ? alias.slice(0, rangeSeparator) : alias;\n const range = rangeSeparator > 0 ? alias.slice(rangeSeparator + 1) : '*';\n\n return PACKAGE_NAME_PATTERN.test(name) && isRegistryVersionSpec(range);\n }\n\n return REGISTRY_SPEC_PATTERN.test(spec);\n};\n\n/**\n * True when a specifier names a version the output install can be held to.\n *\n * A range admitting anything (`*`, `latest`, `>=0`, an alias with no range) is looser than the\n * version already resolved, so writing it would let a later install pull something the bundle was\n * never analyzed against.\n */\nconst isBoundedVersionSpec = (spec: string): boolean => {\n const range = spec.startsWith(NPM_ALIAS_PREFIX)\n ? (() => {\n const alias = spec.slice(NPM_ALIAS_PREFIX.length);\n const rangeSeparator = alias.lastIndexOf('@');\n return rangeSeparator > 0 ? alias.slice(rangeSeparator + 1) : '';\n })()\n : spec;\n\n return /\\d/.test(range) && !UNBOUNDED_RANGE_PATTERN.test(range);\n};\n\nconst readManifest = async (manifestPath: string | undefined): Promise<Record<string, unknown> | undefined> => {\n if (!manifestPath) {\n return undefined;\n }\n\n try {\n const manifest = await readJSON(manifestPath);\n return manifest && typeof manifest === 'object' ? manifest : undefined;\n } catch {\n // A manifest that cannot be read tells us nothing about intent.\n return undefined;\n }\n};\n\n/** Collect the package names a manifest's resolution fields pin, ignoring their values. */\nconst collectManifestPinnedNames = (manifest: Record<string, unknown> | undefined, pinned: Set<string>) => {\n const pnpmSection = manifest?.pnpm;\n const records = [\n manifest?.overrides,\n manifest?.resolutions,\n pnpmSection && typeof pnpmSection === 'object' ? (pnpmSection as { overrides?: unknown }).overrides : undefined,\n ];\n\n for (const record of records) {\n if (record && typeof record === 'object' && !Array.isArray(record)) {\n for (const key of Object.keys(record)) {\n pinned.add(key);\n }\n }\n }\n};\n\n/**\n * Collect the names under a top-level `overrides:` block in `pnpm-workspace.yaml`.\n *\n * pnpm moved overrides out of `package.json` into this file, so a workspace on a current pnpm keeps\n * them only here. Reading names off the indented block avoids a YAML dependency, the same tradeoff\n * `copyPnpmWorkspaceSettings` already makes for the top-level keys it copies.\n */\nconst collectPnpmWorkspacePinnedNames = (source: string, pinned: Set<string>) => {\n const lines = source.split(/\\r?\\n/);\n let insideOverrides = false;\n\n for (const line of lines) {\n if (/^\\S/.test(line)) {\n insideOverrides = /^overrides:\\s*$/.test(line);\n continue;\n }\n\n if (!insideOverrides) {\n continue;\n }\n\n const key = /^\\s+(?:'([^']+)'|\"([^\"]+)\"|([^'\"\\s:][^:]*?))\\s*:/.exec(line);\n if (key) {\n pinned.add((key[1] ?? key[2] ?? key[3] ?? '').trim());\n }\n }\n};\n\n/**\n * Read the constraints the source app declared.\n *\n * `dependencies` come from the manifest at `projectRoot`, the package the build was invoked for and\n * whose directory receives the output, falling back to the manifest above the entry file. Anchoring\n * on `projectRoot` rather than the entry file keeps the answer deterministic when the entry handed\n * to the bundler is a generated wrapper rather than the app's own source file.\n *\n * Resolution-field names are collected from both that manifest and the workspace root, including the\n * root `pnpm-workspace.yaml`, because a name pinned anywhere means the resolved version may have been\n * chosen deliberately rather than hoisted by accident.\n */\nexport const getSourceDependencyConstraints = async ({\n projectRoot,\n mastraEntryFile,\n workspaceRoot,\n}: {\n projectRoot: string;\n mastraEntryFile: string;\n workspaceRoot?: string;\n}): Promise<SourceDependencyConstraints> => {\n const manifestPaths = [pkg.up({ cwd: projectRoot }), pkg.up({ cwd: dirname(mastraEntryFile) })].filter(\n (entry, index, entries): entry is string => !!entry && entries.indexOf(entry) === index,\n );\n\n if (workspaceRoot) {\n manifestPaths.push(join(workspaceRoot, 'package.json'));\n }\n\n const pinnedByResolutionField = new Set<string>();\n let dependencies: Record<string, string> | undefined;\n\n for (const manifestPath of manifestPaths) {\n const manifest = await readManifest(manifestPath);\n if (!manifest) {\n continue;\n }\n\n // Nearest manifest wins, and an empty `dependencies` record is still that package's answer.\n dependencies ??= toStringRecord(manifest.dependencies);\n collectManifestPinnedNames(manifest, pinnedByResolutionField);\n }\n\n if (workspaceRoot) {\n try {\n collectPnpmWorkspacePinnedNames(\n await readFile(join(workspaceRoot, 'pnpm-workspace.yaml'), 'utf-8'),\n pinnedByResolutionField,\n );\n } catch {\n // No pnpm workspace config, or unreadable: nothing to learn from it.\n }\n }\n\n return { dependencies: dependencies ?? {}, pinnedByResolutionField };\n};\n\nconst findDeclaredConstraint = (\n constraints: SourceDependencyConstraints,\n dependencyName: string,\n): string | undefined => {\n const names = [dependencyName, getPackageName(dependencyName)].filter(\n (name, index, all): name is string => !!name && all.indexOf(name) === index,\n );\n\n for (const name of names) {\n // A pinned package's resolved version is the deliberate answer, so leave it as `main` wrote it.\n if (constraints.pinnedByResolutionField.has(name)) {\n return undefined;\n }\n }\n\n for (const name of names) {\n const declared = (constraints.dependencies[name] ?? '').trim();\n if (declared && isBoundedVersionSpec(declared) && isRegistryVersionSpec(declared)) {\n return declared;\n }\n }\n\n return undefined;\n};\n\n/**\n * Prefer the constraint the app declared over the version resolved from `node_modules`.\n *\n * The resolved version is whatever the install happened to hoist, so an app declaring `zod: ^4.3.6`\n * next to a hoisted `zod@3.25.76` gets the hoisted version written into the output manifest and the\n * isolated install then locks it in.\n */\nexport const applySourceDependencyRange = (\n dependencyName: string,\n dependencyInfo: ExternalDependencyInfo,\n constraints: SourceDependencyConstraints,\n): ExternalDependencyInfo => {\n const declared = findDeclaredConstraint(constraints, dependencyName);\n if (!declared) {\n return dependencyInfo;\n }\n\n if (declared.startsWith(NPM_ALIAS_PREFIX)) {\n return { ...dependencyInfo, packageSpec: declared };\n }\n\n // `packageSpec` is set only when the resolved package's own name differs from the requested one, so\n // a bare range under this key describes a different package and the resolved alias is the answer.\n if (dependencyInfo.packageSpec) {\n return dependencyInfo;\n }\n\n return { ...dependencyInfo, version: declared };\n};\n\nexport abstract class Bundler extends MastraBundler {\n protected analyzeOutputDir = '.build';\n protected outputDir = 'output';\n protected platform: BundlerPlatform = 'node';\n\n constructor(name: string, component: 'BUNDLER' | 'DEPLOYER' = 'BUNDLER') {\n super({ name, component });\n }\n\n async prepare(outputDirectory: string): Promise<void> {\n // Clean up the output directory first\n await emptyDir(outputDirectory);\n\n await ensureDir(join(outputDirectory, this.analyzeOutputDir));\n await ensureDir(join(outputDirectory, this.outputDir));\n }\n\n async writePackageJson(\n outputDirectory: string,\n dependencies: Map<string, string | ExternalDependencyInfo>,\n resolutions?: Record<string, string>,\n ) {\n this.logger.debug(\"Writing project's package.json\");\n\n await ensureDir(outputDirectory);\n const pkgPath = join(outputDirectory, 'package.json');\n\n const dependenciesMap = new Map();\n for (const [key, value] of dependencies.entries()) {\n const dependencyValue = typeof value === 'string' ? value : (value.packageSpec ?? value.version ?? 'latest');\n if (key.startsWith('@')) {\n // Handle scoped packages (e.g. @org/package)\n const pkgChunks = key.split('/');\n dependenciesMap.set(`${pkgChunks[0]}/${pkgChunks[1]}`, dependencyValue);\n } else {\n // For non-scoped packages, take only the first part before any slash\n const pkgName = key.split('/')[0] || key;\n dependenciesMap.set(pkgName, dependencyValue);\n }\n }\n\n await writeFile(\n pkgPath,\n JSON.stringify(\n {\n name: 'server',\n version: '1.0.0',\n private: true,\n type: 'module',\n main: 'index.mjs',\n scripts: {\n start: 'node ./index.mjs',\n },\n dependencies: Object.fromEntries(dependenciesMap.entries()),\n ...(Object.keys(resolutions ?? {}).length > 0 && { resolutions }),\n },\n null,\n 2,\n ),\n );\n }\n\n protected createBundler(inputOptions: InputOptions, outputOptions: Partial<OutputOptions> & { dir: string }) {\n return createBundlerUtil(inputOptions, outputOptions);\n }\n\n protected async getUserBundlerOptions(\n mastraEntryFile: string,\n outputDirectory: string,\n ): Promise<NonNullable<Config['bundler']>> {\n const defaultBundlerOptions: Config['bundler'] = {\n externals: [],\n sourcemap: false,\n transpilePackages: [],\n [IS_DEFAULT]: true,\n } as const;\n\n try {\n const bundlerOptions = await getBundlerOptions(mastraEntryFile, outputDirectory);\n\n return bundlerOptions ?? defaultBundlerOptions;\n } catch (error) {\n this.logger.debug('Failed to get bundler options, sourcemap will be disabled', { error });\n }\n\n return defaultBundlerOptions;\n }\n\n protected async analyze(entry: string | string[], mastraFile: string, outputDirectory: string) {\n return await analyzeBundle(\n ([] as string[]).concat(entry),\n mastraFile,\n {\n outputDir: join(outputDirectory, this.analyzeOutputDir),\n projectRoot: outputDirectory,\n platform: this.platform,\n },\n this.logger,\n );\n }\n\n protected pnpmNodeLinker?: 'hoisted';\n\n protected async installDependencies(\n outputDirectory: string,\n rootDir = process.cwd(),\n pnpmOverrides?: Record<string, string>,\n ) {\n const deps = new DepsService(rootDir);\n deps.__setLogger(this.logger);\n\n await deps.install({\n dir: join(outputDirectory, this.outputDir),\n pnpmOverrides,\n pnpmNodeLinker: this.pnpmNodeLinker,\n });\n }\n\n /**\n * Generate a package-lock.json for the output directory so that deploy targets\n * can use `npm ci` instead of `npm install`, skipping version resolution entirely.\n * This is a lockfile-only operation — no packages are downloaded.\n *\n * Temporarily moves node_modules out of the way because pnpm's symlink-based\n * layout confuses npm's arborist, then restores it afterwards so that\n * `mastra start` (or wrangler) can still resolve dependencies at runtime.\n */\n private async generateNpmLockfile(outputDir: string): Promise<void> {\n const nodeModules = join(outputDir, 'node_modules');\n const nodeModulesTmp = join(outputDir, 'node_modules.__tmp');\n let movedNodeModules = false;\n try {\n // Move node_modules aside — pnpm's symlink layout confuses npm's arborist\n if (await fsExtra.pathExists(nodeModules)) {\n await fsExtra.move(nodeModules, nodeModulesTmp, { overwrite: true });\n movedNodeModules = true;\n }\n execSync('npm install --package-lock-only --force', {\n cwd: outputDir,\n stdio: 'pipe',\n timeout: 60_000,\n });\n } catch {\n this.logger.warn('Failed to generate package-lock.json — deploy will fall back to npm install');\n } finally {\n // Restore node_modules so runtime resolution works\n if (movedNodeModules) {\n await rm(nodeModules, { recursive: true, force: true });\n await fsExtra.move(nodeModulesTmp, nodeModules, { overwrite: true });\n }\n }\n }\n\n protected async copyPublic(mastraDir: string, outputDirectory: string) {\n const publicDir = join(mastraDir, 'public');\n\n try {\n await stat(publicDir);\n } catch {\n return;\n }\n\n await copy(publicDir, join(outputDirectory, this.outputDir));\n }\n\n protected async copyDOTNPMRC({\n rootDir = process.cwd(),\n outputDirectory,\n }: {\n rootDir?: string;\n outputDirectory: string;\n }) {\n const sourceDotNpmRcPath = join(rootDir, '.npmrc');\n const targetDotNpmRcPath = join(outputDirectory, this.outputDir, '.npmrc');\n\n try {\n await stat(sourceDotNpmRcPath);\n await copy(sourceDotNpmRcPath, targetDotNpmRcPath);\n } catch {\n return;\n }\n }\n\n /**\n * Writes the `mastra-project.json` deployment marker for Software Factory\n * projects after public assets have been copied. Verifies that the Factory\n * SPA (`factory/index.html`) exists in the output before emitting the marker.\n */\n protected async writeFactoryMarker(outputDirectory: string): Promise<void> {\n const outputDir = join(outputDirectory, this.outputDir);\n const factoryIndex = join(outputDir, 'factory', 'index.html');\n if (!existsSync(factoryIndex)) {\n throw new MastraError({\n id: 'DEPLOYER_BUNDLER_FACTORY_UI_MISSING',\n text: 'Software Factory project detected but factory/index.html was not found after copying the prebuilt Factory UI.',\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n });\n }\n await writeFile(\n join(outputDir, 'mastra-project.json'),\n JSON.stringify({ schemaVersion: 1, projectType: 'factory', assets: { ui: 'factory' } }, null, 2),\n );\n this.logger.info('Wrote mastra-project.json for Software Factory project');\n }\n\n protected async getBundlerOptions(\n serverFile: string,\n mastraEntryFile: string,\n analyzedBundleInfo: Awaited<ReturnType<typeof analyzeBundle>>,\n toolsPaths: (string | string[])[],\n { enableSourcemap, enableMinify, enableEsmShim, externals }: BundlerOptions,\n ) {\n const { workspaceRoot } = await getWorkspaceInformation({ mastraEntryFile });\n const closestPkgJson = pkg.up({ cwd: dirname(mastraEntryFile) });\n const projectRoot = closestPkgJson ? dirname(closestPkgJson) : process.cwd();\n\n const inputOptions: InputOptions = await getInputOptions(\n mastraEntryFile,\n analyzedBundleInfo,\n this.platform,\n {\n 'process.env.NODE_ENV': JSON.stringify('production'),\n },\n {\n sourcemap: enableSourcemap,\n minify: enableMinify,\n workspaceRoot,\n projectRoot,\n enableEsmShim,\n externalsPreset: externals === true,\n },\n );\n const isVirtual = serverFile.includes('\\n') || !existsSync(serverFile);\n const toolsInputOptions = await this.listToolsInputOptions(toolsPaths);\n\n if (isVirtual) {\n inputOptions.input = { index: '#entry', ...toolsInputOptions };\n\n if (Array.isArray(inputOptions.plugins)) {\n inputOptions.plugins.unshift(virtual({ '#entry': serverFile }));\n } else {\n inputOptions.plugins = [virtual({ '#entry': serverFile })];\n }\n } else {\n inputOptions.input = { index: serverFile, ...toolsInputOptions };\n }\n\n return inputOptions;\n }\n\n getAllToolPaths(mastraDir: string, toolsPaths: (string | string[])[] = []): (string | string[])[] {\n // Normalize Windows paths to forward slashes for consistent handling\n const normalizedMastraDir = slash(mastraDir);\n\n // Prepare default tools paths with glob patterns\n const defaultToolsPath = posix.join(normalizedMastraDir, 'tools/**/*.{js,ts}');\n const defaultToolsIgnorePaths = [\n `!${posix.join(normalizedMastraDir, 'tools/**/*.{test,spec}.{js,ts}')}`,\n `!${posix.join(normalizedMastraDir, 'tools/**/__tests__/**')}`,\n ];\n\n // Combine default path with ignore patterns\n const defaultPaths = [defaultToolsPath, ...defaultToolsIgnorePaths];\n\n // If no tools paths provided, use only the default paths\n if (toolsPaths.length === 0) {\n return [defaultPaths];\n }\n\n // If tools paths are provided, add the default paths to ensure standard tools are always included\n return [...toolsPaths, defaultPaths];\n }\n\n async listToolsInputOptions(toolsPaths: (string | string[])[]) {\n const inputs: Record<string, string> = {};\n\n for (const toolPath of toolsPaths) {\n const expandedPaths = await glob(toolPath, {\n absolute: true,\n expandDirectories: false,\n });\n\n for (const path of expandedPaths) {\n if (await fsExtra.pathExists(path)) {\n const fileService = new FileService();\n const entryFile = fileService.getFirstExistingFile([\n join(path, 'index.ts'),\n join(path, 'index.js'),\n path, // if path itself is a file\n ]);\n\n // if it doesn't exist or is a dir skip it. using a dir as a tool will crash the process\n if (!entryFile || (await stat(entryFile)).isDirectory()) {\n this.logger.warn('No entry file found, skipping', { path });\n continue;\n }\n\n const uniqueToolID = crypto.randomUUID();\n // Normalize Windows paths to forward slashes for consistent handling\n const normalizedEntryFile = entryFile.replaceAll('\\\\', '/');\n inputs[`tools/${uniqueToolID}`] = normalizedEntryFile;\n } else {\n this.logger.warn('Tool path does not exist, skipping', { path });\n }\n }\n }\n\n return inputs;\n }\n\n protected async _bundle(\n serverFile: string,\n mastraEntryFile: string,\n {\n projectRoot,\n outputDirectory,\n enableEsmShim = true,\n }: {\n projectRoot: string;\n outputDirectory: string;\n enableEsmShim?: boolean;\n },\n toolsPaths: (string | string[])[] = [],\n bundleLocation: string = join(outputDirectory, this.outputDir),\n ): Promise<void> {\n const analyzeDir = join(outputDirectory, this.analyzeOutputDir);\n\n const bundlerOptions = await this.getUserBundlerOptions(mastraEntryFile, outputDirectory);\n const internalBundlerOptions: BundlerOptions = {\n enableSourcemap: !!bundlerOptions.sourcemap,\n enableMinify: !!bundlerOptions.minify,\n externals: bundlerOptions.externals ?? [],\n enableEsmShim,\n dynamicPackages: bundlerOptions.dynamicPackages,\n };\n\n let analyzedBundleInfo;\n try {\n const resolvedToolsPaths = await this.listToolsInputOptions(toolsPaths);\n analyzedBundleInfo = await analyzeBundle(\n [serverFile, ...Object.values(resolvedToolsPaths)],\n mastraEntryFile,\n {\n outputDir: analyzeDir,\n projectRoot,\n platform: this.platform,\n bundlerOptions: internalBundlerOptions,\n },\n this.logger,\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw new MastraError(\n {\n id: 'DEPLOYER_BUNDLER_ANALYZE_FAILED',\n text: `Failed to analyze Mastra application: ${message}`,\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n },\n error,\n );\n }\n\n const { workspaceRoot } = await getWorkspaceInformation({ dir: projectRoot, mastraEntryFile });\n const sourceDependencyConstraints = await getSourceDependencyConstraints({\n projectRoot,\n mastraEntryFile,\n workspaceRoot,\n });\n const dependenciesToInstall = new Map<string, ExternalDependencyInfo>();\n for (const [dep, depInfo] of analyzedBundleInfo.externalDependencies) {\n if (analyzedBundleInfo.workspaceMap.has(dep) || !isBareModuleSpecifier(dep)) {\n continue;\n }\n\n dependenciesToInstall.set(dep, applySourceDependencyRange(dep, depInfo, sourceDependencyConstraints));\n }\n\n const initialWorkspaceDependencies = new Set<string>();\n for (const dep of analyzedBundleInfo.dependencies.keys()) {\n const pkgName = getPackageName(dep);\n if (pkgName && analyzedBundleInfo.workspaceMap.has(pkgName)) {\n initialWorkspaceDependencies.add(pkgName);\n }\n }\n\n const transitiveWorkspaceDependencies = collectTransitiveWorkspaceDependencies({\n workspaceMap: analyzedBundleInfo.workspaceMap,\n initialDependencies: initialWorkspaceDependencies,\n logger: this.logger,\n });\n\n for (const [dep, packageSpec] of Object.entries(transitiveWorkspaceDependencies.resolutions)) {\n dependenciesToInstall.set(dep, {\n version: analyzedBundleInfo.workspaceMap.get(dep)?.version,\n packageSpec,\n });\n }\n\n try {\n await this.writePackageJson(\n join(outputDirectory, this.outputDir),\n dependenciesToInstall,\n transitiveWorkspaceDependencies.resolutions,\n );\n if (transitiveWorkspaceDependencies.usedWorkspacePackages.size > 0) {\n await packWorkspaceDependencies({\n workspaceMap: analyzedBundleInfo.workspaceMap,\n usedWorkspacePackages: transitiveWorkspaceDependencies.usedWorkspacePackages,\n bundleOutputDir: join(outputDirectory, this.outputDir),\n logger: this.logger,\n });\n }\n\n this.logger.info('Bundling Mastra application');\n\n const inputOptions: InputOptions = await this.getBundlerOptions(\n serverFile,\n mastraEntryFile,\n analyzedBundleInfo,\n toolsPaths,\n internalBundlerOptions,\n );\n\n const bundler = await this.createBundler(\n {\n ...inputOptions,\n logLevel: inputOptions.logLevel === 'silent' ? 'warn' : inputOptions.logLevel,\n onwarn: warning => {\n if (warning.code === 'CIRCULAR_DEPENDENCY') {\n if (warning.ids?.[0]?.includes('node_modules')) {\n return;\n }\n\n this.logger.warn('Circular dependency found', {\n dependency: warning.message.replace('Circular dependency: ', ''),\n });\n }\n },\n },\n {\n dir: bundleLocation,\n manualChunks: {\n mastra: ['#mastra'],\n },\n sourcemap: internalBundlerOptions.enableSourcemap,\n },\n );\n\n await bundler.write();\n const toolImports: string[] = [];\n const toolsExports: string[] = [];\n Array.from(Object.keys(inputOptions.input || {}))\n .filter(key => key.startsWith('tools/'))\n .forEach((key, index) => {\n const toolExport = `tool${index}`;\n toolImports.push(`import * as ${toolExport} from './${key}.mjs';`);\n toolsExports.push(toolExport);\n });\n\n await writeFile(\n join(bundleLocation, 'tools.mjs'),\n `${toolImports.join('\\n')}\n\nexport const tools = [${toolsExports.join(', ')}]`,\n );\n this.logger.info('Bundling Mastra done');\n\n this.logger.info('Copying public files');\n await this.copyPublic(dirname(mastraEntryFile), outputDirectory);\n this.logger.info('Done copying public files');\n\n // For Software Factory projects, write a deterministic deployment marker\n // after public assets (including the SPA) have been copied.\n if (analyzedBundleInfo.projectType === 'factory') {\n await this.writeFactoryMarker(outputDirectory);\n }\n\n this.logger.info('Copying .npmrc file');\n await this.copyDOTNPMRC({ outputDirectory, rootDir: projectRoot });\n\n this.logger.info('Done copying .npmrc file');\n\n this.logger.info('Installing dependencies');\n await this.installDependencies(outputDirectory, projectRoot, transitiveWorkspaceDependencies.resolutions);\n this.logger.info('Done installing dependencies');\n\n if (Object.keys(transitiveWorkspaceDependencies.resolutions).length === 0) {\n this.logger.info('Generating package-lock.json for deploy');\n await this.generateNpmLockfile(join(outputDirectory, this.outputDir));\n this.logger.info('Done generating package-lock.json');\n } else {\n this.logger.warn(\n 'Skipping package-lock.json generation because the output contains packed workspace dependencies',\n );\n }\n } catch (error) {\n if (\n error instanceof MastraError &&\n (error.id === 'DEPLOYER_BUNDLER_FACTORY_UI_MISSING' || error.id === 'DEPLOYER_PNPM_IGNORED_BUILDS')\n ) {\n throw error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n throw new MastraError(\n {\n id: 'DEPLOYER_BUNDLER_BUNDLE_STAGE_FAILED',\n text: `Failed during bundler bundle stage: ${message}`,\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n },\n error,\n );\n }\n }\n\n async lint(_entryFile: string, _outputDirectory: string, toolsPaths: (string | string[])[]): Promise<void> {\n const toolsInputOptions = await this.listToolsInputOptions(toolsPaths);\n const toolsLength = Object.keys(toolsInputOptions).length;\n if (toolsLength > 0) {\n this.logger.info('Found tools', { count: toolsLength });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["createBundlerUtil"],"sources":["../../src/bundler/index.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join, posix } from 'node:path';\nimport { MastraBundler } from '@mastra/core/bundler';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport type { Config } from '@mastra/core/mastra';\nimport virtual from '@rollup/plugin-virtual';\nimport * as pkg from 'empathic/package';\nimport fsExtra, { copy, ensureDir, emptyDir, readJSON } from 'fs-extra/esm';\nimport type { InputOptions, OutputOptions } from 'rollup';\nimport { glob } from 'tinyglobby';\nimport { analyzeBundle } from '../build/analyze';\nimport { createBundler as createBundlerUtil, getInputOptions } from '../build/bundler';\nimport { getBundlerOptions } from '../build/bundlerOptions';\nimport type { BundlerOptions, ExternalDependencyInfo } from '../build/types';\nimport type { BundlerPlatform } from '../build/utils';\nimport { getPackageName, isBareModuleSpecifier, slash } from '../build/utils';\nimport { DepsService } from '../services/deps';\nimport { FileService } from '../services/fs';\nimport {\n collectTransitiveWorkspaceDependencies,\n getWorkspaceInformation,\n packWorkspaceDependencies,\n} from './workspaceDependencies';\n\nexport type { BundlerOptions, ExternalDependencyInfo } from '../build/types';\nexport type { BundlerPlatform } from '../build/utils';\n\nexport const IS_DEFAULT = Symbol('IS_DEFAULT');\n\nconst NPM_ALIAS_PREFIX = 'npm:';\n/** Characters a registry range or dist tag can contain. Protocols need `:`, git shorthand needs `/` or `#`. */\nconst REGISTRY_SPEC_PATTERN = /^[A-Za-z0-9.+_^~><=*|!\\s-]+$/;\nconst PACKAGE_NAME_PATTERN = /^(?:@[A-Za-z0-9._-]+\\/)?[A-Za-z0-9._-]+$/;\nconst TARBALL_SUFFIX_PATTERN = /\\.(?:tgz|tar\\.gz|tar)$/i;\n/** npm reads a value starting like this as a path, whatever follows. A bare `~` is a semver range. */\nconst FILE_SPEC_PREFIX_PATTERN = /^(?:\\.|~[/\\\\]|[/\\\\]|[A-Za-z]:[/\\\\])/;\n/** A range admitting any published version: `*`, `x`, `>=0`, and any union containing one. */\nconst UNBOUNDED_RANGE_PATTERN = /(?:^|\\|\\||\\s)\\s*(?:[*xX]|>=?\\s*0(?:\\.0)*(?:\\.0)*)\\s*(?:$|\\|\\|)/;\n\n/**\n * Constraints declared by the source app, plus the packages some resolution field pins.\n *\n * Only `dependencies` values are read. Override fields contribute names, never values: which of\n * `overrides`, `resolutions`, `pnpm.overrides` or `pnpm-workspace.yaml` a given install honoured\n * depends on the package manager and its version, so reproducing that precedence would mean\n * emulating three package managers. A name appearing in any of them is enough to know the resolved\n * version was chosen deliberately, which is all this needs.\n */\nexport type SourceDependencyConstraints = {\n dependencies: Record<string, string>;\n pinnedByResolutionField: Set<string>;\n};\n\nconst toStringRecord = (value: unknown): Record<string, string> => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n};\n\n/**\n * True when a specifier is something the isolated install in `.mastra/output` can resolve from the\n * registry: a semver range, a dist tag, a wildcard, or an npm alias whose target is a registry\n * package and range.\n *\n * This is an allowlist rather than a denylist of known protocols, so an unfamiliar protocol is\n * rejected without this code having to know it exists. The output directory is not a workspace, has\n * no catalog definitions and has a different relative-path base, so `catalog:`, `workspace:`,\n * `file:`, `link:` and git specifiers are all either uninstallable there or point somewhere else.\n */\nexport const isRegistryVersionSpec = (spec: string): boolean => {\n if (FILE_SPEC_PREFIX_PATTERN.test(spec) || TARBALL_SUFFIX_PATTERN.test(spec)) {\n return false;\n }\n\n if (spec.startsWith(NPM_ALIAS_PREFIX)) {\n const alias = spec.slice(NPM_ALIAS_PREFIX.length);\n // Skip index 0 so `npm:@scope/pkg` reads as an alias with no range rather than an empty name.\n const rangeSeparator = alias.lastIndexOf('@');\n const name = rangeSeparator > 0 ? alias.slice(0, rangeSeparator) : alias;\n const range = rangeSeparator > 0 ? alias.slice(rangeSeparator + 1) : '*';\n\n return PACKAGE_NAME_PATTERN.test(name) && isRegistryVersionSpec(range);\n }\n\n return REGISTRY_SPEC_PATTERN.test(spec);\n};\n\n/**\n * True when a specifier names a version the output install can be held to.\n *\n * A range admitting anything (`*`, `latest`, `>=0`, an alias with no range) is looser than the\n * version already resolved, so writing it would let a later install pull something the bundle was\n * never analyzed against.\n */\nconst isBoundedVersionSpec = (spec: string): boolean => {\n const range = spec.startsWith(NPM_ALIAS_PREFIX)\n ? (() => {\n const alias = spec.slice(NPM_ALIAS_PREFIX.length);\n const rangeSeparator = alias.lastIndexOf('@');\n return rangeSeparator > 0 ? alias.slice(rangeSeparator + 1) : '';\n })()\n : spec;\n\n return /\\d/.test(range) && !UNBOUNDED_RANGE_PATTERN.test(range);\n};\n\nconst readManifest = async (manifestPath: string | undefined): Promise<Record<string, unknown> | undefined> => {\n if (!manifestPath) {\n return undefined;\n }\n\n try {\n const manifest = await readJSON(manifestPath);\n return manifest && typeof manifest === 'object' ? manifest : undefined;\n } catch {\n // A manifest that cannot be read tells us nothing about intent.\n return undefined;\n }\n};\n\n/** Collect the package names a manifest's resolution fields pin, ignoring their values. */\nconst collectManifestPinnedNames = (manifest: Record<string, unknown> | undefined, pinned: Set<string>) => {\n const pnpmSection = manifest?.pnpm;\n const records = [\n manifest?.overrides,\n manifest?.resolutions,\n pnpmSection && typeof pnpmSection === 'object' ? (pnpmSection as { overrides?: unknown }).overrides : undefined,\n ];\n\n for (const record of records) {\n if (record && typeof record === 'object' && !Array.isArray(record)) {\n for (const key of Object.keys(record)) {\n pinned.add(key);\n }\n }\n }\n};\n\n/**\n * Collect the names under a top-level `overrides:` block in `pnpm-workspace.yaml`.\n *\n * pnpm moved overrides out of `package.json` into this file, so a workspace on a current pnpm keeps\n * them only here. Reading names off the indented block avoids a YAML dependency, the same tradeoff\n * `copyPnpmWorkspaceSettings` already makes for the top-level keys it copies.\n */\nconst collectPnpmWorkspacePinnedNames = (source: string, pinned: Set<string>) => {\n const lines = source.split(/\\r?\\n/);\n let insideOverrides = false;\n\n for (const line of lines) {\n if (/^\\S/.test(line)) {\n insideOverrides = /^overrides:\\s*$/.test(line);\n continue;\n }\n\n if (!insideOverrides) {\n continue;\n }\n\n const key = /^\\s+(?:'([^']+)'|\"([^\"]+)\"|([^'\"\\s:][^:]*?))\\s*:/.exec(line);\n if (key) {\n pinned.add((key[1] ?? key[2] ?? key[3] ?? '').trim());\n }\n }\n};\n\n/**\n * Read the constraints the source app declared.\n *\n * `dependencies` come from the manifest at `projectRoot`, the package the build was invoked for and\n * whose directory receives the output, falling back to the manifest above the entry file. Anchoring\n * on `projectRoot` rather than the entry file keeps the answer deterministic when the entry handed\n * to the bundler is a generated wrapper rather than the app's own source file.\n *\n * Resolution-field names are collected from both that manifest and the workspace root, including the\n * root `pnpm-workspace.yaml`, because a name pinned anywhere means the resolved version may have been\n * chosen deliberately rather than hoisted by accident.\n */\nexport const getSourceDependencyConstraints = async ({\n projectRoot,\n mastraEntryFile,\n workspaceRoot,\n}: {\n projectRoot: string;\n mastraEntryFile: string;\n workspaceRoot?: string;\n}): Promise<SourceDependencyConstraints> => {\n const manifestPaths = [pkg.up({ cwd: projectRoot }), pkg.up({ cwd: dirname(mastraEntryFile) })].filter(\n (entry, index, entries): entry is string => !!entry && entries.indexOf(entry) === index,\n );\n\n if (workspaceRoot) {\n manifestPaths.push(join(workspaceRoot, 'package.json'));\n }\n\n const pinnedByResolutionField = new Set<string>();\n let dependencies: Record<string, string> | undefined;\n\n for (const manifestPath of manifestPaths) {\n const manifest = await readManifest(manifestPath);\n if (!manifest) {\n continue;\n }\n\n // Nearest manifest wins, and an empty `dependencies` record is still that package's answer.\n dependencies ??= toStringRecord(manifest.dependencies);\n collectManifestPinnedNames(manifest, pinnedByResolutionField);\n }\n\n if (workspaceRoot) {\n try {\n collectPnpmWorkspacePinnedNames(\n await readFile(join(workspaceRoot, 'pnpm-workspace.yaml'), 'utf-8'),\n pinnedByResolutionField,\n );\n } catch {\n // No pnpm workspace config, or unreadable: nothing to learn from it.\n }\n }\n\n return { dependencies: dependencies ?? {}, pinnedByResolutionField };\n};\n\nconst findDeclaredConstraint = (\n constraints: SourceDependencyConstraints,\n dependencyName: string,\n): string | undefined => {\n const names = [dependencyName, getPackageName(dependencyName)].filter(\n (name, index, all): name is string => !!name && all.indexOf(name) === index,\n );\n\n for (const name of names) {\n // A pinned package's resolved version is the deliberate answer, so leave it as `main` wrote it.\n if (constraints.pinnedByResolutionField.has(name)) {\n return undefined;\n }\n }\n\n for (const name of names) {\n const declared = (constraints.dependencies[name] ?? '').trim();\n if (declared && isBoundedVersionSpec(declared) && isRegistryVersionSpec(declared)) {\n return declared;\n }\n }\n\n return undefined;\n};\n\n/**\n * Prefer the constraint the app declared over the version resolved from `node_modules`.\n *\n * The resolved version is whatever the install happened to hoist, so an app declaring `zod: ^4.3.6`\n * next to a hoisted `zod@3.25.76` gets the hoisted version written into the output manifest and the\n * isolated install then locks it in.\n */\nexport const applySourceDependencyRange = (\n dependencyName: string,\n dependencyInfo: ExternalDependencyInfo,\n constraints: SourceDependencyConstraints,\n): ExternalDependencyInfo => {\n const declared = findDeclaredConstraint(constraints, dependencyName);\n if (!declared) {\n return dependencyInfo;\n }\n\n if (declared.startsWith(NPM_ALIAS_PREFIX)) {\n return { ...dependencyInfo, packageSpec: declared };\n }\n\n // `packageSpec` is set only when the resolved package's own name differs from the requested one, so\n // a bare range under this key describes a different package and the resolved alias is the answer.\n if (dependencyInfo.packageSpec) {\n return dependencyInfo;\n }\n\n return { ...dependencyInfo, version: declared };\n};\n\nexport abstract class Bundler extends MastraBundler {\n protected analyzeOutputDir = '.build';\n protected outputDir = 'output';\n protected platform: BundlerPlatform = 'node';\n\n constructor(name: string, component: 'BUNDLER' | 'DEPLOYER' = 'BUNDLER') {\n super({ name, component });\n }\n\n async prepare(outputDirectory: string): Promise<void> {\n // Clean up the output directory first\n await emptyDir(outputDirectory);\n\n await ensureDir(join(outputDirectory, this.analyzeOutputDir));\n await ensureDir(join(outputDirectory, this.outputDir));\n }\n\n async writePackageJson(\n outputDirectory: string,\n dependencies: Map<string, string | ExternalDependencyInfo>,\n resolutions?: Record<string, string>,\n ) {\n this.logger.debug(\"Writing project's package.json\");\n\n await ensureDir(outputDirectory);\n const pkgPath = join(outputDirectory, 'package.json');\n\n const dependenciesMap = new Map();\n for (const [key, value] of dependencies.entries()) {\n const dependencyValue = typeof value === 'string' ? value : (value.packageSpec ?? value.version ?? 'latest');\n if (key.startsWith('@')) {\n // Handle scoped packages (e.g. @org/package)\n const pkgChunks = key.split('/');\n dependenciesMap.set(`${pkgChunks[0]}/${pkgChunks[1]}`, dependencyValue);\n } else {\n // For non-scoped packages, take only the first part before any slash\n const pkgName = key.split('/')[0] || key;\n dependenciesMap.set(pkgName, dependencyValue);\n }\n }\n\n await writeFile(\n pkgPath,\n JSON.stringify(\n {\n name: 'server',\n version: '1.0.0',\n private: true,\n type: 'module',\n main: 'index.mjs',\n scripts: {\n start: 'node ./index.mjs',\n },\n dependencies: Object.fromEntries(dependenciesMap.entries()),\n ...(Object.keys(resolutions ?? {}).length > 0 && { resolutions }),\n },\n null,\n 2,\n ),\n );\n }\n\n protected createBundler(inputOptions: InputOptions, outputOptions: Partial<OutputOptions> & { dir: string }) {\n return createBundlerUtil(inputOptions, outputOptions);\n }\n\n protected async getUserBundlerOptions(\n mastraEntryFile: string,\n outputDirectory: string,\n ): Promise<NonNullable<Config['bundler']>> {\n const defaultBundlerOptions: Config['bundler'] = {\n externals: [],\n sourcemap: false,\n transpilePackages: [],\n [IS_DEFAULT]: true,\n } as const;\n\n try {\n const bundlerOptions = await getBundlerOptions(mastraEntryFile, outputDirectory);\n\n return bundlerOptions ?? defaultBundlerOptions;\n } catch (error) {\n this.logger.debug('Failed to get bundler options, sourcemap will be disabled', { error });\n }\n\n return defaultBundlerOptions;\n }\n\n protected async analyze(entry: string | string[], mastraFile: string, outputDirectory: string) {\n return await analyzeBundle(\n ([] as string[]).concat(entry),\n mastraFile,\n {\n outputDir: join(outputDirectory, this.analyzeOutputDir),\n projectRoot: outputDirectory,\n platform: this.platform,\n },\n this.logger,\n );\n }\n\n protected pnpmNodeLinker?: 'hoisted';\n\n protected getAdditionalEntries(): Record<string, string> {\n return {};\n }\n\n protected async installDependencies(\n outputDirectory: string,\n rootDir = process.cwd(),\n pnpmOverrides?: Record<string, string>,\n ) {\n const deps = new DepsService(rootDir);\n deps.__setLogger(this.logger);\n\n await deps.install({\n dir: join(outputDirectory, this.outputDir),\n pnpmOverrides,\n pnpmNodeLinker: this.pnpmNodeLinker,\n });\n }\n\n /**\n * Generate a package-lock.json for the output directory so that deploy targets\n * can use `npm ci` instead of `npm install`, skipping version resolution entirely.\n * This is a lockfile-only operation — no packages are downloaded.\n *\n * Temporarily moves node_modules out of the way because pnpm's symlink-based\n * layout confuses npm's arborist, then restores it afterwards so that\n * `mastra start` (or wrangler) can still resolve dependencies at runtime.\n */\n private async generateNpmLockfile(outputDir: string): Promise<void> {\n const nodeModules = join(outputDir, 'node_modules');\n const nodeModulesTmp = join(outputDir, 'node_modules.__tmp');\n let movedNodeModules = false;\n try {\n // Move node_modules aside — pnpm's symlink layout confuses npm's arborist\n if (await fsExtra.pathExists(nodeModules)) {\n await fsExtra.move(nodeModules, nodeModulesTmp, { overwrite: true });\n movedNodeModules = true;\n }\n execSync('npm install --package-lock-only --force', {\n cwd: outputDir,\n stdio: 'pipe',\n timeout: 60_000,\n });\n } catch {\n this.logger.warn('Failed to generate package-lock.json — deploy will fall back to npm install');\n } finally {\n // Restore node_modules so runtime resolution works\n if (movedNodeModules) {\n await rm(nodeModules, { recursive: true, force: true });\n await fsExtra.move(nodeModulesTmp, nodeModules, { overwrite: true });\n }\n }\n }\n\n protected async copyPublic(mastraDir: string, outputDirectory: string) {\n const publicDir = join(mastraDir, 'public');\n\n try {\n await stat(publicDir);\n } catch {\n return;\n }\n\n await copy(publicDir, join(outputDirectory, this.outputDir));\n }\n\n protected async copyDOTNPMRC({\n rootDir = process.cwd(),\n outputDirectory,\n }: {\n rootDir?: string;\n outputDirectory: string;\n }) {\n const sourceDotNpmRcPath = join(rootDir, '.npmrc');\n const targetDotNpmRcPath = join(outputDirectory, this.outputDir, '.npmrc');\n\n try {\n await stat(sourceDotNpmRcPath);\n await copy(sourceDotNpmRcPath, targetDotNpmRcPath);\n } catch {\n return;\n }\n }\n\n /**\n * Writes the `mastra-project.json` deployment marker for Software Factory\n * projects after public assets have been copied. Verifies that the Factory\n * SPA (`factory/index.html`) exists in the output before emitting the marker.\n */\n protected async writeFactoryMarker(outputDirectory: string): Promise<void> {\n const outputDir = join(outputDirectory, this.outputDir);\n const factoryIndex = join(outputDir, 'factory', 'index.html');\n if (!existsSync(factoryIndex)) {\n throw new MastraError({\n id: 'DEPLOYER_BUNDLER_FACTORY_UI_MISSING',\n text: 'Software Factory project detected but factory/index.html was not found after copying the prebuilt Factory UI.',\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n });\n }\n await writeFile(\n join(outputDir, 'mastra-project.json'),\n JSON.stringify({ schemaVersion: 1, projectType: 'factory', assets: { ui: 'factory' } }, null, 2),\n );\n this.logger.info('Wrote mastra-project.json for Software Factory project');\n }\n\n protected async getBundlerOptions(\n serverFile: string,\n mastraEntryFile: string,\n analyzedBundleInfo: Awaited<ReturnType<typeof analyzeBundle>>,\n toolsPaths: (string | string[])[],\n { enableSourcemap, enableMinify, enableEsmShim, externals }: BundlerOptions,\n additionalEntries: Record<string, string>,\n ) {\n const { workspaceRoot } = await getWorkspaceInformation({ mastraEntryFile });\n const closestPkgJson = pkg.up({ cwd: dirname(mastraEntryFile) });\n const projectRoot = closestPkgJson ? dirname(closestPkgJson) : process.cwd();\n\n const inputOptions: InputOptions = await getInputOptions(\n mastraEntryFile,\n analyzedBundleInfo,\n this.platform,\n {\n 'process.env.NODE_ENV': JSON.stringify('production'),\n },\n {\n sourcemap: enableSourcemap,\n minify: enableMinify,\n workspaceRoot,\n projectRoot,\n enableEsmShim,\n externalsPreset: externals === true,\n },\n );\n const toolsInputOptions = await this.listToolsInputOptions(toolsPaths);\n const entryInputs: Record<string, string> = {};\n const virtualEntries: Record<string, string> = {};\n const entries = { index: serverFile, ...additionalEntries };\n\n for (const [name, entry] of Object.entries(entries)) {\n if (entry.includes('\\n') || !existsSync(entry)) {\n const virtualId = name === 'index' ? '#entry' : `#entry-${name}`;\n entryInputs[name] = virtualId;\n virtualEntries[virtualId] = entry;\n } else {\n entryInputs[name] = entry;\n }\n }\n\n inputOptions.input = { ...entryInputs, ...toolsInputOptions };\n\n if (Object.keys(virtualEntries).length > 0) {\n if (Array.isArray(inputOptions.plugins)) {\n inputOptions.plugins.unshift(virtual(virtualEntries));\n } else {\n inputOptions.plugins = [virtual(virtualEntries)];\n }\n }\n\n return inputOptions;\n }\n\n getAllToolPaths(mastraDir: string, toolsPaths: (string | string[])[] = []): (string | string[])[] {\n // Normalize Windows paths to forward slashes for consistent handling\n const normalizedMastraDir = slash(mastraDir);\n\n // Prepare default tools paths with glob patterns\n const defaultToolsPath = posix.join(normalizedMastraDir, 'tools/**/*.{js,ts}');\n const defaultToolsIgnorePaths = [\n `!${posix.join(normalizedMastraDir, 'tools/**/*.{test,spec}.{js,ts}')}`,\n `!${posix.join(normalizedMastraDir, 'tools/**/__tests__/**')}`,\n ];\n\n // Combine default path with ignore patterns\n const defaultPaths = [defaultToolsPath, ...defaultToolsIgnorePaths];\n\n // If no tools paths provided, use only the default paths\n if (toolsPaths.length === 0) {\n return [defaultPaths];\n }\n\n // If tools paths are provided, add the default paths to ensure standard tools are always included\n return [...toolsPaths, defaultPaths];\n }\n\n async listToolsInputOptions(toolsPaths: (string | string[])[]) {\n const inputs: Record<string, string> = {};\n\n for (const toolPath of toolsPaths) {\n const expandedPaths = await glob(toolPath, {\n absolute: true,\n expandDirectories: false,\n });\n\n for (const path of expandedPaths) {\n if (await fsExtra.pathExists(path)) {\n const fileService = new FileService();\n const entryFile = fileService.getFirstExistingFile([\n join(path, 'index.ts'),\n join(path, 'index.js'),\n path, // if path itself is a file\n ]);\n\n // if it doesn't exist or is a dir skip it. using a dir as a tool will crash the process\n if (!entryFile || (await stat(entryFile)).isDirectory()) {\n this.logger.warn('No entry file found, skipping', { path });\n continue;\n }\n\n const uniqueToolID = crypto.randomUUID();\n // Normalize Windows paths to forward slashes for consistent handling\n const normalizedEntryFile = entryFile.replaceAll('\\\\', '/');\n inputs[`tools/${uniqueToolID}`] = normalizedEntryFile;\n } else {\n this.logger.warn('Tool path does not exist, skipping', { path });\n }\n }\n }\n\n return inputs;\n }\n\n protected async _bundle(\n serverFile: string,\n mastraEntryFile: string,\n {\n projectRoot,\n outputDirectory,\n enableEsmShim = true,\n }: {\n projectRoot: string;\n outputDirectory: string;\n enableEsmShim?: boolean;\n },\n toolsPaths: (string | string[])[] = [],\n bundleLocation: string = join(outputDirectory, this.outputDir),\n ): Promise<void> {\n const analyzeDir = join(outputDirectory, this.analyzeOutputDir);\n const additionalEntries = this.getAdditionalEntries();\n\n const bundlerOptions = await this.getUserBundlerOptions(mastraEntryFile, outputDirectory);\n const internalBundlerOptions: BundlerOptions = {\n enableSourcemap: !!bundlerOptions.sourcemap,\n enableMinify: !!bundlerOptions.minify,\n externals: bundlerOptions.externals ?? [],\n enableEsmShim,\n dynamicPackages: bundlerOptions.dynamicPackages,\n };\n\n let analyzedBundleInfo;\n try {\n const resolvedToolsPaths = await this.listToolsInputOptions(toolsPaths);\n analyzedBundleInfo = await analyzeBundle(\n [serverFile, ...Object.values(additionalEntries), ...Object.values(resolvedToolsPaths)],\n mastraEntryFile,\n {\n outputDir: analyzeDir,\n projectRoot,\n platform: this.platform,\n bundlerOptions: internalBundlerOptions,\n },\n this.logger,\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw new MastraError(\n {\n id: 'DEPLOYER_BUNDLER_ANALYZE_FAILED',\n text: `Failed to analyze Mastra application: ${message}`,\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n },\n error,\n );\n }\n\n const { workspaceRoot } = await getWorkspaceInformation({ dir: projectRoot, mastraEntryFile });\n const sourceDependencyConstraints = await getSourceDependencyConstraints({\n projectRoot,\n mastraEntryFile,\n workspaceRoot,\n });\n const dependenciesToInstall = new Map<string, ExternalDependencyInfo>();\n for (const [dep, depInfo] of analyzedBundleInfo.externalDependencies) {\n if (analyzedBundleInfo.workspaceMap.has(dep) || !isBareModuleSpecifier(dep)) {\n continue;\n }\n\n dependenciesToInstall.set(dep, applySourceDependencyRange(dep, depInfo, sourceDependencyConstraints));\n }\n\n const initialWorkspaceDependencies = new Set<string>();\n for (const dep of analyzedBundleInfo.dependencies.keys()) {\n const pkgName = getPackageName(dep);\n if (pkgName && analyzedBundleInfo.workspaceMap.has(pkgName)) {\n initialWorkspaceDependencies.add(pkgName);\n }\n }\n\n const transitiveWorkspaceDependencies = collectTransitiveWorkspaceDependencies({\n workspaceMap: analyzedBundleInfo.workspaceMap,\n initialDependencies: initialWorkspaceDependencies,\n logger: this.logger,\n });\n\n for (const [dep, packageSpec] of Object.entries(transitiveWorkspaceDependencies.resolutions)) {\n dependenciesToInstall.set(dep, {\n version: analyzedBundleInfo.workspaceMap.get(dep)?.version,\n packageSpec,\n });\n }\n\n try {\n await this.writePackageJson(\n join(outputDirectory, this.outputDir),\n dependenciesToInstall,\n transitiveWorkspaceDependencies.resolutions,\n );\n if (transitiveWorkspaceDependencies.usedWorkspacePackages.size > 0) {\n await packWorkspaceDependencies({\n workspaceMap: analyzedBundleInfo.workspaceMap,\n usedWorkspacePackages: transitiveWorkspaceDependencies.usedWorkspacePackages,\n bundleOutputDir: join(outputDirectory, this.outputDir),\n logger: this.logger,\n });\n }\n\n this.logger.info('Bundling Mastra application');\n\n const inputOptions: InputOptions = await this.getBundlerOptions(\n serverFile,\n mastraEntryFile,\n analyzedBundleInfo,\n toolsPaths,\n internalBundlerOptions,\n additionalEntries,\n );\n\n const bundler = await this.createBundler(\n {\n ...inputOptions,\n logLevel: inputOptions.logLevel === 'silent' ? 'warn' : inputOptions.logLevel,\n onwarn: warning => {\n if (warning.code === 'CIRCULAR_DEPENDENCY') {\n if (warning.ids?.[0]?.includes('node_modules')) {\n return;\n }\n\n this.logger.warn('Circular dependency found', {\n dependency: warning.message.replace('Circular dependency: ', ''),\n });\n }\n },\n },\n {\n dir: bundleLocation,\n manualChunks: {\n mastra: ['#mastra'],\n },\n sourcemap: internalBundlerOptions.enableSourcemap,\n },\n );\n\n await bundler.write();\n const toolImports: string[] = [];\n const toolsExports: string[] = [];\n Array.from(Object.keys(inputOptions.input || {}))\n .filter(key => key.startsWith('tools/'))\n .forEach((key, index) => {\n const toolExport = `tool${index}`;\n toolImports.push(`import * as ${toolExport} from './${key}.mjs';`);\n toolsExports.push(toolExport);\n });\n\n await writeFile(\n join(bundleLocation, 'tools.mjs'),\n `${toolImports.join('\\n')}\n\nexport const tools = [${toolsExports.join(', ')}]`,\n );\n this.logger.info('Bundling Mastra done');\n\n this.logger.info('Copying public files');\n await this.copyPublic(dirname(mastraEntryFile), outputDirectory);\n this.logger.info('Done copying public files');\n\n // For Software Factory projects, write a deterministic deployment marker\n // after public assets (including the SPA) have been copied.\n if (analyzedBundleInfo.projectType === 'factory') {\n await this.writeFactoryMarker(outputDirectory);\n }\n\n this.logger.info('Copying .npmrc file');\n await this.copyDOTNPMRC({ outputDirectory, rootDir: projectRoot });\n\n this.logger.info('Done copying .npmrc file');\n\n this.logger.info('Installing dependencies');\n await this.installDependencies(outputDirectory, projectRoot, transitiveWorkspaceDependencies.resolutions);\n this.logger.info('Done installing dependencies');\n\n if (Object.keys(transitiveWorkspaceDependencies.resolutions).length === 0) {\n this.logger.info('Generating package-lock.json for deploy');\n await this.generateNpmLockfile(join(outputDirectory, this.outputDir));\n this.logger.info('Done generating package-lock.json');\n } else {\n this.logger.warn(\n 'Skipping package-lock.json generation because the output contains packed workspace dependencies',\n );\n }\n } catch (error) {\n if (\n error instanceof MastraError &&\n (error.id === 'DEPLOYER_BUNDLER_FACTORY_UI_MISSING' || error.id === 'DEPLOYER_PNPM_IGNORED_BUILDS')\n ) {\n throw error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n throw new MastraError(\n {\n id: 'DEPLOYER_BUNDLER_BUNDLE_STAGE_FAILED',\n text: `Failed during bundler bundle stage: ${message}`,\n domain: ErrorDomain.DEPLOYER,\n category: ErrorCategory.SYSTEM,\n },\n error,\n );\n }\n }\n\n async lint(_entryFile: string, _outputDirectory: string, toolsPaths: (string | string[])[]): Promise<void> {\n const toolsInputOptions = await this.listToolsInputOptions(toolsPaths);\n const toolsLength = Object.keys(toolsInputOptions).length;\n if (toolsLength > 0) {\n this.logger.info('Found tools', { count: toolsLength });\n }\n }\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ name: mastra-deployer
3
3
  description: Documentation for @mastra/deployer. Use when working with @mastra/deployer APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/deployer"
6
- version: "1.63.0-alpha.0"
6
+ version: "1.63.0"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.63.0-alpha.0",
2
+ "version": "1.63.0",
3
3
  "package": "@mastra/deployer",
4
4
  "exports": {},
5
5
  "modules": {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/deployer",
3
- "version": "1.63.0-alpha.0",
3
+ "version": "1.63.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "files": [
@@ -112,7 +112,7 @@
112
112
  "typescript-paths": "^1.5.2",
113
113
  "ws": "^8.21.0",
114
114
  "yaml": "^2.9.0",
115
- "@mastra/server": "1.63.0-alpha.0"
115
+ "@mastra/server": "1.63.0"
116
116
  },
117
117
  "devDependencies": {
118
118
  "@hono/node-server": "^2.0.0",
@@ -132,13 +132,13 @@
132
132
  "typescript": "^6.0.3",
133
133
  "vitest": "4.1.10",
134
134
  "zod": "^4.4.3",
135
- "@internal/lint": "0.0.126",
136
- "@internal/types-builder": "0.0.101",
135
+ "@internal/lint": "0.0.127",
136
+ "@internal/types-builder": "0.0.102",
137
137
  "@mastra/agent-browser": "0.5.1",
138
- "@mastra/hono": "1.7.3-alpha.0",
139
- "@mastra/core": "1.63.0-alpha.0",
138
+ "@mastra/core": "1.63.0",
139
+ "@mastra/hono": "1.7.3",
140
140
  "@mastra/mcp": "^1.17.2",
141
- "@mastra/server": "1.63.0-alpha.0"
141
+ "@mastra/server": "1.63.0"
142
142
  },
143
143
  "peerDependencies": {
144
144
  "@mastra/core": ">=1.50.0-0 <2.0.0-0"