@workflow/builders 5.0.0-beta.3 → 5.0.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base-builder.d.ts +69 -2
- package/dist/base-builder.d.ts.map +1 -1
- package/dist/base-builder.js +368 -19
- package/dist/base-builder.js.map +1 -1
- package/dist/config-helpers.d.ts +2 -1
- package/dist/config-helpers.d.ts.map +1 -1
- package/dist/config-helpers.js +1 -0
- package/dist/config-helpers.js.map +1 -1
- package/dist/constants.d.ts +3 -13
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -13
- package/dist/constants.js.map +1 -1
- package/dist/discover-entries-esbuild-plugin.d.ts.map +1 -1
- package/dist/discover-entries-esbuild-plugin.js +16 -1
- package/dist/discover-entries-esbuild-plugin.js.map +1 -1
- package/dist/external-package-warning.test.d.ts +2 -0
- package/dist/external-package-warning.test.d.ts.map +1 -0
- package/dist/external-package-warning.test.js +219 -0
- package/dist/external-package-warning.test.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/module-specifier.d.ts.map +1 -1
- package/dist/module-specifier.js +47 -9
- package/dist/module-specifier.js.map +1 -1
- package/dist/module-specifier.test.js +20 -0
- package/dist/module-specifier.test.js.map +1 -1
- package/dist/node-module-esbuild-plugin.d.ts.map +1 -1
- package/dist/node-module-esbuild-plugin.js +72 -22
- package/dist/node-module-esbuild-plugin.js.map +1 -1
- package/dist/node-module-esbuild-plugin.test.js +96 -0
- package/dist/node-module-esbuild-plugin.test.js.map +1 -1
- package/dist/resolve-sourcemap.test.d.ts +2 -0
- package/dist/resolve-sourcemap.test.d.ts.map +1 -0
- package/dist/resolve-sourcemap.test.js +126 -0
- package/dist/resolve-sourcemap.test.js.map +1 -0
- package/dist/standalone.d.ts +0 -3
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +10 -39
- package/dist/standalone.js.map +1 -1
- package/dist/swc-esbuild-plugin.d.ts +9 -0
- package/dist/swc-esbuild-plugin.d.ts.map +1 -1
- package/dist/swc-esbuild-plugin.js +63 -8
- package/dist/swc-esbuild-plugin.js.map +1 -1
- package/dist/swc-esbuild-plugin.test.js +279 -3
- package/dist/swc-esbuild-plugin.test.js.map +1 -1
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vercel-build-output-api.d.ts +0 -2
- package/dist/vercel-build-output-api.d.ts.map +1 -1
- package/dist/vercel-build-output-api.js +24 -55
- package/dist/vercel-build-output-api.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-specifier.js","sourceRoot":"","sources":["../src/module-specifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\n\n/**\n * Result of resolving a module specifier for a file.\n */\nexport interface ModuleSpecifierResult {\n /**\n * The module specifier to use for ID generation.\n * - For packages: \"{name}@{version}\" or \"{name}/{subpath}@{version}\"\n * (e.g., \"point@1.0.0\", \"@myorg/shared@2.0.0\", \"workflow/internal/builtins@4.0.0\")\n * - For local files: undefined (plugin will use default \"./relative/path\" format)\n */\n moduleSpecifier: string | undefined;\n}\n\n/**\n * Parsed package.json data with directory information.\n */\ninterface PackageInfo {\n name: string;\n version: string;\n dir: string;\n exports?: Record<string, unknown>;\n main?: string;\n module?: string;\n}\n\n/**\n * Cache for package.json lookups to avoid repeated filesystem reads.\n * Maps directory path to parsed package.json info or null if not found.\n */\nconst packageJsonCache = new Map<string, PackageInfo | null>();\n\n/**\n * Find and read the nearest package.json for a given file path.\n * Results are cached for performance.\n */\nfunction findPackageJson(filePath: string): PackageInfo | null {\n let dir = dirname(filePath);\n\n // Track directories we've visited so we can back-fill the cache\n const visitedDirs: string[] = [];\n\n // Walk up the directory tree until we hit the root\n while (dir !== dirname(dir)) {\n // Check cache first\n const cached = packageJsonCache.get(dir);\n if (cached !== undefined) {\n // Back-fill cache for all visited directories with the same result\n for (const visitedDir of visitedDirs) {\n packageJsonCache.set(visitedDir, cached);\n }\n return cached;\n }\n\n visitedDirs.push(dir);\n\n const packageJsonPath = join(dir, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8');\n const parsed = JSON.parse(content);\n if (parsed.name && parsed.version) {\n const result: PackageInfo = {\n name: parsed.name,\n version: parsed.version,\n dir,\n exports: parsed.exports,\n main: parsed.main,\n module: parsed.module,\n };\n // Cache the result for this directory and all visited directories\n packageJsonCache.set(dir, result);\n for (const visitedDir of visitedDirs) {\n packageJsonCache.set(visitedDir, result);\n }\n return result;\n }\n } catch {\n // Invalid JSON or missing fields, continue searching\n }\n }\n\n dir = dirname(dir);\n }\n\n // No package.json found - cache null for all visited directories\n for (const visitedDir of visitedDirs) {\n packageJsonCache.set(visitedDir, null);\n }\n\n return null;\n}\n\n/**\n * Resolve the export subpath for a file within a package.\n * Looks up the package.json exports field to find which subpath maps to the file.\n *\n * @param filePath - Absolute path to the file\n * @param pkg - Package info from findPackageJson\n * @returns The subpath (e.g., \"/internal/builtins\") or empty string for root export\n */\nfunction resolveExportSubpath(filePath: string, pkg: PackageInfo): string {\n if (!pkg.exports || typeof pkg.exports !== 'object') {\n return '';\n }\n\n // Get the relative path from package root to the file\n const normalizedFilePath = filePath.replace(/\\\\/g, '/');\n const normalizedPkgDir = pkg.dir.replace(/\\\\/g, '/');\n const relativePath = normalizedFilePath.startsWith(normalizedPkgDir + '/')\n ? './' + normalizedFilePath.substring(normalizedPkgDir.length + 1)\n : null;\n\n if (!relativePath) {\n return '';\n }\n\n // Search through exports to find a matching subpath\n for (const [subpath, target] of Object.entries(pkg.exports)) {\n const resolvedTarget = resolveExportTarget(target);\n if (\n resolvedTarget &&\n normalizeExportPath(resolvedTarget) === relativePath\n ) {\n // Found a match - return the subpath without the leading \".\"\n // e.g., \"./internal/builtins\" -> \"/internal/builtins\"\n return subpath === '.' ? '' : subpath.substring(1);\n }\n }\n\n return '';\n}\n\n/**\n * Resolve an export target to a file path, handling conditional exports and arrays.\n */\nfunction resolveExportTarget(target: unknown): string | null {\n if (typeof target === 'string') {\n return target;\n }\n\n // Handle array exports (fallback chains)\n if (Array.isArray(target)) {\n for (const item of target) {\n const resolved = resolveExportTarget(item);\n if (resolved) return resolved;\n }\n return null;\n }\n\n if (target && typeof target === 'object') {\n // Conditional export - try common conditions in order of preference\n const conditions = ['workflow', 'default', 'require', 'import', 'node'];\n for (const condition of conditions) {\n const value = (target as Record<string, unknown>)[condition];\n if (typeof value === 'string') {\n return value;\n }\n // Handle nested conditionals or arrays\n if (value && typeof value === 'object') {\n const nested = resolveExportTarget(value);\n if (nested) return nested;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Normalize an export path for comparison.\n */\nfunction normalizeExportPath(path: string): string {\n // Ensure it starts with ./\n if (!path.startsWith('./')) {\n return './' + path;\n }\n return path;\n}\n\n/**\n * Check if a file path is inside node_modules.\n */\nfunction isInNodeModules(filePath: string): boolean {\n const normalizedPath = filePath.split(sep).join('/');\n return normalizedPath.includes('/node_modules/');\n}\n\n/**\n * Cache for project dependencies to avoid repeated filesystem reads.\n * Maps project root to set of dependency package names.\n */\nconst projectDepsCache = new Map<string, Set<string>>();\n\n/**\n * Get all dependencies (including devDependencies) for a project.\n */\nfunction getProjectDependencies(projectRoot: string): Set<string> {\n const cached = projectDepsCache.get(projectRoot);\n if (cached) {\n return cached;\n }\n\n const deps = new Set<string>();\n const pkgPath = join(projectRoot, 'package.json');\n\n if (existsSync(pkgPath)) {\n try {\n const content = readFileSync(pkgPath, 'utf-8');\n const parsed = JSON.parse(content);\n\n // Collect all dependency types\n for (const depType of [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n ]) {\n const depObj = parsed[depType];\n if (depObj && typeof depObj === 'object') {\n for (const name of Object.keys(depObj)) {\n deps.add(name);\n }\n }\n }\n } catch {\n // Invalid JSON or file not readable\n }\n }\n\n projectDepsCache.set(projectRoot, deps);\n return deps;\n}\n\n/**\n * Check if a file path is inside a workspace package that is a dependency of the project.\n * This is a heuristic - we check if the file is in a directory with a package.json\n * that has a \"name\" field, is NOT in node_modules, and is listed as a dependency\n * of the project.\n */\nfunction isWorkspacePackage(filePath: string, projectRoot: string): boolean {\n if (isInNodeModules(filePath)) {\n return false;\n }\n\n const pkg = findPackageJson(filePath);\n if (!pkg) {\n return false;\n }\n\n // Check if the package.json is not the root package.json\n // Use resolve() to normalize paths for cross-platform comparison\n const rootPkgDir = resolve(projectRoot);\n const pkgDir = resolve(pkg.dir);\n\n // If the package directory is the project root, it's not a workspace package\n if (pkgDir === rootPkgDir) {\n return false;\n }\n\n // Found a package.json that's not the root.\n // Only treat it as a workspace package if it's actually a dependency\n // of the current project. This prevents sibling apps in a monorepo\n // from being incorrectly treated as importable packages.\n const projectDeps = getProjectDependencies(projectRoot);\n return projectDeps.has(pkg.name);\n}\n\n/**\n * Resolve the module specifier for a file.\n *\n * @param filePath - Absolute path to the file being transformed\n * @param projectRoot - Absolute path to the project root (usually process.cwd())\n * @returns The module specifier result\n *\n * @example\n * // File in node_modules (root export)\n * resolveModuleSpecifier('/project/node_modules/point/dist/index.js', '/project')\n * // => { moduleSpecifier: 'point@1.0.0' }\n *\n * @example\n * // File in node_modules (subpath export)\n * resolveModuleSpecifier('/project/node_modules/workflow/dist/internal/builtins.js', '/project')\n * // => { moduleSpecifier: 'workflow/internal/builtins@4.0.0' }\n *\n * @example\n * // File in workspace package\n * resolveModuleSpecifier('/project/packages/shared/src/utils.ts', '/project')\n * // => { moduleSpecifier: '@myorg/shared@0.0.0' }\n *\n * @example\n * // Local app file\n * resolveModuleSpecifier('/project/src/workflows/order.ts', '/project')\n * // => { moduleSpecifier: undefined }\n */\nexport function resolveModuleSpecifier(\n filePath: string,\n projectRoot: string\n): ModuleSpecifierResult {\n // Check if file is in node_modules or a workspace package\n const inNodeModules = isInNodeModules(filePath);\n const inWorkspace =\n !inNodeModules && isWorkspacePackage(filePath, projectRoot);\n\n if (!inNodeModules && !inWorkspace) {\n // Local app file - use default relative path format\n return { moduleSpecifier: undefined };\n }\n\n // Find the package.json for this file\n const pkg = findPackageJson(filePath);\n if (!pkg) {\n // Couldn't find package.json - fall back to default\n return { moduleSpecifier: undefined };\n }\n\n // Resolve the export subpath (e.g., \"/internal/builtins\" for \"workflow/internal/builtins\")\n const subpath = resolveExportSubpath(filePath, pkg);\n\n // Return the module specifier as \"name/subpath@version\" or \"name@version\"\n const specifier = subpath\n ? `${pkg.name}${subpath}@${pkg.version}`\n : `${pkg.name}@${pkg.version}`;\n\n return {\n moduleSpecifier: specifier,\n };\n}\n\n/**\n * Clear the package.json cache. Useful for testing or when package.json files may have changed.\n */\nexport function clearModuleSpecifierCache(): void {\n packageJsonCache.clear();\n projectDepsCache.clear();\n}\n\n/**\n * Convert a file path to a relative import path from project root.\n */\nfunction toRelativeImportPath(filePath: string, projectRoot: string): string {\n const normalizedProjectRoot = projectRoot.replace(/\\\\/g, '/');\n const normalizedFilePath = filePath.replace(/\\\\/g, '/');\n\n let relativePath: string;\n if (normalizedFilePath.startsWith(normalizedProjectRoot + '/')) {\n relativePath = normalizedFilePath.substring(\n normalizedProjectRoot.length + 1\n );\n } else {\n // File is outside project root, use the full path segments after common ancestor\n relativePath = relative(projectRoot, filePath).replace(/\\\\/g, '/');\n }\n\n // Ensure relative paths start with ./\n if (!relativePath.startsWith('.')) {\n relativePath = `./${relativePath}`;\n }\n\n return relativePath;\n}\n\n/**\n * Returns true when package exports include a root entry (\".\").\n * String/array/conditional object exports are all considered root exports.\n */\nfunction hasRootExport(exportsField: unknown): boolean {\n if (typeof exportsField === 'string' || Array.isArray(exportsField)) {\n return true;\n }\n\n if (!exportsField || typeof exportsField !== 'object') {\n return false;\n }\n\n const keys = Object.keys(exportsField as Record<string, unknown>);\n // Conditional exports object (e.g. { \"import\": \"...\", \"default\": \"...\" })\n // represents the root export.\n if (keys.length > 0 && keys.every((key) => !key.startsWith('.'))) {\n return true;\n }\n\n return '.' in (exportsField as Record<string, unknown>);\n}\n\n/**\n * Normalize a package target path to a comparable package-relative path.\n * Returns null for invalid/unsupported paths.\n */\nfunction normalizePackageTargetPath(path: string): string | null {\n const normalized = path.replace(/\\\\/g, '/');\n if (normalized.startsWith('./')) {\n return normalized.substring(2);\n }\n if (normalized.startsWith('/')) {\n return normalized.substring(1);\n }\n return normalized;\n}\n\n/**\n * Returns true if filePath is the package root entrypoint.\n * This checks root exports first, then main/module/index fallbacks when exports are absent.\n */\nfunction isRootEntrypointFile(filePath: string, pkg: PackageInfo): boolean {\n const normalizedFilePath = filePath.replace(/\\\\/g, '/');\n const normalizedPkgDir = pkg.dir.replace(/\\\\/g, '/');\n\n if (!normalizedFilePath.startsWith(normalizedPkgDir + '/')) {\n return false;\n }\n\n const relativeFilePath = normalizedFilePath.substring(\n normalizedPkgDir.length + 1\n );\n\n if (pkg.exports) {\n let rootTarget: unknown;\n\n if (\n typeof pkg.exports === 'object' &&\n !Array.isArray(pkg.exports) &&\n '.' in pkg.exports\n ) {\n rootTarget = (pkg.exports as Record<string, unknown>)['.'];\n } else if (hasRootExport(pkg.exports)) {\n rootTarget = pkg.exports;\n } else {\n return false;\n }\n\n const resolvedTarget = resolveExportTarget(rootTarget);\n if (!resolvedTarget) {\n return false;\n }\n\n const normalizedTarget = normalizePackageTargetPath(resolvedTarget);\n return normalizedTarget === relativeFilePath;\n }\n\n const rootCandidates = [\n pkg.module,\n pkg.main,\n 'index.js',\n 'index.mjs',\n 'index.cjs',\n 'index.ts',\n 'index.mts',\n 'index.cts',\n ]\n .filter((candidate): candidate is string => typeof candidate === 'string')\n .map((candidate) => normalizePackageTargetPath(candidate))\n .filter((candidate): candidate is string => candidate !== null);\n\n return rootCandidates.includes(relativeFilePath);\n}\n\n/**\n * Result of resolving an import path for a file.\n */\nexport interface ImportPathResult {\n /**\n * The import path to use.\n * - For workspace packages: the package name (e.g., \"@myorg/shared\")\n * - For node_modules packages: the package name\n * - For local files: a relative path (e.g., \"./src/workflows/order.ts\")\n */\n importPath: string;\n\n /**\n * Whether this file is from a package (workspace or node_modules).\n * When true, the import should go through package resolution which respects export conditions.\n */\n isPackage: boolean;\n}\n\n/**\n * Get the import path to use for a file in a bundle's virtual entry.\n *\n * For workspace packages and node_modules packages, returns the package name\n * so that bundler resolution will respect package.json exports and conditions.\n *\n * For local app files, returns a relative path.\n *\n * @param filePath - Absolute path to the file\n * @param projectRoot - Absolute path to the project root\n * @returns The import path and whether it's a package\n *\n * @example\n * // Workspace package\n * getImportPath('/project/packages/shared/src/index.ts', '/project')\n * // => { importPath: '@myorg/shared', isPackage: true }\n *\n * @example\n * // Local app file\n * getImportPath('/project/src/workflows/order.ts', '/project')\n * // => { importPath: './src/workflows/order.ts', isPackage: false }\n */\nexport function getImportPath(\n filePath: string,\n projectRoot: string\n): ImportPathResult {\n // Check if file is in node_modules or a workspace package\n const inNodeModules = isInNodeModules(filePath);\n const inWorkspace =\n !inNodeModules && isWorkspacePackage(filePath, projectRoot);\n\n if (inNodeModules || inWorkspace) {\n // Find the package.json for this file\n const pkg = findPackageJson(filePath);\n if (pkg) {\n const isDirectProjectDependency = getProjectDependencies(projectRoot).has(\n pkg.name\n );\n const canUsePackageSpecifier = inWorkspace || isDirectProjectDependency;\n\n // For transitive node_modules dependencies under strict package managers\n // (for example, pnpm), importing by package name can fail. Use a direct\n // file path import in those cases.\n if (!canUsePackageSpecifier) {\n return {\n importPath: toRelativeImportPath(filePath, projectRoot),\n isPackage: false,\n };\n }\n\n // Prefer a package subpath import when this file maps to an export.\n // This preserves the exact module being bundled while still respecting\n // package export conditions.\n // Note: resolveExportSubpath returns \"\" for both root \".\" matches and\n // no match; root entrypoints are intentionally handled below via\n // isRootEntrypointFile().\n const subpath = resolveExportSubpath(filePath, pkg);\n if (subpath) {\n return {\n importPath: `${pkg.name}${subpath}`,\n isPackage: true,\n };\n }\n\n // Only import package root when this file is the root entrypoint.\n // For deep/internal files, fall back to direct relative imports so we\n // don't accidentally import a non-existent or different module.\n if (!isRootEntrypointFile(filePath, pkg)) {\n return {\n importPath: toRelativeImportPath(filePath, projectRoot),\n isPackage: false,\n };\n }\n\n return {\n importPath: pkg.name,\n isPackage: true,\n };\n }\n }\n\n // Local app file - use relative path\n return {\n importPath: toRelativeImportPath(filePath, projectRoot),\n isPackage: false,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"module-specifier.js","sourceRoot":"","sources":["../src/module-specifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\n\n/**\n * Result of resolving a module specifier for a file.\n */\nexport interface ModuleSpecifierResult {\n /**\n * The module specifier to use for ID generation.\n * - For packages: \"{name}@{version}\" or \"{name}/{subpath}@{version}\"\n * (e.g., \"point@1.0.0\", \"@myorg/shared@2.0.0\", \"workflow/internal/builtins@4.0.0\")\n * - For local files: undefined (plugin will use default \"./relative/path\" format)\n */\n moduleSpecifier: string | undefined;\n}\n\n/**\n * Parsed package.json data with directory information.\n */\ninterface PackageInfo {\n name: string;\n version: string;\n dir: string;\n exports?: Record<string, unknown>;\n main?: string;\n module?: string;\n}\n\n/**\n * Cache for package.json lookups to avoid repeated filesystem reads.\n * Maps directory path to parsed package.json info or null if not found.\n */\nconst packageJsonCache = new Map<string, PackageInfo | null>();\n\n/**\n * Find and read the nearest package.json for a given file path.\n * Results are cached for performance.\n */\nfunction findPackageJson(filePath: string): PackageInfo | null {\n let dir = dirname(filePath);\n\n // Track directories we've visited so we can back-fill the cache\n const visitedDirs: string[] = [];\n\n // Walk up the directory tree until we hit the root\n while (dir !== dirname(dir)) {\n // Check cache first\n const cached = packageJsonCache.get(dir);\n if (cached !== undefined) {\n // Back-fill cache for all visited directories with the same result\n for (const visitedDir of visitedDirs) {\n packageJsonCache.set(visitedDir, cached);\n }\n return cached;\n }\n\n visitedDirs.push(dir);\n\n const packageJsonPath = join(dir, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8');\n const parsed = JSON.parse(content);\n if (parsed.name && parsed.version) {\n const result: PackageInfo = {\n name: parsed.name,\n version: parsed.version,\n dir,\n exports: parsed.exports,\n main: parsed.main,\n module: parsed.module,\n };\n // Cache the result for this directory and all visited directories\n packageJsonCache.set(dir, result);\n for (const visitedDir of visitedDirs) {\n packageJsonCache.set(visitedDir, result);\n }\n return result;\n }\n } catch {\n // Invalid JSON or missing fields, continue searching\n }\n }\n\n dir = dirname(dir);\n }\n\n // No package.json found - cache null for all visited directories\n for (const visitedDir of visitedDirs) {\n packageJsonCache.set(visitedDir, null);\n }\n\n return null;\n}\n\n/**\n * Resolve the export subpath for a file within a package.\n * Looks up the package.json exports field to find which subpath maps to the file.\n *\n * @param filePath - Absolute path to the file\n * @param pkg - Package info from findPackageJson\n * @returns The subpath (e.g., \"/internal/builtins\") or empty string for root export\n */\nfunction toPackageRelativePath(\n filePath: string,\n pkg: PackageInfo\n): string | null {\n const normalizedFilePath = filePath.replace(/\\\\/g, '/');\n const normalizedPkgDir = pkg.dir.replace(/\\\\/g, '/');\n if (!normalizedFilePath.startsWith(normalizedPkgDir + '/')) {\n return null;\n }\n\n return normalizedFilePath.substring(normalizedPkgDir.length + 1);\n}\n\nfunction getSourceFallbackExportTargets(relativePath: string): string[] {\n const fallbackTargets = new Set<string>();\n const extensionFallbacks: Record<string, string[]> = {\n '.ts': ['.js'],\n '.tsx': ['.js'],\n '.mts': ['.mjs'],\n '.cts': ['.cjs'],\n '.jsx': ['.js'],\n };\n\n const extensionMatch = relativePath.match(/(\\.[^./\\\\]+)$/);\n const extension = extensionMatch?.[1]?.toLowerCase();\n if (!extension) {\n return [];\n }\n\n const pathWithoutExtension = relativePath.slice(0, -extension.length);\n const extensionTargets = extensionFallbacks[extension] ?? [];\n for (const fallbackExtension of extensionTargets) {\n fallbackTargets.add(`${pathWithoutExtension}${fallbackExtension}`);\n }\n\n if (relativePath.startsWith('src/')) {\n const distPathWithoutPrefix = relativePath.slice('src/'.length);\n for (const fallbackExtension of extensionTargets) {\n fallbackTargets.add(\n `dist/${distPathWithoutPrefix.slice(0, -extension.length)}${fallbackExtension}`\n );\n }\n }\n\n return Array.from(fallbackTargets);\n}\n\nfunction resolveExportSubpath(\n filePath: string,\n pkg: PackageInfo,\n options?: { allowSourceFallback?: boolean }\n): string {\n if (!pkg.exports || typeof pkg.exports !== 'object') {\n return '';\n }\n\n const relativePath = toPackageRelativePath(filePath, pkg);\n if (!relativePath) {\n return '';\n }\n\n const comparableTargets = new Set([`./${relativePath}`]);\n if (options?.allowSourceFallback) {\n for (const fallbackTarget of getSourceFallbackExportTargets(relativePath)) {\n comparableTargets.add(`./${fallbackTarget}`);\n }\n }\n\n // Search through exports to find a matching subpath\n for (const [subpath, target] of Object.entries(pkg.exports)) {\n const resolvedTarget = resolveExportTarget(target);\n if (\n resolvedTarget &&\n comparableTargets.has(normalizeExportPath(resolvedTarget))\n ) {\n // Found a match - return the subpath without the leading \".\"\n // e.g., \"./internal/builtins\" -> \"/internal/builtins\"\n return subpath === '.' ? '' : subpath.substring(1);\n }\n }\n\n return '';\n}\n\n/**\n * Resolve an export target to a file path, handling conditional exports and arrays.\n */\nfunction resolveExportTarget(target: unknown): string | null {\n if (typeof target === 'string') {\n return target;\n }\n\n // Handle array exports (fallback chains)\n if (Array.isArray(target)) {\n for (const item of target) {\n const resolved = resolveExportTarget(item);\n if (resolved) return resolved;\n }\n return null;\n }\n\n if (target && typeof target === 'object') {\n // Conditional export - try common conditions in order of preference\n const conditions = ['workflow', 'default', 'require', 'import', 'node'];\n for (const condition of conditions) {\n const value = (target as Record<string, unknown>)[condition];\n if (typeof value === 'string') {\n return value;\n }\n // Handle nested conditionals or arrays\n if (value && typeof value === 'object') {\n const nested = resolveExportTarget(value);\n if (nested) return nested;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Normalize an export path for comparison.\n */\nfunction normalizeExportPath(path: string): string {\n // Ensure it starts with ./\n if (!path.startsWith('./')) {\n return './' + path;\n }\n return path;\n}\n\n/**\n * Check if a file path is inside node_modules.\n */\nfunction isInNodeModules(filePath: string): boolean {\n const normalizedPath = filePath.split(sep).join('/');\n return normalizedPath.includes('/node_modules/');\n}\n\n/**\n * Cache for project dependencies to avoid repeated filesystem reads.\n * Maps project root to set of dependency package names.\n */\nconst projectDepsCache = new Map<string, Set<string>>();\n\n/**\n * Get all dependencies (including devDependencies) for a project.\n */\nfunction getProjectDependencies(projectRoot: string): Set<string> {\n const cached = projectDepsCache.get(projectRoot);\n if (cached) {\n return cached;\n }\n\n const deps = new Set<string>();\n const pkgPath = join(projectRoot, 'package.json');\n\n if (existsSync(pkgPath)) {\n try {\n const content = readFileSync(pkgPath, 'utf-8');\n const parsed = JSON.parse(content);\n\n // Collect all dependency types\n for (const depType of [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n ]) {\n const depObj = parsed[depType];\n if (depObj && typeof depObj === 'object') {\n for (const name of Object.keys(depObj)) {\n deps.add(name);\n }\n }\n }\n } catch {\n // Invalid JSON or file not readable\n }\n }\n\n projectDepsCache.set(projectRoot, deps);\n return deps;\n}\n\n/**\n * Check if a file path is inside a workspace package that is a dependency of the project.\n * This is a heuristic - we check if the file is in a directory with a package.json\n * that has a \"name\" field, is NOT in node_modules, and is listed as a dependency\n * of the project.\n */\nfunction isWorkspacePackage(filePath: string, projectRoot: string): boolean {\n if (isInNodeModules(filePath)) {\n return false;\n }\n\n const pkg = findPackageJson(filePath);\n if (!pkg) {\n return false;\n }\n\n // Check if the package.json is not the root package.json\n // Use resolve() to normalize paths for cross-platform comparison\n const rootPkgDir = resolve(projectRoot);\n const pkgDir = resolve(pkg.dir);\n\n // If the package directory is the project root, it's not a workspace package\n if (pkgDir === rootPkgDir) {\n return false;\n }\n\n // Found a package.json that's not the root.\n // Only treat it as a workspace package if it's actually a dependency\n // of the current project. This prevents sibling apps in a monorepo\n // from being incorrectly treated as importable packages.\n const projectDeps = getProjectDependencies(projectRoot);\n return projectDeps.has(pkg.name);\n}\n\n/**\n * Resolve the module specifier for a file.\n *\n * @param filePath - Absolute path to the file being transformed\n * @param projectRoot - Absolute path to the project root (usually process.cwd())\n * @returns The module specifier result\n *\n * @example\n * // File in node_modules (root export)\n * resolveModuleSpecifier('/project/node_modules/point/dist/index.js', '/project')\n * // => { moduleSpecifier: 'point@1.0.0' }\n *\n * @example\n * // File in node_modules (subpath export)\n * resolveModuleSpecifier('/project/node_modules/workflow/dist/internal/builtins.js', '/project')\n * // => { moduleSpecifier: 'workflow/internal/builtins@4.0.0' }\n *\n * @example\n * // File in workspace package\n * resolveModuleSpecifier('/project/packages/shared/src/utils.ts', '/project')\n * // => { moduleSpecifier: '@myorg/shared@0.0.0' }\n *\n * @example\n * // Local app file\n * resolveModuleSpecifier('/project/src/workflows/order.ts', '/project')\n * // => { moduleSpecifier: undefined }\n */\nexport function resolveModuleSpecifier(\n filePath: string,\n projectRoot: string\n): ModuleSpecifierResult {\n // Check if file is in node_modules or a workspace package\n const inNodeModules = isInNodeModules(filePath);\n const inWorkspace =\n !inNodeModules && isWorkspacePackage(filePath, projectRoot);\n\n if (!inNodeModules && !inWorkspace) {\n // Local app file - use default relative path format\n return { moduleSpecifier: undefined };\n }\n\n // Find the package.json for this file\n const pkg = findPackageJson(filePath);\n if (!pkg) {\n // Couldn't find package.json - fall back to default\n return { moduleSpecifier: undefined };\n }\n\n // Resolve the export subpath (e.g., \"/internal/builtins\" for \"workflow/internal/builtins\")\n const subpath = resolveExportSubpath(filePath, pkg, {\n allowSourceFallback: true,\n });\n\n // Return the module specifier as \"name/subpath@version\" or \"name@version\"\n const specifier = subpath\n ? `${pkg.name}${subpath}@${pkg.version}`\n : `${pkg.name}@${pkg.version}`;\n\n return {\n moduleSpecifier: specifier,\n };\n}\n\n/**\n * Clear the package.json cache. Useful for testing or when package.json files may have changed.\n */\nexport function clearModuleSpecifierCache(): void {\n packageJsonCache.clear();\n projectDepsCache.clear();\n}\n\n/**\n * Convert a file path to a relative import path from project root.\n */\nfunction toRelativeImportPath(filePath: string, projectRoot: string): string {\n const normalizedProjectRoot = projectRoot.replace(/\\\\/g, '/');\n const normalizedFilePath = filePath.replace(/\\\\/g, '/');\n\n let relativePath: string;\n if (normalizedFilePath.startsWith(normalizedProjectRoot + '/')) {\n relativePath = normalizedFilePath.substring(\n normalizedProjectRoot.length + 1\n );\n } else {\n // File is outside project root, use the full path segments after common ancestor\n relativePath = relative(projectRoot, filePath).replace(/\\\\/g, '/');\n }\n\n // Ensure relative paths start with ./\n if (!relativePath.startsWith('.')) {\n relativePath = `./${relativePath}`;\n }\n\n return relativePath;\n}\n\n/**\n * Returns true when package exports include a root entry (\".\").\n * String/array/conditional object exports are all considered root exports.\n */\nfunction hasRootExport(exportsField: unknown): boolean {\n if (typeof exportsField === 'string' || Array.isArray(exportsField)) {\n return true;\n }\n\n if (!exportsField || typeof exportsField !== 'object') {\n return false;\n }\n\n const keys = Object.keys(exportsField as Record<string, unknown>);\n // Conditional exports object (e.g. { \"import\": \"...\", \"default\": \"...\" })\n // represents the root export.\n if (keys.length > 0 && keys.every((key) => !key.startsWith('.'))) {\n return true;\n }\n\n return '.' in (exportsField as Record<string, unknown>);\n}\n\n/**\n * Normalize a package target path to a comparable package-relative path.\n * Returns null for invalid/unsupported paths.\n */\nfunction normalizePackageTargetPath(path: string): string | null {\n const normalized = path.replace(/\\\\/g, '/');\n if (normalized.startsWith('./')) {\n return normalized.substring(2);\n }\n if (normalized.startsWith('/')) {\n return normalized.substring(1);\n }\n return normalized;\n}\n\n/**\n * Returns true if filePath is the package root entrypoint.\n * This checks root exports first, then main/module/index fallbacks when exports are absent.\n */\nfunction isRootEntrypointFile(filePath: string, pkg: PackageInfo): boolean {\n const normalizedFilePath = filePath.replace(/\\\\/g, '/');\n const normalizedPkgDir = pkg.dir.replace(/\\\\/g, '/');\n\n if (!normalizedFilePath.startsWith(normalizedPkgDir + '/')) {\n return false;\n }\n\n const relativeFilePath = normalizedFilePath.substring(\n normalizedPkgDir.length + 1\n );\n\n if (pkg.exports) {\n let rootTarget: unknown;\n\n if (\n typeof pkg.exports === 'object' &&\n !Array.isArray(pkg.exports) &&\n '.' in pkg.exports\n ) {\n rootTarget = (pkg.exports as Record<string, unknown>)['.'];\n } else if (hasRootExport(pkg.exports)) {\n rootTarget = pkg.exports;\n } else {\n return false;\n }\n\n const resolvedTarget = resolveExportTarget(rootTarget);\n if (!resolvedTarget) {\n return false;\n }\n\n const normalizedTarget = normalizePackageTargetPath(resolvedTarget);\n return normalizedTarget === relativeFilePath;\n }\n\n const rootCandidates = [\n pkg.module,\n pkg.main,\n 'index.js',\n 'index.mjs',\n 'index.cjs',\n 'index.ts',\n 'index.mts',\n 'index.cts',\n ]\n .filter((candidate): candidate is string => typeof candidate === 'string')\n .map((candidate) => normalizePackageTargetPath(candidate))\n .filter((candidate): candidate is string => candidate !== null);\n\n return rootCandidates.includes(relativeFilePath);\n}\n\n/**\n * Result of resolving an import path for a file.\n */\nexport interface ImportPathResult {\n /**\n * The import path to use.\n * - For workspace packages: the package name (e.g., \"@myorg/shared\")\n * - For node_modules packages: the package name\n * - For local files: a relative path (e.g., \"./src/workflows/order.ts\")\n */\n importPath: string;\n\n /**\n * Whether this file is from a package (workspace or node_modules).\n * When true, the import should go through package resolution which respects export conditions.\n */\n isPackage: boolean;\n}\n\n/**\n * Get the import path to use for a file in a bundle's virtual entry.\n *\n * For workspace packages and node_modules packages, returns the package name\n * so that bundler resolution will respect package.json exports and conditions.\n *\n * For local app files, returns a relative path.\n *\n * @param filePath - Absolute path to the file\n * @param projectRoot - Absolute path to the project root\n * @returns The import path and whether it's a package\n *\n * @example\n * // Workspace package\n * getImportPath('/project/packages/shared/src/index.ts', '/project')\n * // => { importPath: '@myorg/shared', isPackage: true }\n *\n * @example\n * // Local app file\n * getImportPath('/project/src/workflows/order.ts', '/project')\n * // => { importPath: './src/workflows/order.ts', isPackage: false }\n */\nexport function getImportPath(\n filePath: string,\n projectRoot: string\n): ImportPathResult {\n // Check if file is in node_modules or a workspace package\n const inNodeModules = isInNodeModules(filePath);\n const inWorkspace =\n !inNodeModules && isWorkspacePackage(filePath, projectRoot);\n\n if (inNodeModules || inWorkspace) {\n // Find the package.json for this file\n const pkg = findPackageJson(filePath);\n if (pkg) {\n const isDirectProjectDependency = getProjectDependencies(projectRoot).has(\n pkg.name\n );\n const canUsePackageSpecifier = inWorkspace || isDirectProjectDependency;\n\n // For transitive node_modules dependencies under strict package managers\n // (for example, pnpm), importing by package name can fail. Use a direct\n // file path import in those cases.\n if (!canUsePackageSpecifier) {\n return {\n importPath: toRelativeImportPath(filePath, projectRoot),\n isPackage: false,\n };\n }\n\n // Prefer a package subpath import when this file maps to an export.\n // This preserves the exact module being bundled while still respecting\n // package export conditions.\n // Note: resolveExportSubpath returns \"\" for both root \".\" matches and\n // no match; root entrypoints are intentionally handled below via\n // isRootEntrypointFile().\n const subpath = resolveExportSubpath(filePath, pkg);\n if (subpath) {\n return {\n importPath: `${pkg.name}${subpath}`,\n isPackage: true,\n };\n }\n\n // Only import package root when this file is the root entrypoint.\n // For deep/internal files, fall back to direct relative imports so we\n // don't accidentally import a non-existent or different module.\n if (!isRootEntrypointFile(filePath, pkg)) {\n return {\n importPath: toRelativeImportPath(filePath, projectRoot),\n isPackage: false,\n };\n }\n\n return {\n importPath: pkg.name,\n isPackage: true,\n };\n }\n }\n\n // Local app file - use relative path\n return {\n importPath: toRelativeImportPath(filePath, projectRoot),\n isPackage: false,\n };\n}\n"]}
|
|
@@ -236,5 +236,25 @@ describe('getImportPath', () => {
|
|
|
236
236
|
moduleSpecifier: 'vade@0.0.0',
|
|
237
237
|
});
|
|
238
238
|
});
|
|
239
|
+
it('preserves package export subpaths when source files back dist exports', () => {
|
|
240
|
+
const projectRoot = join(testRoot, 'apps/chat');
|
|
241
|
+
const workspacePkgDir = join(testRoot, 'packages/agent');
|
|
242
|
+
const filePath = join(workspacePkgDir, 'src/server.ts');
|
|
243
|
+
writeJson(join(projectRoot, 'package.json'), {
|
|
244
|
+
name: 'chat',
|
|
245
|
+
dependencies: { '@internal/agent': 'workspace:*' },
|
|
246
|
+
});
|
|
247
|
+
writeJson(join(workspacePkgDir, 'package.json'), {
|
|
248
|
+
name: '@internal/agent',
|
|
249
|
+
version: '1.0.0',
|
|
250
|
+
exports: {
|
|
251
|
+
'./server': './dist/server.js',
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
writeFile(filePath, `'use step';\n`);
|
|
255
|
+
expect(resolveModuleSpecifier(filePath, projectRoot)).toEqual({
|
|
256
|
+
moduleSpecifier: '@internal/agent/server@1.0.0',
|
|
257
|
+
});
|
|
258
|
+
});
|
|
239
259
|
});
|
|
240
260
|
//# sourceMappingURL=module-specifier.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-specifier.test.js","sourceRoot":"","sources":["../src/module-specifier.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest';\nimport {\n clearModuleSpecifierCache,\n getImportPath,\n resolveModuleSpecifier,\n} from './module-specifier.js';\n\nfunction writeJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(value, null, 2), 'utf-8');\n}\n\nfunction writeFile(path: string, contents = ''): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, contents, 'utf-8');\n}\n\ndescribe('getImportPath', () => {\n let testRoot: string;\n\n beforeEach(() => {\n clearModuleSpecifierCache();\n testRoot = mkdtempSync(join(tmpdir(), 'workflow-module-specifier-'));\n });\n\n afterEach(() => {\n clearModuleSpecifierCache();\n rmSync(testRoot, { recursive: true, force: true });\n });\n\n it('uses package subpath import when file matches an export subpath', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/server.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n exports: {\n './server': './src/server.ts',\n },\n });\n\n writeFile(filePath, `'use step';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@internal/agent/server',\n isPackage: true,\n });\n });\n\n it('falls back to relative import when package has no root export', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/server.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n exports: {\n './server': './dist/server.js',\n },\n });\n\n writeFile(filePath, `'use step';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '../../packages/agent/src/server.ts',\n isPackage: false,\n });\n });\n\n it('uses package root import for root exports', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/index.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n exports: {\n '.': './src/index.ts',\n },\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@internal/agent',\n isPackage: true,\n });\n });\n\n it('uses package root import when package module points to file', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/index.mjs');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n module: './src/index.mjs',\n main: './dist/index.cjs',\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@internal/agent',\n isPackage: true,\n });\n });\n\n it('uses package root import for conditional root exports', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/index.js');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n exports: {\n '.': {\n import: './src/index.mjs',\n default: './src/index.js',\n },\n },\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@internal/agent',\n isPackage: true,\n });\n });\n\n it('falls back to relative import for deep files in packages without exports', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'lib/tools/dynamic/workflow.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '../../packages/agent/lib/tools/dynamic/workflow.ts',\n isPackage: false,\n });\n });\n\n it('uses package root import when package main points to file', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/index.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n main: './src/index.ts',\n });\n\n writeFile(filePath, `'use step';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@internal/agent',\n isPackage: true,\n });\n });\n\n it('uses package subpath import for direct node_modules dependencies', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const packageDir = join(testRoot, 'apps/chat/node_modules/@workflow/core');\n const filePath = join(packageDir, 'dist/serialization.js');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@workflow/core': '1.0.0' },\n });\n\n writeJson(join(packageDir, 'package.json'), {\n name: '@workflow/core',\n version: '1.0.0',\n exports: {\n './serialization': './dist/serialization.js',\n },\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@workflow/core/serialization',\n isPackage: true,\n });\n });\n\n it('falls back to relative import for transitive node_modules dependencies', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const packageDir = join(testRoot, 'apps/chat/node_modules/@workflow/core');\n const filePath = join(packageDir, 'dist/serialization.js');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { workflow: '1.0.0' },\n });\n\n writeJson(join(packageDir, 'package.json'), {\n name: '@workflow/core',\n version: '1.0.0',\n exports: {\n './serialization': './dist/serialization.js',\n },\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: './node_modules/@workflow/core/dist/serialization.js',\n isPackage: false,\n });\n });\n\n it('treats a workspace package file as local when projectRoot is the package itself', () => {\n const projectRoot = join(testRoot, 'packages/vade');\n const filePath = join(\n projectRoot,\n 'src/internal/message/workflow/handle-message.ts'\n );\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'vade',\n version: '0.0.0',\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(resolveModuleSpecifier(filePath, projectRoot)).toEqual({\n moduleSpecifier: undefined,\n });\n });\n\n it('uses the consuming app root to resolve workspace package workflow ids', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const packageDir = join(testRoot, 'packages/vade');\n const filePath = join(\n packageDir,\n 'src/internal/message/workflow/handle-message.ts'\n );\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { vade: 'workspace:*' },\n });\n\n writeJson(join(packageDir, 'package.json'), {\n name: 'vade',\n version: '0.0.0',\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(resolveModuleSpecifier(filePath, projectRoot)).toEqual({\n moduleSpecifier: 'vade@0.0.0',\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"module-specifier.test.js","sourceRoot":"","sources":["../src/module-specifier.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest';\nimport {\n clearModuleSpecifierCache,\n getImportPath,\n resolveModuleSpecifier,\n} from './module-specifier.js';\n\nfunction writeJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(value, null, 2), 'utf-8');\n}\n\nfunction writeFile(path: string, contents = ''): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, contents, 'utf-8');\n}\n\ndescribe('getImportPath', () => {\n let testRoot: string;\n\n beforeEach(() => {\n clearModuleSpecifierCache();\n testRoot = mkdtempSync(join(tmpdir(), 'workflow-module-specifier-'));\n });\n\n afterEach(() => {\n clearModuleSpecifierCache();\n rmSync(testRoot, { recursive: true, force: true });\n });\n\n it('uses package subpath import when file matches an export subpath', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/server.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n exports: {\n './server': './src/server.ts',\n },\n });\n\n writeFile(filePath, `'use step';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@internal/agent/server',\n isPackage: true,\n });\n });\n\n it('falls back to relative import when package has no root export', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/server.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n exports: {\n './server': './dist/server.js',\n },\n });\n\n writeFile(filePath, `'use step';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '../../packages/agent/src/server.ts',\n isPackage: false,\n });\n });\n\n it('uses package root import for root exports', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/index.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n exports: {\n '.': './src/index.ts',\n },\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@internal/agent',\n isPackage: true,\n });\n });\n\n it('uses package root import when package module points to file', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/index.mjs');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n module: './src/index.mjs',\n main: './dist/index.cjs',\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@internal/agent',\n isPackage: true,\n });\n });\n\n it('uses package root import for conditional root exports', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/index.js');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n exports: {\n '.': {\n import: './src/index.mjs',\n default: './src/index.js',\n },\n },\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@internal/agent',\n isPackage: true,\n });\n });\n\n it('falls back to relative import for deep files in packages without exports', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'lib/tools/dynamic/workflow.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '../../packages/agent/lib/tools/dynamic/workflow.ts',\n isPackage: false,\n });\n });\n\n it('uses package root import when package main points to file', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/index.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n main: './src/index.ts',\n });\n\n writeFile(filePath, `'use step';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@internal/agent',\n isPackage: true,\n });\n });\n\n it('uses package subpath import for direct node_modules dependencies', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const packageDir = join(testRoot, 'apps/chat/node_modules/@workflow/core');\n const filePath = join(packageDir, 'dist/serialization.js');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@workflow/core': '1.0.0' },\n });\n\n writeJson(join(packageDir, 'package.json'), {\n name: '@workflow/core',\n version: '1.0.0',\n exports: {\n './serialization': './dist/serialization.js',\n },\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: '@workflow/core/serialization',\n isPackage: true,\n });\n });\n\n it('falls back to relative import for transitive node_modules dependencies', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const packageDir = join(testRoot, 'apps/chat/node_modules/@workflow/core');\n const filePath = join(packageDir, 'dist/serialization.js');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { workflow: '1.0.0' },\n });\n\n writeJson(join(packageDir, 'package.json'), {\n name: '@workflow/core',\n version: '1.0.0',\n exports: {\n './serialization': './dist/serialization.js',\n },\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(getImportPath(filePath, projectRoot)).toEqual({\n importPath: './node_modules/@workflow/core/dist/serialization.js',\n isPackage: false,\n });\n });\n\n it('treats a workspace package file as local when projectRoot is the package itself', () => {\n const projectRoot = join(testRoot, 'packages/vade');\n const filePath = join(\n projectRoot,\n 'src/internal/message/workflow/handle-message.ts'\n );\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'vade',\n version: '0.0.0',\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(resolveModuleSpecifier(filePath, projectRoot)).toEqual({\n moduleSpecifier: undefined,\n });\n });\n\n it('uses the consuming app root to resolve workspace package workflow ids', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const packageDir = join(testRoot, 'packages/vade');\n const filePath = join(\n packageDir,\n 'src/internal/message/workflow/handle-message.ts'\n );\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { vade: 'workspace:*' },\n });\n\n writeJson(join(packageDir, 'package.json'), {\n name: 'vade',\n version: '0.0.0',\n });\n\n writeFile(filePath, `'use workflow';\\n`);\n\n expect(resolveModuleSpecifier(filePath, projectRoot)).toEqual({\n moduleSpecifier: 'vade@0.0.0',\n });\n });\n\n it('preserves package export subpaths when source files back dist exports', () => {\n const projectRoot = join(testRoot, 'apps/chat');\n const workspacePkgDir = join(testRoot, 'packages/agent');\n const filePath = join(workspacePkgDir, 'src/server.ts');\n\n writeJson(join(projectRoot, 'package.json'), {\n name: 'chat',\n dependencies: { '@internal/agent': 'workspace:*' },\n });\n\n writeJson(join(workspacePkgDir, 'package.json'), {\n name: '@internal/agent',\n version: '1.0.0',\n exports: {\n './server': './dist/server.js',\n },\n });\n\n writeFile(filePath, `'use step';\\n`);\n\n expect(resolveModuleSpecifier(filePath, projectRoot)).toEqual({\n moduleSpecifier: '@internal/agent/server@1.0.0',\n });\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-module-esbuild-plugin.d.ts","sourceRoot":"","sources":["../src/node-module-esbuild-plugin.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,CAAC;AA2BxC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,iBAoB9C;AAwCD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,UAEzC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,sBAkCtD;AAyED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM;;;;;;eAkDpB;AAcD;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"node-module-esbuild-plugin.d.ts","sourceRoot":"","sources":["../src/node-module-esbuild-plugin.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,CAAC;AA2BxC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,iBAoB9C;AAwCD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,UAEzC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,sBAkCtD;AAyED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM;;;;;;eAkDpB;AAcD;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAAC,MAAM,CAyN5D"}
|
|
@@ -252,6 +252,14 @@ export function createNodeModuleErrorPlugin() {
|
|
|
252
252
|
const importParents = new Map();
|
|
253
253
|
const packageViolations = [];
|
|
254
254
|
const seenViolations = new Set();
|
|
255
|
+
// Enable the esbuild metafile so we can inspect which Node.js / Bun
|
|
256
|
+
// built-in imports actually survive tree-shaking. We need this to
|
|
257
|
+
// suppress false positives where a shared module has a workflow-safe
|
|
258
|
+
// export alongside a step-only export that references Node.js builtins
|
|
259
|
+
// — esbuild's tree-shaker can drop the step-only branch, but `onResolve`
|
|
260
|
+
// fires before tree-shaking, so we defer the final error decision to
|
|
261
|
+
// `onEnd` (see the metafile-based filter below).
|
|
262
|
+
build.initialOptions.metafile = true;
|
|
255
263
|
// Track ALL import relationships to build the dependency graph.
|
|
256
264
|
// This is necessary to trace transitive dependencies back to user code.
|
|
257
265
|
// Performance impact is minimal as we only store path mappings.
|
|
@@ -321,9 +329,14 @@ export function createNodeModuleErrorPlugin() {
|
|
|
321
329
|
const filteredChain = chain.filter((path) => !path.includes('node_modules'));
|
|
322
330
|
const workflowFile = filteredChain[0] ?? importerPath;
|
|
323
331
|
if (!workflowFile || workflowFile.includes('node_modules')) {
|
|
332
|
+
// Mark builtin imports as side-effect-free so esbuild can tree-shake
|
|
333
|
+
// them when they're only referenced by dead (e.g. step-only) code
|
|
334
|
+
// paths in shared modules. The onEnd filter below uses the metafile
|
|
335
|
+
// to decide which imports actually survive.
|
|
324
336
|
return {
|
|
325
337
|
path: args.path,
|
|
326
338
|
external: true,
|
|
339
|
+
sideEffects: false,
|
|
327
340
|
};
|
|
328
341
|
}
|
|
329
342
|
const packageName = importerPath.includes('node_modules')
|
|
@@ -347,34 +360,71 @@ export function createNodeModuleErrorPlugin() {
|
|
|
347
360
|
});
|
|
348
361
|
}
|
|
349
362
|
}
|
|
363
|
+
// Mark builtin imports as side-effect-free so esbuild can tree-shake
|
|
364
|
+
// them when they're only referenced by dead (e.g. step-only) code
|
|
365
|
+
// paths in shared modules. The onEnd filter below uses the metafile
|
|
366
|
+
// to decide which imports actually survive.
|
|
350
367
|
return {
|
|
351
368
|
path: args.path,
|
|
352
369
|
external: true,
|
|
370
|
+
sideEffects: false,
|
|
353
371
|
};
|
|
354
372
|
});
|
|
355
|
-
// Report
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
373
|
+
// Report violations at the end of the build, filtered to only those
|
|
374
|
+
// whose Node.js / Bun builtin imports actually survived tree-shaking.
|
|
375
|
+
//
|
|
376
|
+
// `onResolve` fires during module loading, before esbuild's tree-shaker
|
|
377
|
+
// runs. That means a shared module whose step-only export references a
|
|
378
|
+
// builtin will record a violation even if the workflow never touches
|
|
379
|
+
// that export. By marking builtin imports as `sideEffects: false` in
|
|
380
|
+
// `onResolve` above, esbuild can drop such imports from the output.
|
|
381
|
+
// Here we consult the metafile to see which builtin imports remain
|
|
382
|
+
// in the emitted bundle and only report those.
|
|
383
|
+
build.onEnd((result) => {
|
|
384
|
+
if (packageViolations.length === 0)
|
|
385
|
+
return;
|
|
386
|
+
const survivingBuiltins = new Set();
|
|
387
|
+
const outputs = result.metafile?.outputs;
|
|
388
|
+
if (outputs) {
|
|
389
|
+
for (const output of Object.values(outputs)) {
|
|
390
|
+
for (const imp of output.imports) {
|
|
391
|
+
// External imports in the metafile are recorded with the path
|
|
392
|
+
// that was returned from `onResolve` (e.g. "node:fs/promises",
|
|
393
|
+
// "fs", "bun:sqlite"). Only collect the ones that match
|
|
394
|
+
// Node.js / Bun builtins.
|
|
395
|
+
if (imp.external && runtimeModulesRegex.test(imp.path)) {
|
|
396
|
+
survivingBuiltins.add(imp.path);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
377
400
|
}
|
|
401
|
+
// If the metafile is unavailable for some reason, fall back to
|
|
402
|
+
// reporting all recorded violations so we never silently suppress
|
|
403
|
+
// real ones.
|
|
404
|
+
const liveViolations = outputs
|
|
405
|
+
? packageViolations.filter((violation) => survivingBuiltins.has(violation.path))
|
|
406
|
+
: packageViolations;
|
|
407
|
+
if (liveViolations.length === 0)
|
|
408
|
+
return;
|
|
409
|
+
return {
|
|
410
|
+
errors: liveViolations.map((violation) => {
|
|
411
|
+
const isBuiltinModule = runtimeModulesRegex.test(violation.packageName);
|
|
412
|
+
const moduleType = getModuleTypeLabel(violation.path);
|
|
413
|
+
// Different messages for built-in modules vs npm packages that use them
|
|
414
|
+
const text = isBuiltinModule
|
|
415
|
+
? `You are attempting to use "${violation.packageName}" which is a ${moduleType} module. ${moduleType} modules are not available in workflow functions.\n\nLearn more: https://workflow-sdk.dev/err/${ERROR_SLUGS.NODE_JS_MODULE_IN_WORKFLOW}`
|
|
416
|
+
: `You are attempting to use "${violation.packageName}" which depends on ${moduleType} modules. Packages that depend on ${moduleType} modules are not available in workflow functions.\n\nLearn more: https://workflow-sdk.dev/err/${ERROR_SLUGS.NODE_JS_MODULE_IN_WORKFLOW}`;
|
|
417
|
+
return {
|
|
418
|
+
text,
|
|
419
|
+
location: violation.location
|
|
420
|
+
? {
|
|
421
|
+
...violation.location,
|
|
422
|
+
suggestion: 'Move this function into a step function.',
|
|
423
|
+
}
|
|
424
|
+
: undefined,
|
|
425
|
+
};
|
|
426
|
+
}),
|
|
427
|
+
};
|
|
378
428
|
});
|
|
379
429
|
},
|
|
380
430
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-module-esbuild-plugin.js","sourceRoot":"","sources":["../src/node-module-esbuild-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { normalize, relative, resolve } from 'node:path';\nimport { promisify } from 'node:util';\nimport { ERROR_SLUGS } from '@workflow/errors';\nimport builtinModules from 'builtin-modules';\nimport enhancedResolveOriginal from 'enhanced-resolve';\nimport type * as esbuild from 'esbuild';\n\nconst enhancedResolve = promisify(enhancedResolveOriginal);\n\n// Match exact Node.js built-in module names:\n// - \"fs\", \"path\", \"stream\" etc. (exact match)\n// - \"node:fs\", \"node:path\" etc. (with node: prefix)\n// But NOT \"some-package/stream\" or \"eventsource-parser/stream\"\nconst nodeModulesPattern = `(${builtinModules.join('|')})`;\n\n// Match Bun modules:\n// - \"bun\" (exact match)\n// - \"bun:sqlite\", \"bun:ffi\" etc. (with bun: prefix)\nconst bunModulesRegex = /^bun(:|$)/;\n\n// Combined regex for both Node.js and Bun modules\nconst runtimeModulesRegex = new RegExp(\n `^((node:)?${nodeModulesPattern}|bun(:.*)?)$`\n);\n\ntype PackageViolation = {\n packageName: string;\n importer: string;\n path: string;\n location: Partial<esbuild.Location>;\n};\n\n/**\n * Get the package name from a file path.\n * @param filePath - The file path to get the package name from.\n * @returns The package name.\n */\nexport function getPackageName(filePath: string) {\n const normalized = filePath.replace(/\\\\/g, '/');\n const marker = '/node_modules/';\n const idx = normalized.lastIndexOf(marker);\n if (idx === -1) return null;\n\n const after = normalized.slice(idx + marker.length); // e.g. \".pnpm/node-fetch@3.3.2/node_modules/node-fetch/src/index.js\"\n const segments = after.split('/');\n if (!segments.length) return null;\n\n let packageName = segments[0];\n\n // pnpm nests: \".pnpm/<pkg>@<version>/node_modules/<pkg>/...\"\n if (packageName === '.pnpm' && segments.length >= 3) {\n packageName = segments[2];\n } else if (packageName.startsWith('@') && segments.length >= 2) {\n packageName = `${segments[0]}/${segments[1]}`;\n }\n\n return packageName;\n}\n\n/**\n * Get the package name from an import specifier.\n * @param specifier - The import specifier to parse.\n * @returns The package name (for bare package imports), otherwise null.\n */\nfunction getPackageNameFromSpecifier(specifier: string) {\n // Not a bare package specifier (relative, absolute, or URL-like)\n if (\n !specifier ||\n specifier.startsWith('.') ||\n specifier.startsWith('/') ||\n /^[A-Za-z]:[\\\\/]/.test(specifier)\n ) {\n return null;\n }\n\n // Ignore runtime built-ins and URL-like specifiers\n if (\n runtimeModulesRegex.test(specifier) ||\n specifier.includes('://') ||\n specifier.startsWith('#')\n ) {\n return null;\n }\n\n const normalized = specifier.replace(/\\\\/g, '/');\n if (normalized.startsWith('@')) {\n const [scope, name] = normalized.split('/');\n if (!scope || !name) {\n return null;\n }\n return `${scope}/${name}`;\n }\n\n const [name] = normalized.split('/');\n return name ?? null;\n}\n\n/**\n * Escape a regular expression string.\n * @param value - The string to escape.\n * @returns The escaped string.\n */\nexport function escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Get the imported identifier from a specifier.\n * @param specifier - The specifier to get the imported identifier from.\n * @returns The imported identifier.\n */\nexport function getImportedIdentifier(specifier: string) {\n const namespaceMatch = specifier.match(/\\*\\s+as\\s+([A-Za-z0-9_$]+)/);\n if (namespaceMatch) {\n return namespaceMatch[1];\n }\n\n if (specifier.includes('{')) {\n const inside = specifier.replace(/^[^{]*\\{/, '').replace(/\\}.*$/, '');\n const firstNamed = inside\n .split(',')\n .map((token) => token.trim())\n .find(Boolean);\n\n if (firstNamed) {\n const aliasMatch = firstNamed.match(\n /([A-Za-z0-9_$]+)\\s+as\\s+([A-Za-z0-9_$]+)/\n );\n if (aliasMatch) {\n return aliasMatch[2];\n }\n // Validate that firstNamed is a valid identifier (not empty braces or whitespace)\n const identifierMatch = firstNamed.match(/^[A-Za-z_$][A-Za-z0-9_$]*/);\n if (identifierMatch) {\n return identifierMatch[0];\n }\n }\n // Empty braces or no valid identifier found - return undefined\n return undefined;\n }\n\n const defaultPart = specifier.split(',')[0]?.trim();\n if (defaultPart && defaultPart !== '*') {\n return defaultPart;\n }\n}\n\n/**\n * Find the usage of an identifier in a list of lines.\n * @param lines - The list of lines to search in.\n * @param startIndex - The index to start searching from.\n * @param identifier - The identifier to search for.\n * @returns The usage of the identifier.\n */\nfunction findIdentifierUsage(\n lines: string[],\n startIndex: number,\n identifier: string\n) {\n const usageRegex = new RegExp(`\\\\b${escapeRegExp(identifier)}\\\\b`);\n let inBlockComment = false;\n\n for (let i = startIndex; i < lines.length; i += 1) {\n // Strip string literals first so that comment delimiters inside strings\n // (e.g. `const s = \"/*\";`) don't confuse the comment scanner.\n const stringsStripped = lines[i]\n .replace(/'(?:[^'\\\\]|\\\\.)*'/g, (s) => ' '.repeat(s.length))\n .replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, (s) => ' '.repeat(s.length))\n .replace(/`(?:[^`\\\\]|\\\\.)*`/g, (s) => ' '.repeat(s.length));\n\n let line = stringsStripped;\n\n // Handle multi-line block comments (including JSDoc)\n if (inBlockComment) {\n const endIdx = line.indexOf('*/');\n if (endIdx === -1) {\n continue;\n }\n line = ' '.repeat(endIdx + 2) + line.slice(endIdx + 2);\n inBlockComment = false;\n }\n\n // Scan for comments, replacing them with spaces\n let processed = '';\n let j = 0;\n while (j < line.length) {\n if (line[j] === '/' && line[j + 1] === '/') {\n processed += ' '.repeat(line.length - j);\n break;\n }\n if (line[j] === '/' && line[j + 1] === '*') {\n const endIdx = line.indexOf('*/', j + 2);\n if (endIdx !== -1) {\n const len = endIdx + 2 - j;\n processed += ' '.repeat(len);\n j = endIdx + 2;\n } else {\n processed += ' '.repeat(line.length - j);\n inBlockComment = true;\n break;\n }\n } else {\n processed += line[j];\n j += 1;\n }\n }\n\n const match = processed.match(usageRegex);\n if (match && match.index !== undefined) {\n return {\n line: i,\n column: match.index,\n lineText: lines[i],\n };\n }\n }\n}\n\n/**\n * Get the location of a violation.\n * @param cwd - The current working directory.\n * @param relativePath - The relative path to the file.\n * @param packageName - The name of the package.\n * @returns The location of the violation.\n */\nexport async function getViolationLocation(\n cwd: string,\n relativePath: string,\n packageName: string\n) {\n try {\n const absolutePath = resolve(cwd, relativePath);\n const contents = await readFile(absolutePath, 'utf8');\n const lines = contents.split(/\\r?\\n/);\n\n const importRegex = new RegExp(\n `import\\\\s+(.+?)\\\\s+from\\\\s+['\"]${escapeRegExp(packageName)}(?:/[^'\"]*)?['\"]`\n );\n\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i];\n const importMatch = line.match(importRegex);\n\n if (importMatch && importMatch.index !== undefined) {\n const specifier = importMatch[1].trim();\n const identifier = getImportedIdentifier(specifier);\n if (identifier) {\n const usage = findIdentifierUsage(lines, i + 1, identifier);\n if (usage) {\n return {\n file: relativePath,\n line: usage.line + 1,\n column: usage.column,\n lineText: usage.lineText,\n length: identifier.length,\n };\n }\n\n // Identifier exists but is never referenced; surface no location\n return undefined;\n }\n\n // Fallback: if we can't extract identifier, point to package name\n const columnIndex = line.indexOf(packageName);\n if (columnIndex !== -1) {\n return {\n file: relativePath,\n line: i + 1,\n column: columnIndex,\n lineText: line,\n length: packageName.length,\n };\n }\n }\n }\n } catch {\n // ignore file read failures, fallback to no location info\n }\n}\n\n/**\n * Get the module type label for error messages.\n * @param modulePath - The module path to check.\n * @returns The module type label.\n */\nfunction getModuleTypeLabel(modulePath: string): string {\n if (bunModulesRegex.test(modulePath)) {\n return 'Bun';\n }\n return 'Node.js';\n}\n\n/**\n * Create an esbuild plugin to detect violations of the Node.js module usage rule.\n * This plugin prevents workflow functions from importing Node.js or Bun built-in\n * modules, which are not available in the sandboxed workflow runtime.\n */\nexport function createNodeModuleErrorPlugin(): esbuild.Plugin {\n return {\n name: 'workflow-node-module-error',\n setup(build) {\n const cwd = process.cwd();\n const importParents = new Map<string, string>();\n const packageViolations: PackageViolation[] = [];\n const seenViolations = new Set<string>();\n\n // Track ALL import relationships to build the dependency graph.\n // This is necessary to trace transitive dependencies back to user code.\n // Performance impact is minimal as we only store path mappings.\n build.onResolve({ filter: /.*/ }, async (args) => {\n if (!args.importer) return null;\n\n const parentValue = normalize(args.importer);\n const specifierPackageName = getPackageNameFromSpecifier(args.path);\n\n try {\n const resolvedChild = await enhancedResolve(\n args.resolveDir,\n args.path\n );\n\n if (resolvedChild) {\n const childKey = normalize(resolvedChild);\n importParents.set(childKey, parentValue);\n\n // Record the resolved package edge so transitive builtin usage can\n // still trace back even when esbuild and enhanced-resolve pick\n // different entry files (e.g. `module` vs `main`).\n const resolvedPackageName = getPackageName(childKey);\n if (resolvedPackageName) {\n importParents.set(resolvedPackageName, parentValue);\n }\n }\n\n // Also preserve the bare package-specifier edge (e.g. \"postgres\"),\n // which is the fallback key used when tracing from files in\n // node_modules back to user code.\n if (specifierPackageName) {\n importParents.set(specifierPackageName, parentValue);\n }\n } catch {\n // For built-in modules that can't be resolved, still track using the import path\n const childKey = args.path;\n importParents.set(childKey, parentValue);\n\n if (specifierPackageName) {\n importParents.set(specifierPackageName, parentValue);\n }\n }\n return null;\n });\n\n // Detect Node.js and Bun module imports\n build.onResolve({ filter: runtimeModulesRegex }, async (args) => {\n const importerPath = resolve(cwd, args.importer);\n let current = importerPath;\n const chain: string[] = [];\n const visited = new Set<string>();\n while (current) {\n if (visited.has(current)) {\n break;\n }\n visited.add(current);\n chain.push(current);\n let next = importParents.get(current);\n\n // If we can't find the parent and current is in node_modules,\n // try looking up by potential package import strings\n if (!next && current.includes('node_modules')) {\n const packageName = getPackageName(current);\n if (packageName) {\n // Try the package name directly\n next = importParents.get(packageName);\n if (!next) {\n // Try with node: prefix\n next = importParents.get(`node:${packageName}`);\n }\n }\n }\n\n current = next ?? '';\n }\n const filteredChain = chain.filter(\n (path) => !path.includes('node_modules')\n );\n\n const workflowFile = filteredChain[0] ?? importerPath;\n\n if (!workflowFile || workflowFile.includes('node_modules')) {\n return {\n path: args.path,\n external: true,\n };\n }\n\n const packageName = importerPath.includes('node_modules')\n ? (getPackageName(importerPath) ?? args.path)\n : args.path;\n\n const relativeWorkflowFile = relative(cwd, workflowFile);\n const violationKey = `${packageName}:${relativeWorkflowFile}`;\n\n if (!seenViolations.has(violationKey)) {\n seenViolations.add(violationKey);\n const location = await getViolationLocation(\n cwd,\n relativeWorkflowFile,\n packageName\n );\n // Only report violations where we can find the import location.\n // If we can't find it, the package is likely a transitive dependency\n // that the user didn't directly import - we'll report the top-level\n // package they did import instead.\n if (location) {\n packageViolations.push({\n path: args.path,\n importer: relativeWorkflowFile,\n packageName,\n location,\n });\n }\n }\n\n return {\n path: args.path,\n external: true,\n };\n });\n\n // Report all violations at the end of the build\n build.onEnd(() => {\n if (packageViolations.length > 0) {\n return {\n errors: packageViolations.map((violation) => {\n const isBuiltinModule = runtimeModulesRegex.test(\n violation.packageName\n );\n const moduleType = getModuleTypeLabel(violation.path);\n\n // Different messages for built-in modules vs npm packages that use them\n const text = isBuiltinModule\n ? `You are attempting to use \"${violation.packageName}\" which is a ${moduleType} module. ${moduleType} modules are not available in workflow functions.\\n\\nLearn more: https://workflow-sdk.dev/err/${ERROR_SLUGS.NODE_JS_MODULE_IN_WORKFLOW}`\n : `You are attempting to use \"${violation.packageName}\" which depends on ${moduleType} modules. Packages that depend on ${moduleType} modules are not available in workflow functions.\\n\\nLearn more: https://workflow-sdk.dev/err/${ERROR_SLUGS.NODE_JS_MODULE_IN_WORKFLOW}`;\n\n return {\n text,\n location: violation.location\n ? {\n ...violation.location,\n suggestion: 'Move this function into a step function.',\n }\n : undefined,\n };\n }),\n };\n }\n });\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"node-module-esbuild-plugin.js","sourceRoot":"","sources":["../src/node-module-esbuild-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { normalize, relative, resolve } from 'node:path';\nimport { promisify } from 'node:util';\nimport { ERROR_SLUGS } from '@workflow/errors';\nimport builtinModules from 'builtin-modules';\nimport enhancedResolveOriginal from 'enhanced-resolve';\nimport type * as esbuild from 'esbuild';\n\nconst enhancedResolve = promisify(enhancedResolveOriginal);\n\n// Match exact Node.js built-in module names:\n// - \"fs\", \"path\", \"stream\" etc. (exact match)\n// - \"node:fs\", \"node:path\" etc. (with node: prefix)\n// But NOT \"some-package/stream\" or \"eventsource-parser/stream\"\nconst nodeModulesPattern = `(${builtinModules.join('|')})`;\n\n// Match Bun modules:\n// - \"bun\" (exact match)\n// - \"bun:sqlite\", \"bun:ffi\" etc. (with bun: prefix)\nconst bunModulesRegex = /^bun(:|$)/;\n\n// Combined regex for both Node.js and Bun modules\nconst runtimeModulesRegex = new RegExp(\n `^((node:)?${nodeModulesPattern}|bun(:.*)?)$`\n);\n\ntype PackageViolation = {\n packageName: string;\n importer: string;\n path: string;\n location: Partial<esbuild.Location>;\n};\n\n/**\n * Get the package name from a file path.\n * @param filePath - The file path to get the package name from.\n * @returns The package name.\n */\nexport function getPackageName(filePath: string) {\n const normalized = filePath.replace(/\\\\/g, '/');\n const marker = '/node_modules/';\n const idx = normalized.lastIndexOf(marker);\n if (idx === -1) return null;\n\n const after = normalized.slice(idx + marker.length); // e.g. \".pnpm/node-fetch@3.3.2/node_modules/node-fetch/src/index.js\"\n const segments = after.split('/');\n if (!segments.length) return null;\n\n let packageName = segments[0];\n\n // pnpm nests: \".pnpm/<pkg>@<version>/node_modules/<pkg>/...\"\n if (packageName === '.pnpm' && segments.length >= 3) {\n packageName = segments[2];\n } else if (packageName.startsWith('@') && segments.length >= 2) {\n packageName = `${segments[0]}/${segments[1]}`;\n }\n\n return packageName;\n}\n\n/**\n * Get the package name from an import specifier.\n * @param specifier - The import specifier to parse.\n * @returns The package name (for bare package imports), otherwise null.\n */\nfunction getPackageNameFromSpecifier(specifier: string) {\n // Not a bare package specifier (relative, absolute, or URL-like)\n if (\n !specifier ||\n specifier.startsWith('.') ||\n specifier.startsWith('/') ||\n /^[A-Za-z]:[\\\\/]/.test(specifier)\n ) {\n return null;\n }\n\n // Ignore runtime built-ins and URL-like specifiers\n if (\n runtimeModulesRegex.test(specifier) ||\n specifier.includes('://') ||\n specifier.startsWith('#')\n ) {\n return null;\n }\n\n const normalized = specifier.replace(/\\\\/g, '/');\n if (normalized.startsWith('@')) {\n const [scope, name] = normalized.split('/');\n if (!scope || !name) {\n return null;\n }\n return `${scope}/${name}`;\n }\n\n const [name] = normalized.split('/');\n return name ?? null;\n}\n\n/**\n * Escape a regular expression string.\n * @param value - The string to escape.\n * @returns The escaped string.\n */\nexport function escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Get the imported identifier from a specifier.\n * @param specifier - The specifier to get the imported identifier from.\n * @returns The imported identifier.\n */\nexport function getImportedIdentifier(specifier: string) {\n const namespaceMatch = specifier.match(/\\*\\s+as\\s+([A-Za-z0-9_$]+)/);\n if (namespaceMatch) {\n return namespaceMatch[1];\n }\n\n if (specifier.includes('{')) {\n const inside = specifier.replace(/^[^{]*\\{/, '').replace(/\\}.*$/, '');\n const firstNamed = inside\n .split(',')\n .map((token) => token.trim())\n .find(Boolean);\n\n if (firstNamed) {\n const aliasMatch = firstNamed.match(\n /([A-Za-z0-9_$]+)\\s+as\\s+([A-Za-z0-9_$]+)/\n );\n if (aliasMatch) {\n return aliasMatch[2];\n }\n // Validate that firstNamed is a valid identifier (not empty braces or whitespace)\n const identifierMatch = firstNamed.match(/^[A-Za-z_$][A-Za-z0-9_$]*/);\n if (identifierMatch) {\n return identifierMatch[0];\n }\n }\n // Empty braces or no valid identifier found - return undefined\n return undefined;\n }\n\n const defaultPart = specifier.split(',')[0]?.trim();\n if (defaultPart && defaultPart !== '*') {\n return defaultPart;\n }\n}\n\n/**\n * Find the usage of an identifier in a list of lines.\n * @param lines - The list of lines to search in.\n * @param startIndex - The index to start searching from.\n * @param identifier - The identifier to search for.\n * @returns The usage of the identifier.\n */\nfunction findIdentifierUsage(\n lines: string[],\n startIndex: number,\n identifier: string\n) {\n const usageRegex = new RegExp(`\\\\b${escapeRegExp(identifier)}\\\\b`);\n let inBlockComment = false;\n\n for (let i = startIndex; i < lines.length; i += 1) {\n // Strip string literals first so that comment delimiters inside strings\n // (e.g. `const s = \"/*\";`) don't confuse the comment scanner.\n const stringsStripped = lines[i]\n .replace(/'(?:[^'\\\\]|\\\\.)*'/g, (s) => ' '.repeat(s.length))\n .replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, (s) => ' '.repeat(s.length))\n .replace(/`(?:[^`\\\\]|\\\\.)*`/g, (s) => ' '.repeat(s.length));\n\n let line = stringsStripped;\n\n // Handle multi-line block comments (including JSDoc)\n if (inBlockComment) {\n const endIdx = line.indexOf('*/');\n if (endIdx === -1) {\n continue;\n }\n line = ' '.repeat(endIdx + 2) + line.slice(endIdx + 2);\n inBlockComment = false;\n }\n\n // Scan for comments, replacing them with spaces\n let processed = '';\n let j = 0;\n while (j < line.length) {\n if (line[j] === '/' && line[j + 1] === '/') {\n processed += ' '.repeat(line.length - j);\n break;\n }\n if (line[j] === '/' && line[j + 1] === '*') {\n const endIdx = line.indexOf('*/', j + 2);\n if (endIdx !== -1) {\n const len = endIdx + 2 - j;\n processed += ' '.repeat(len);\n j = endIdx + 2;\n } else {\n processed += ' '.repeat(line.length - j);\n inBlockComment = true;\n break;\n }\n } else {\n processed += line[j];\n j += 1;\n }\n }\n\n const match = processed.match(usageRegex);\n if (match && match.index !== undefined) {\n return {\n line: i,\n column: match.index,\n lineText: lines[i],\n };\n }\n }\n}\n\n/**\n * Get the location of a violation.\n * @param cwd - The current working directory.\n * @param relativePath - The relative path to the file.\n * @param packageName - The name of the package.\n * @returns The location of the violation.\n */\nexport async function getViolationLocation(\n cwd: string,\n relativePath: string,\n packageName: string\n) {\n try {\n const absolutePath = resolve(cwd, relativePath);\n const contents = await readFile(absolutePath, 'utf8');\n const lines = contents.split(/\\r?\\n/);\n\n const importRegex = new RegExp(\n `import\\\\s+(.+?)\\\\s+from\\\\s+['\"]${escapeRegExp(packageName)}(?:/[^'\"]*)?['\"]`\n );\n\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i];\n const importMatch = line.match(importRegex);\n\n if (importMatch && importMatch.index !== undefined) {\n const specifier = importMatch[1].trim();\n const identifier = getImportedIdentifier(specifier);\n if (identifier) {\n const usage = findIdentifierUsage(lines, i + 1, identifier);\n if (usage) {\n return {\n file: relativePath,\n line: usage.line + 1,\n column: usage.column,\n lineText: usage.lineText,\n length: identifier.length,\n };\n }\n\n // Identifier exists but is never referenced; surface no location\n return undefined;\n }\n\n // Fallback: if we can't extract identifier, point to package name\n const columnIndex = line.indexOf(packageName);\n if (columnIndex !== -1) {\n return {\n file: relativePath,\n line: i + 1,\n column: columnIndex,\n lineText: line,\n length: packageName.length,\n };\n }\n }\n }\n } catch {\n // ignore file read failures, fallback to no location info\n }\n}\n\n/**\n * Get the module type label for error messages.\n * @param modulePath - The module path to check.\n * @returns The module type label.\n */\nfunction getModuleTypeLabel(modulePath: string): string {\n if (bunModulesRegex.test(modulePath)) {\n return 'Bun';\n }\n return 'Node.js';\n}\n\n/**\n * Create an esbuild plugin to detect violations of the Node.js module usage rule.\n * This plugin prevents workflow functions from importing Node.js or Bun built-in\n * modules, which are not available in the sandboxed workflow runtime.\n */\nexport function createNodeModuleErrorPlugin(): esbuild.Plugin {\n return {\n name: 'workflow-node-module-error',\n setup(build) {\n const cwd = process.cwd();\n const importParents = new Map<string, string>();\n const packageViolations: PackageViolation[] = [];\n const seenViolations = new Set<string>();\n\n // Enable the esbuild metafile so we can inspect which Node.js / Bun\n // built-in imports actually survive tree-shaking. We need this to\n // suppress false positives where a shared module has a workflow-safe\n // export alongside a step-only export that references Node.js builtins\n // — esbuild's tree-shaker can drop the step-only branch, but `onResolve`\n // fires before tree-shaking, so we defer the final error decision to\n // `onEnd` (see the metafile-based filter below).\n build.initialOptions.metafile = true;\n\n // Track ALL import relationships to build the dependency graph.\n // This is necessary to trace transitive dependencies back to user code.\n // Performance impact is minimal as we only store path mappings.\n build.onResolve({ filter: /.*/ }, async (args) => {\n if (!args.importer) return null;\n\n const parentValue = normalize(args.importer);\n const specifierPackageName = getPackageNameFromSpecifier(args.path);\n\n try {\n const resolvedChild = await enhancedResolve(\n args.resolveDir,\n args.path\n );\n\n if (resolvedChild) {\n const childKey = normalize(resolvedChild);\n importParents.set(childKey, parentValue);\n\n // Record the resolved package edge so transitive builtin usage can\n // still trace back even when esbuild and enhanced-resolve pick\n // different entry files (e.g. `module` vs `main`).\n const resolvedPackageName = getPackageName(childKey);\n if (resolvedPackageName) {\n importParents.set(resolvedPackageName, parentValue);\n }\n }\n\n // Also preserve the bare package-specifier edge (e.g. \"postgres\"),\n // which is the fallback key used when tracing from files in\n // node_modules back to user code.\n if (specifierPackageName) {\n importParents.set(specifierPackageName, parentValue);\n }\n } catch {\n // For built-in modules that can't be resolved, still track using the import path\n const childKey = args.path;\n importParents.set(childKey, parentValue);\n\n if (specifierPackageName) {\n importParents.set(specifierPackageName, parentValue);\n }\n }\n return null;\n });\n\n // Detect Node.js and Bun module imports\n build.onResolve({ filter: runtimeModulesRegex }, async (args) => {\n const importerPath = resolve(cwd, args.importer);\n let current = importerPath;\n const chain: string[] = [];\n const visited = new Set<string>();\n while (current) {\n if (visited.has(current)) {\n break;\n }\n visited.add(current);\n chain.push(current);\n let next = importParents.get(current);\n\n // If we can't find the parent and current is in node_modules,\n // try looking up by potential package import strings\n if (!next && current.includes('node_modules')) {\n const packageName = getPackageName(current);\n if (packageName) {\n // Try the package name directly\n next = importParents.get(packageName);\n if (!next) {\n // Try with node: prefix\n next = importParents.get(`node:${packageName}`);\n }\n }\n }\n\n current = next ?? '';\n }\n const filteredChain = chain.filter(\n (path) => !path.includes('node_modules')\n );\n\n const workflowFile = filteredChain[0] ?? importerPath;\n\n if (!workflowFile || workflowFile.includes('node_modules')) {\n // Mark builtin imports as side-effect-free so esbuild can tree-shake\n // them when they're only referenced by dead (e.g. step-only) code\n // paths in shared modules. The onEnd filter below uses the metafile\n // to decide which imports actually survive.\n return {\n path: args.path,\n external: true,\n sideEffects: false,\n };\n }\n\n const packageName = importerPath.includes('node_modules')\n ? (getPackageName(importerPath) ?? args.path)\n : args.path;\n\n const relativeWorkflowFile = relative(cwd, workflowFile);\n const violationKey = `${packageName}:${relativeWorkflowFile}`;\n\n if (!seenViolations.has(violationKey)) {\n seenViolations.add(violationKey);\n const location = await getViolationLocation(\n cwd,\n relativeWorkflowFile,\n packageName\n );\n // Only report violations where we can find the import location.\n // If we can't find it, the package is likely a transitive dependency\n // that the user didn't directly import - we'll report the top-level\n // package they did import instead.\n if (location) {\n packageViolations.push({\n path: args.path,\n importer: relativeWorkflowFile,\n packageName,\n location,\n });\n }\n }\n\n // Mark builtin imports as side-effect-free so esbuild can tree-shake\n // them when they're only referenced by dead (e.g. step-only) code\n // paths in shared modules. The onEnd filter below uses the metafile\n // to decide which imports actually survive.\n return {\n path: args.path,\n external: true,\n sideEffects: false,\n };\n });\n\n // Report violations at the end of the build, filtered to only those\n // whose Node.js / Bun builtin imports actually survived tree-shaking.\n //\n // `onResolve` fires during module loading, before esbuild's tree-shaker\n // runs. That means a shared module whose step-only export references a\n // builtin will record a violation even if the workflow never touches\n // that export. By marking builtin imports as `sideEffects: false` in\n // `onResolve` above, esbuild can drop such imports from the output.\n // Here we consult the metafile to see which builtin imports remain\n // in the emitted bundle and only report those.\n build.onEnd((result) => {\n if (packageViolations.length === 0) return;\n\n const survivingBuiltins = new Set<string>();\n const outputs = result.metafile?.outputs;\n if (outputs) {\n for (const output of Object.values(outputs)) {\n for (const imp of output.imports) {\n // External imports in the metafile are recorded with the path\n // that was returned from `onResolve` (e.g. \"node:fs/promises\",\n // \"fs\", \"bun:sqlite\"). Only collect the ones that match\n // Node.js / Bun builtins.\n if (imp.external && runtimeModulesRegex.test(imp.path)) {\n survivingBuiltins.add(imp.path);\n }\n }\n }\n }\n\n // If the metafile is unavailable for some reason, fall back to\n // reporting all recorded violations so we never silently suppress\n // real ones.\n const liveViolations = outputs\n ? packageViolations.filter((violation) =>\n survivingBuiltins.has(violation.path)\n )\n : packageViolations;\n\n if (liveViolations.length === 0) return;\n\n return {\n errors: liveViolations.map((violation) => {\n const isBuiltinModule = runtimeModulesRegex.test(\n violation.packageName\n );\n const moduleType = getModuleTypeLabel(violation.path);\n\n // Different messages for built-in modules vs npm packages that use them\n const text = isBuiltinModule\n ? `You are attempting to use \"${violation.packageName}\" which is a ${moduleType} module. ${moduleType} modules are not available in workflow functions.\\n\\nLearn more: https://workflow-sdk.dev/err/${ERROR_SLUGS.NODE_JS_MODULE_IN_WORKFLOW}`\n : `You are attempting to use \"${violation.packageName}\" which depends on ${moduleType} modules. Packages that depend on ${moduleType} modules are not available in workflow functions.\\n\\nLearn more: https://workflow-sdk.dev/err/${ERROR_SLUGS.NODE_JS_MODULE_IN_WORKFLOW}`;\n\n return {\n text,\n location: violation.location\n ? {\n ...violation.location,\n suggestion: 'Move this function into a step function.',\n }\n : undefined,\n };\n }),\n };\n });\n },\n };\n}\n"]}
|