@crossplatformai/dependency-graph 0.9.4 → 0.11.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/pr-preview.d.ts +5 -0
- package/dist/cli/pr-preview.d.ts.map +1 -0
- package/dist/cli/validate-workflows.d.ts +3 -0
- package/dist/cli/validate-workflows.d.ts.map +1 -0
- package/dist/graph/analysis.d.ts +6 -0
- package/dist/graph/analysis.d.ts.map +1 -0
- package/dist/graph/builder.d.ts +3 -0
- package/dist/graph/builder.d.ts.map +1 -0
- package/dist/graph/traversal.d.ts +5 -0
- package/dist/graph/traversal.d.ts.map +1 -0
- package/dist/graph/types.d.ts +47 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/index-cli.js +1172 -0
- package/dist/index-cli.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +791 -0
- package/dist/index.js.map +1 -0
- package/dist/types/clients.d.ts +15 -0
- package/dist/types/clients.d.ts.map +1 -0
- package/dist/workflow/discovery.d.ts +4 -0
- package/dist/workflow/discovery.d.ts.map +1 -0
- package/dist/workflow/expected-paths.d.ts +13 -0
- package/dist/workflow/expected-paths.d.ts.map +1 -0
- package/dist/workflow/impact.d.ts +5 -0
- package/dist/workflow/impact.d.ts.map +1 -0
- package/dist/workflow/parser.d.ts +3 -0
- package/dist/workflow/parser.d.ts.map +1 -0
- package/dist/workflow/policy.d.ts +3 -0
- package/dist/workflow/policy.d.ts.map +1 -0
- package/dist/workflow/types.d.ts +41 -0
- package/dist/workflow/types.d.ts.map +1 -0
- package/dist/workflow/validator.d.ts +3 -0
- package/dist/workflow/validator.d.ts.map +1 -0
- package/dist/workspace/discovery.d.ts +12 -0
- package/dist/workspace/discovery.d.ts.map +1 -0
- package/dist/workspace/file-mapping.d.ts +4 -0
- package/dist/workspace/file-mapping.d.ts.map +1 -0
- package/dist/workspace/package-map.d.ts +12 -0
- package/dist/workspace/package-map.d.ts.map +1 -0
- package/package.json +33 -28
- package/src/cli/pr-preview.ts +0 -388
- package/src/cli/validate-workflows.ts +0 -287
- package/src/graph/analysis.ts +0 -147
- package/src/graph/builder.ts +0 -52
- package/src/graph/traversal.ts +0 -132
- package/src/graph/types.ts +0 -50
- package/src/index.test.ts +0 -94
- package/src/index.ts +0 -51
- package/src/types/clients.ts +0 -19
- package/src/workflow/discovery.ts +0 -58
- package/src/workflow/expected-paths.ts +0 -112
- package/src/workflow/parser.test.ts +0 -54
- package/src/workflow/parser.ts +0 -48
- package/src/workflow/policy.ts +0 -13
- package/src/workflow/types.ts +0 -42
- package/src/workflow/validator.test.ts +0 -214
- package/src/workflow/validator.ts +0 -230
- package/src/workspace/discovery.ts +0 -94
- package/src/workspace/file-mapping.ts +0 -35
- package/src/workspace/package-map.test.ts +0 -95
- package/src/workspace/package-map.ts +0 -74
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/graph/builder.ts","../src/graph/traversal.ts","../src/graph/analysis.ts","../src/workspace/discovery.ts","../src/workspace/package-map.ts","../src/workspace/file-mapping.ts","../src/workflow/policy.ts","../src/workflow/discovery.ts","../src/workflow/expected-paths.ts","../src/workflow/impact.ts","../src/workflow/validator.ts","../src/workflow/parser.ts"],"sourcesContent":["import type { WorkspacePackage, DependencyGraph } from './types';\n\nexport function buildDependencyGraph(\n packages: WorkspacePackage[],\n): DependencyGraph {\n const graph: DependencyGraph = {\n packages: new Map(),\n dependsOn: new Map(),\n dependedBy: new Map(),\n };\n\n for (const pkg of packages) {\n graph.packages.set(pkg.name, pkg);\n graph.dependsOn.set(pkg.name, new Set());\n graph.dependedBy.set(pkg.name, new Set());\n }\n\n for (const pkg of packages) {\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n for (const depName of Object.keys(allDeps)) {\n const matchedPkg = findMatchingPackage(depName, packages);\n\n if (matchedPkg) {\n graph.dependsOn.get(pkg.name)!.add(matchedPkg.name);\n graph.dependedBy.get(matchedPkg.name)!.add(pkg.name);\n }\n }\n }\n\n return graph;\n}\n\nfunction findMatchingPackage(\n depName: string,\n packages: WorkspacePackage[],\n): WorkspacePackage | undefined {\n let match = packages.find((p) => p.name === depName);\n if (match) return match;\n\n match = packages.find((p) => p.name === `@repo/${depName}`);\n if (match) return match;\n\n const nameWithoutRepo = depName.replace(/^@repo\\//, '');\n match = packages.find((p) => p.name === nameWithoutRepo);\n if (match) return match;\n\n return undefined;\n}\n","import type { DependencyGraph, TraversalOptions } from './types';\n\nexport function findAffectedPackages(\n startingPackages: Set<string>,\n graph: DependencyGraph,\n options: TraversalOptions = {},\n): Set<string> {\n const {\n direction = 'upstream',\n maxDepth = Infinity,\n filter,\n respectAffectsUpstream = false,\n } = options;\n\n const affected = new Set<string>(startingPackages);\n const queue: Array<{ name: string; depth: number }> = Array.from(\n startingPackages,\n ).map((name) => ({ name, depth: 0 }));\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n\n if (visited.has(current.name)) continue;\n visited.add(current.name);\n\n if (current.depth >= maxDepth) {\n continue;\n }\n\n const pkg = graph.packages.get(current.name);\n if (!pkg) continue;\n\n if (respectAffectsUpstream && direction === 'upstream') {\n const release = pkg.packageJson.release;\n if (release && release.affectsUpstream === false) {\n continue;\n }\n }\n\n const nextPackages = new Set<string>();\n\n if (direction === 'upstream' || direction === 'both') {\n const upstream = graph.dependedBy.get(current.name) || new Set();\n upstream.forEach((p) => nextPackages.add(p));\n }\n\n if (direction === 'downstream' || direction === 'both') {\n const downstream = graph.dependsOn.get(current.name) || new Set();\n downstream.forEach((p) => nextPackages.add(p));\n }\n\n for (const pkgName of nextPackages) {\n const nextPkg = graph.packages.get(pkgName);\n\n if (filter && nextPkg && !filter(nextPkg)) {\n continue;\n }\n\n if (!affected.has(pkgName)) {\n affected.add(pkgName);\n queue.push({ name: pkgName, depth: current.depth + 1 });\n }\n }\n }\n\n return affected;\n}\n\nexport function findDependencyPath(\n from: string,\n to: string,\n graph: DependencyGraph,\n): string[] | null {\n const queue: string[][] = [[from]];\n const visited = new Set<string>([from]);\n\n while (queue.length > 0) {\n const path = queue.shift()!;\n const current = path[path.length - 1];\n\n if (!current) {\n continue;\n }\n\n if (current === to) {\n return path;\n }\n\n const dependents = graph.dependedBy.get(current) || new Set();\n for (const dependent of dependents) {\n if (!visited.has(dependent)) {\n visited.add(dependent);\n queue.push([...path, dependent]);\n }\n }\n }\n\n return null;\n}\n\nexport function findAllPaths(\n from: string,\n to: string,\n graph: DependencyGraph,\n maxPaths = 10,\n): string[][] {\n const paths: string[][] = [];\n const visited = new Set<string>();\n\n function dfs(current: string, path: string[]): void {\n if (paths.length >= maxPaths) return;\n\n if (current === to) {\n paths.push([...path]);\n return;\n }\n\n if (visited.has(current)) return;\n visited.add(current);\n\n const dependents = graph.dependedBy.get(current) || new Set();\n for (const dependent of dependents) {\n dfs(dependent, [...path, dependent]);\n }\n\n visited.delete(current);\n }\n\n dfs(from, [from]);\n return paths;\n}\n","import type { DependencyGraph, GraphStats } from './types';\n\nexport function analyzeGraph(graph: DependencyGraph): GraphStats {\n const leafNodes: string[] = [];\n const rootNodes: string[] = [];\n let totalEdges = 0;\n\n for (const [pkgName, dependents] of graph.dependedBy.entries()) {\n if (dependents.size === 0) {\n leafNodes.push(pkgName);\n }\n totalEdges += dependents.size;\n }\n\n for (const [pkgName, dependencies] of graph.dependsOn.entries()) {\n if (dependencies.size === 0) {\n rootNodes.push(pkgName);\n }\n }\n\n const maxDepth = calculateMaxDepth(graph);\n const cycles = detectCycles(graph);\n\n return {\n totalPackages: graph.packages.size,\n totalEdges,\n maxDepth,\n leafNodes,\n rootNodes,\n cycles,\n };\n}\n\nfunction calculateMaxDepth(graph: DependencyGraph): number {\n let maxDepth = 0;\n\n for (const pkgName of graph.packages.keys()) {\n const depth = getPackageDepth(pkgName, graph);\n if (depth > maxDepth) {\n maxDepth = depth;\n }\n }\n\n return maxDepth;\n}\n\nfunction getPackageDepth(\n pkgName: string,\n graph: DependencyGraph,\n visited = new Set<string>(),\n): number {\n if (visited.has(pkgName)) return 0;\n visited.add(pkgName);\n\n const dependencies = graph.dependsOn.get(pkgName) || new Set();\n if (dependencies.size === 0) return 0;\n\n let maxDepth = 0;\n for (const dep of dependencies) {\n const depth = getPackageDepth(dep, graph, new Set(visited));\n if (depth > maxDepth) {\n maxDepth = depth;\n }\n }\n\n return maxDepth + 1;\n}\n\nexport function detectCycles(graph: DependencyGraph): string[][] {\n const cycles: string[][] = [];\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n\n function dfs(pkgName: string, path: string[]): void {\n visited.add(pkgName);\n recursionStack.add(pkgName);\n path.push(pkgName);\n\n const dependencies = graph.dependsOn.get(pkgName) || new Set();\n for (const dep of dependencies) {\n if (!visited.has(dep)) {\n dfs(dep, [...path]);\n } else if (recursionStack.has(dep)) {\n const cycleStart = path.indexOf(dep);\n if (cycleStart !== -1) {\n const cycle = path.slice(cycleStart);\n cycle.push(dep);\n cycles.push(cycle);\n }\n }\n }\n\n recursionStack.delete(pkgName);\n }\n\n for (const pkgName of graph.packages.keys()) {\n if (!visited.has(pkgName)) {\n dfs(pkgName, []);\n }\n }\n\n return cycles;\n}\n\nexport function getTransitiveDependencies(\n pkgName: string,\n graph: DependencyGraph,\n): Set<string> {\n const transitive = new Set<string>();\n const visited = new Set<string>();\n\n function collect(current: string): void {\n if (visited.has(current)) return;\n visited.add(current);\n\n const deps = graph.dependsOn.get(current) || new Set();\n for (const dep of deps) {\n transitive.add(dep);\n collect(dep);\n }\n }\n\n collect(pkgName);\n return transitive;\n}\n\nexport function getTransitiveDependents(\n pkgName: string,\n graph: DependencyGraph,\n): Set<string> {\n const transitive = new Set<string>();\n const visited = new Set<string>();\n\n function collect(current: string): void {\n if (visited.has(current)) return;\n visited.add(current);\n\n const dependents = graph.dependedBy.get(current) || new Set();\n for (const dependent of dependents) {\n transitive.add(dependent);\n collect(dependent);\n }\n }\n\n collect(pkgName);\n return transitive;\n}\n","import { join, resolve } from 'node:path';\nimport type { WorkspacePackage } from '../graph/types';\nimport type {\n FileSystemClient,\n GlobClient,\n YamlClient,\n} from '../types/clients';\n\nexport interface WorkspaceConfig {\n packages: string[];\n}\n\nexport interface WorkspaceDiscoveryConfig {\n fs: FileSystemClient;\n glob: GlobClient;\n yaml: YamlClient;\n}\n\nexport async function discoverWorkspaces(\n rootDir: string,\n config: WorkspaceDiscoveryConfig,\n): Promise<WorkspacePackage[]> {\n const workspaceConfig = await loadWorkspaceConfig(rootDir, config);\n const packages: WorkspacePackage[] = [];\n\n for (const pattern of workspaceConfig.packages) {\n if (pattern.startsWith('!')) continue;\n\n const pkgDirs = await findPackageDirectories(rootDir, pattern, config);\n\n for (const pkgDir of pkgDirs) {\n const pkgJsonPath = join(pkgDir, 'package.json');\n\n try {\n const pkgJsonContent: string = await config.fs.readFile(\n pkgJsonPath,\n 'utf-8',\n );\n const pkgJson = JSON.parse(pkgJsonContent) as {\n name: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n };\n\n packages.push({\n name: pkgJson.name,\n version: pkgJson.version || '0.0.0',\n path: pkgDir,\n packageJson: pkgJson,\n dependencies: pkgJson.dependencies || {},\n devDependencies: pkgJson.devDependencies || {},\n });\n } catch {\n continue;\n }\n }\n }\n\n return packages;\n}\n\nasync function loadWorkspaceConfig(\n rootDir: string,\n config: WorkspaceDiscoveryConfig,\n): Promise<WorkspaceConfig> {\n const workspaceFilePath = join(rootDir, 'pnpm-workspace.yaml');\n\n try {\n const content: string = await config.fs.readFile(\n workspaceFilePath,\n 'utf-8',\n );\n const parsed = config.yaml.parse(content) as WorkspaceConfig;\n return parsed;\n } catch {\n return { packages: [] };\n }\n}\n\nasync function findPackageDirectories(\n rootDir: string,\n pattern: string,\n config: WorkspaceDiscoveryConfig,\n): Promise<string[]> {\n const matches: string[] = await config.glob.glob(pattern, {\n cwd: rootDir,\n absolute: false,\n ignore: ['**/node_modules/**', '**/.next/**', '**/dist/**'],\n });\n\n return matches.map((match: string) => resolve(rootDir, match));\n}\n","import { existsSync } from 'node:fs';\nimport { join, relative, sep } from 'node:path';\nimport type { WorkspacePackage } from '../graph/types';\n\nexport interface MappedWorkspacePath {\n filesystemPath: string;\n workflowPath: string | null;\n}\n\nexport interface WorkspacePackageMap {\n packageMap: Map<string, MappedWorkspacePath>;\n workspaceRoots: Set<string>;\n}\n\nexport function normalizeRelativePath(path: string): string {\n return path.split(sep).join('/');\n}\n\nfunction resolveWorkflowPath(\n relativePath: string,\n rootDir: string,\n): string | null {\n if (!relativePath.startsWith('../')) {\n return relativePath;\n }\n\n const segments = relativePath.split('/');\n\n for (let index = 0; index < segments.length; index += 1) {\n const candidateSegments = segments.slice(index);\n if (candidateSegments.length === 0 || candidateSegments[0] === '..') {\n continue;\n }\n\n const candidatePath = candidateSegments.join('/');\n if (existsSync(join(rootDir, candidatePath))) {\n return candidatePath;\n }\n }\n\n return null;\n}\n\nexport function buildPackageMap(\n packages: WorkspacePackage[],\n rootDir: string,\n): WorkspacePackageMap {\n const packageMap = new Map<string, MappedWorkspacePath>();\n const workspaceRoots = new Set<string>();\n\n for (const pkg of packages) {\n const relativePath = normalizeRelativePath(relative(rootDir, pkg.path));\n const workflowPath = resolveWorkflowPath(relativePath, rootDir);\n\n packageMap.set(pkg.name, {\n filesystemPath: relativePath,\n workflowPath,\n });\n\n if (!workflowPath) {\n continue;\n }\n\n const [workspaceRoot] = workflowPath.split('/');\n if (workspaceRoot) {\n workspaceRoots.add(workspaceRoot);\n }\n }\n\n return {\n packageMap,\n workspaceRoots,\n };\n}\n","import type { WorkspacePackage } from '../graph/types';\n\nexport function findPackageForFile(\n filePath: string,\n packages: WorkspacePackage[],\n): WorkspacePackage | undefined {\n const sorted = packages.sort((a, b) => b.path.length - a.path.length);\n\n for (const pkg of sorted) {\n if (filePath.startsWith(pkg.path + '/') || filePath === pkg.path) {\n return pkg;\n }\n }\n\n return undefined;\n}\n\nexport function mapFilesToPackages(\n files: string[],\n packages: WorkspacePackage[],\n): Map<string, string[]> {\n const fileMap = new Map<string, string[]>();\n\n for (const file of files) {\n const pkg = findPackageForFile(file, packages);\n if (pkg) {\n if (!fileMap.has(pkg.name)) {\n fileMap.set(pkg.name, []);\n }\n fileMap.get(pkg.name)!.push(file);\n }\n }\n\n return fileMap;\n}\n","import type { WorkflowValidationPolicy } from './types';\n\nexport const defaultWorkflowValidationPolicy: WorkflowValidationPolicy = {\n workflowFilePatterns: ['deploy-*.yml', 'release-*.yml'],\n allowedRootPaths: [\n 'package.json',\n 'pnpm-lock.yaml',\n 'pnpm-workspace.yaml',\n 'turbo.json',\n ],\n includeDevDependenciesForRootPackage: true,\n includeDevDependenciesTransitively: false,\n};\n","import { existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { WorkspacePackage } from '../graph/types';\nimport { buildPackageMap } from '../workspace/package-map';\nimport type { WorkflowTarget, WorkflowValidationPolicy } from './types';\n\nfunction patternToRegExp(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`^${escaped.replace(/\\*/g, '.*')}$`);\n}\n\nexport function discoverWorkflowTargets(\n rootDir: string,\n packages: WorkspacePackage[],\n policy: WorkflowValidationPolicy,\n): WorkflowTarget[] {\n const workflowsDir = join(rootDir, '.github/workflows');\n if (!existsSync(workflowsDir)) {\n return [];\n }\n\n const { packageMap } = buildPackageMap(packages, rootDir);\n const appPackages = packages.filter((pkg) =>\n packageMap.get(pkg.name)?.workflowPath?.startsWith('apps/'),\n );\n const bySlug = new Map<string, string>();\n\n for (const pkg of appPackages) {\n const relativePath = packageMap.get(pkg.name)?.workflowPath;\n if (!relativePath) {\n continue;\n }\n\n const slug = relativePath.split('/').at(-1);\n if (slug) {\n bySlug.set(slug, pkg.name);\n }\n }\n\n const allowedPatterns = policy.workflowFilePatterns.map(patternToRegExp);\n const files = readdirSync(workflowsDir)\n .filter((file) => file.endsWith('.yml'))\n .filter((file) => allowedPatterns.some((pattern) => pattern.test(file)));\n\n return files\n .map((workflowFile) => {\n const match = /^(?:deploy|release)-(.+)\\.yml$/.exec(workflowFile);\n const targetSlug = match?.[1] ?? workflowFile.replace(/\\.yml$/, '');\n\n return {\n workflowFile,\n workflowPath: `.github/workflows/${workflowFile}`,\n targetSlug,\n targetPackage: bySlug.get(targetSlug) ?? null,\n };\n })\n .sort((a, b) => a.workflowFile.localeCompare(b.workflowFile));\n}\n","import type { WorkspacePackage } from '../graph/types';\nimport type { WorkflowTarget, WorkflowValidationPolicy } from './types';\n\ninterface ExpectedPathsOptions {\n workflowTarget: WorkflowTarget;\n packages: WorkspacePackage[];\n packageMap: Map<string, { workflowPath: string | null }>;\n policy: WorkflowValidationPolicy;\n}\n\nfunction uniqueSorted(values: string[]): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nfunction resolveWorkspaceDependency(\n dependencyName: string,\n packages: WorkspacePackage[],\n): WorkspacePackage | undefined {\n let match = packages.find((pkg) => pkg.name === dependencyName);\n if (match) {\n return match;\n }\n\n match = packages.find((pkg) => pkg.name === `@repo/${dependencyName}`);\n if (match) {\n return match;\n }\n\n const nameWithoutRepo = dependencyName.replace(/^@repo\\//, '');\n return packages.find((pkg) => pkg.name === nameWithoutRepo);\n}\n\nfunction collectWorkspaceDependencyNames(\n pkg: WorkspacePackage,\n packages: WorkspacePackage[],\n visited: Set<string>,\n includeDevDependencies: boolean,\n includeDevDependenciesTransitively: boolean,\n): Set<string> {\n const collected = new Set<string>();\n const dependencyEntries = Object.entries(pkg.dependencies);\n const devDependencyEntries = includeDevDependencies\n ? Object.entries(pkg.devDependencies)\n : [];\n\n for (const [dependencyName] of [\n ...dependencyEntries,\n ...devDependencyEntries,\n ]) {\n const dependency = resolveWorkspaceDependency(dependencyName, packages);\n if (!dependency || visited.has(dependency.name)) {\n continue;\n }\n\n visited.add(dependency.name);\n collected.add(dependency.name);\n\n const nestedDependencies = collectWorkspaceDependencyNames(\n dependency,\n packages,\n visited,\n includeDevDependenciesTransitively,\n includeDevDependenciesTransitively,\n );\n\n for (const nestedDependency of nestedDependencies) {\n collected.add(nestedDependency);\n }\n }\n\n return collected;\n}\n\nexport function getExpectedWorkflowPaths({\n workflowTarget,\n packages,\n packageMap,\n policy,\n}: ExpectedPathsOptions): string[] {\n const targetPackageName = workflowTarget.targetPackage;\n if (!targetPackageName) {\n return [];\n }\n\n const targetPackage = packages.find((pkg) => pkg.name === targetPackageName);\n if (!targetPackage) {\n return [];\n }\n\n const dependencyNames = collectWorkspaceDependencyNames(\n targetPackage,\n packages,\n new Set<string>(),\n policy.includeDevDependenciesForRootPackage,\n policy.includeDevDependenciesTransitively,\n );\n\n const expectedPaths: string[] = [];\n const targetPackagePath = packageMap.get(targetPackageName)?.workflowPath;\n if (targetPackagePath) {\n expectedPaths.push(`${targetPackagePath}/**`);\n }\n\n for (const dependencyName of dependencyNames) {\n const dependencyPath = packageMap.get(dependencyName)?.workflowPath;\n if (dependencyPath) {\n expectedPaths.push(`${dependencyPath}/**`);\n }\n }\n\n return uniqueSorted(expectedPaths);\n}\n","import type { WorkspacePackage } from '../graph/types';\nimport { buildPackageMap } from '../workspace/package-map';\nimport { discoverWorkflowTargets } from './discovery';\nimport { getExpectedWorkflowPaths } from './expected-paths';\nimport { defaultWorkflowValidationPolicy } from './policy';\nimport type { WorkflowImpact, WorkflowValidationPolicy } from './types';\n\nfunction uniqueSorted(values: string[]): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nfunction mergeWorkflowPolicy(\n policyOverrides?: Partial<WorkflowValidationPolicy>,\n): WorkflowValidationPolicy {\n return {\n ...defaultWorkflowValidationPolicy,\n ...policyOverrides,\n allowedRootPaths: uniqueSorted([\n ...defaultWorkflowValidationPolicy.allowedRootPaths,\n ...(policyOverrides?.allowedRootPaths ?? []),\n ]),\n };\n}\n\n// Path matching intentionally only supports exact paths and /** prefix matching\n// because that mirrors the workflow filters currently used in these repos.\nexport function matchesWorkflowPathFilter(\n changedPath: string,\n workflowPathFilter: string,\n): boolean {\n if (workflowPathFilter === changedPath) {\n return true;\n }\n\n if (!workflowPathFilter.endsWith('/**')) {\n return false;\n }\n\n const workflowPrefix = workflowPathFilter.slice(0, -3);\n return changedPath.startsWith(`${workflowPrefix}/`);\n}\n\nexport function getWorkflowImpacts(\n rootDir: string,\n packages: WorkspacePackage[],\n changedPaths: string[],\n policyOverrides?: Partial<WorkflowValidationPolicy>,\n): WorkflowImpact[] {\n const policy = mergeWorkflowPolicy(policyOverrides);\n const workflowTargets = discoverWorkflowTargets(rootDir, packages, policy);\n const { packageMap } = buildPackageMap(packages, rootDir);\n\n return workflowTargets\n .map((workflowTarget) => {\n const calculatedPaths = uniqueSorted([\n ...getExpectedWorkflowPaths({\n workflowTarget,\n packages,\n packageMap,\n policy,\n }),\n ...policy.allowedRootPaths,\n workflowTarget.workflowPath,\n ]);\n const matchedPaths = calculatedPaths.filter((calculatedPath) =>\n changedPaths.some((changedPath) =>\n matchesWorkflowPathFilter(changedPath, calculatedPath),\n ),\n );\n\n return {\n ...workflowTarget,\n matchedPaths: uniqueSorted(matchedPaths),\n } satisfies WorkflowImpact;\n })\n .filter((workflowImpact) => workflowImpact.matchedPaths.length > 0);\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { glob } from 'glob';\nimport { parse as parseYaml } from 'yaml';\nimport { discoverWorkspaces } from '../workspace/discovery';\nimport { buildPackageMap } from '../workspace/package-map';\nimport type {\n WorkflowValidationIssue,\n WorkflowValidationPolicy,\n WorkflowValidationResult,\n} from './types';\nimport { discoverWorkflowTargets } from './discovery';\nimport { getExpectedWorkflowPaths } from './expected-paths';\nimport { parseWorkflowFile } from './parser';\nimport { defaultWorkflowValidationPolicy } from './policy';\n\nfunction uniqueSorted(values: string[]): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nfunction buildBroadWildcards(workspaceRoots: Set<string>): Set<string> {\n const wildcards = new Set<string>();\n\n for (const root of workspaceRoots) {\n wildcards.add(`${root}/*`);\n wildcards.add(`${root}/**`);\n }\n\n return wildcards;\n}\n\nfunction splitActualPaths(\n paths: string[],\n workspaceRoots: Set<string>,\n allowedRootPaths: string[],\n workflowPath: string,\n): { workspacePaths: string[]; ignoredPaths: string[] } {\n const workspacePaths: string[] = [];\n const ignoredPaths: string[] = [];\n\n for (const path of paths) {\n if (path === workflowPath || allowedRootPaths.includes(path)) {\n ignoredPaths.push(path);\n continue;\n }\n\n const [rootSegment] = path.split('/');\n if (rootSegment && workspaceRoots.has(rootSegment)) {\n workspacePaths.push(path);\n continue;\n }\n\n ignoredPaths.push(path);\n }\n\n return {\n workspacePaths: uniqueSorted(workspacePaths),\n ignoredPaths: uniqueSorted(ignoredPaths),\n };\n}\n\nfunction isCoveredByExpectedPath(\n actualPath: string,\n expectedPaths: string[],\n): boolean {\n return expectedPaths.some((expectedPath) => {\n if (expectedPath === actualPath) {\n return true;\n }\n\n if (!expectedPath.endsWith('/**')) {\n return false;\n }\n\n const expectedPrefix = expectedPath.slice(0, -3);\n return actualPath.startsWith(`${expectedPrefix}/`);\n });\n}\n\nfunction validateWorkflowResult(\n workflow: string,\n targetPackage: string,\n expectedPaths: string[],\n actualPaths: string[],\n broadWildcards: Set<string>,\n): WorkflowValidationResult {\n const issues: WorkflowValidationIssue[] = [];\n const missing = expectedPaths.filter((path) => !actualPaths.includes(path));\n const unnecessary = actualPaths.filter(\n (path) => !isCoveredByExpectedPath(path, expectedPaths),\n );\n\n for (const path of missing) {\n issues.push({\n kind: 'missing',\n path,\n message: `Missing path '${path}'`,\n });\n }\n\n for (const path of unnecessary) {\n issues.push({\n kind: 'unnecessary',\n path,\n message: `Unnecessary path '${path}'`,\n });\n }\n\n for (const path of actualPaths) {\n if (broadWildcards.has(path)) {\n issues.push({\n kind: 'broad-wildcard',\n path,\n message: `Uses broad wildcard '${path}' which triggers on all workspace changes under that root`,\n });\n }\n }\n\n return {\n workflow,\n targetPackage,\n valid: issues.length === 0,\n expectedPaths,\n actualPaths,\n missing,\n unnecessary,\n issues,\n };\n}\n\nexport async function validateWorkflows(\n rootDir: string,\n policyOverrides?: Partial<WorkflowValidationPolicy>,\n): Promise<WorkflowValidationResult[]> {\n const discoveredPackages = await discoverWorkspaces(rootDir, {\n fs: {\n readFile: (path, encoding) => readFile(path, encoding),\n exists: (path) => Promise.resolve(existsSync(path)),\n },\n glob: {\n glob: (pattern, options) => glob(pattern, options),\n },\n yaml: {\n parse: (content): unknown => parseYaml(content),\n },\n });\n\n const policy: WorkflowValidationPolicy = {\n ...defaultWorkflowValidationPolicy,\n ...policyOverrides,\n allowedRootPaths: uniqueSorted([\n ...defaultWorkflowValidationPolicy.allowedRootPaths,\n ...(policyOverrides?.allowedRootPaths ?? []),\n ]),\n };\n\n const { packageMap, workspaceRoots } = buildPackageMap(\n discoveredPackages,\n rootDir,\n );\n const workflowTargets = discoverWorkflowTargets(\n rootDir,\n discoveredPackages,\n policy,\n );\n const broadWildcards = buildBroadWildcards(workspaceRoots);\n\n return workflowTargets.map((workflowTarget) => {\n if (!workflowTarget.targetPackage) {\n return {\n workflow: workflowTarget.workflowFile,\n targetPackage: workflowTarget.targetSlug,\n valid: false,\n expectedPaths: [],\n actualPaths: [],\n missing: [],\n unnecessary: [],\n issues: [\n {\n kind: 'config-error',\n message: `Could not resolve workflow target package for '${workflowTarget.workflowFile}'`,\n },\n ],\n };\n }\n\n try {\n const parsedWorkflow = parseWorkflowFile(\n workflowTarget.workflowFile,\n rootDir,\n );\n\n if (parsedWorkflow.paths.length === 0) {\n return {\n workflow: workflowTarget.workflowFile,\n targetPackage: workflowTarget.targetPackage,\n valid: true,\n expectedPaths: [],\n actualPaths: [],\n missing: [],\n unnecessary: [],\n issues: [],\n };\n }\n\n const { workspacePaths: actualPaths } = splitActualPaths(\n parsedWorkflow.paths,\n workspaceRoots,\n policy.allowedRootPaths,\n workflowTarget.workflowPath,\n );\n const expectedPaths = getExpectedWorkflowPaths({\n workflowTarget,\n packages: discoveredPackages,\n packageMap,\n policy,\n });\n\n return validateWorkflowResult(\n workflowTarget.workflowFile,\n workflowTarget.targetPackage,\n expectedPaths,\n actualPaths,\n broadWildcards,\n );\n } catch (error) {\n return {\n workflow: workflowTarget.workflowFile,\n targetPackage: workflowTarget.targetPackage,\n valid: false,\n expectedPaths: [],\n actualPaths: [],\n missing: [],\n unnecessary: [],\n issues: [\n {\n kind: 'parse-error',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n });\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport type { ParsedWorkflow } from './types';\n\ninterface WorkflowConfig {\n name?: string;\n on?: {\n push?: {\n paths?: string[];\n };\n pull_request?: {\n paths?: string[];\n };\n };\n}\n\nfunction uniqueSorted(values: string[]): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nexport function parseWorkflowFile(\n workflowFile: string,\n rootDir: string,\n): ParsedWorkflow {\n const workflowPath = join(rootDir, '.github/workflows', workflowFile);\n\n if (!existsSync(workflowPath)) {\n throw new Error(`Workflow file not found: ${workflowFile}`);\n }\n\n const content = readFileSync(workflowPath, 'utf-8');\n const workflow = parseYaml(content) as WorkflowConfig;\n const pushPaths = workflow.on?.push?.paths ?? [];\n const pullRequestPaths = workflow.on?.pull_request?.paths ?? [];\n\n const parsedWorkflow: ParsedWorkflow = {\n pushPaths: uniqueSorted(pushPaths),\n pullRequestPaths: uniqueSorted(pullRequestPaths),\n paths: uniqueSorted([...pushPaths, ...pullRequestPaths]),\n };\n\n if (workflow.name) {\n parsedWorkflow.name = workflow.name;\n }\n\n return parsedWorkflow;\n}\n"],"mappings":"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","names":["join","existsSync","join","join","existsSync","uniqueSorted","existsSync","parseYaml","existsSync","join","uniqueSorted","uniqueSorted","existsSync","parseYaml"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface FileSystemClient {
|
|
2
|
+
readFile(path: string, encoding: 'utf-8'): Promise<string>;
|
|
3
|
+
exists(path: string): Promise<boolean>;
|
|
4
|
+
}
|
|
5
|
+
export interface GlobClient {
|
|
6
|
+
glob(pattern: string, options: {
|
|
7
|
+
cwd: string;
|
|
8
|
+
absolute: boolean;
|
|
9
|
+
ignore?: string[];
|
|
10
|
+
}): Promise<string[]>;
|
|
11
|
+
}
|
|
12
|
+
export interface YamlClient {
|
|
13
|
+
parse(content: string): unknown;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=clients.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/types/clients.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CACF,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,GACA,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WorkspacePackage } from '../graph/types';
|
|
2
|
+
import type { WorkflowTarget, WorkflowValidationPolicy } from './types';
|
|
3
|
+
export declare function discoverWorkflowTargets(rootDir: string, packages: WorkspacePackage[], policy: WorkflowValidationPolicy): WorkflowTarget[];
|
|
4
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/workflow/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAOxE,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,MAAM,EAAE,wBAAwB,GAC/B,cAAc,EAAE,CA0ClB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { WorkspacePackage } from '../graph/types';
|
|
2
|
+
import type { WorkflowTarget, WorkflowValidationPolicy } from './types';
|
|
3
|
+
interface ExpectedPathsOptions {
|
|
4
|
+
workflowTarget: WorkflowTarget;
|
|
5
|
+
packages: WorkspacePackage[];
|
|
6
|
+
packageMap: Map<string, {
|
|
7
|
+
workflowPath: string | null;
|
|
8
|
+
}>;
|
|
9
|
+
policy: WorkflowValidationPolicy;
|
|
10
|
+
}
|
|
11
|
+
export declare function getExpectedWorkflowPaths({ workflowTarget, packages, packageMap, policy, }: ExpectedPathsOptions): string[];
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=expected-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expected-paths.d.ts","sourceRoot":"","sources":["../../src/workflow/expected-paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAExE,UAAU,oBAAoB;IAC5B,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACzD,MAAM,EAAE,wBAAwB,CAAC;CAClC;AAiED,wBAAgB,wBAAwB,CAAC,EACvC,cAAc,EACd,QAAQ,EACR,UAAU,EACV,MAAM,GACP,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAiCjC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { WorkspacePackage } from '../graph/types';
|
|
2
|
+
import type { WorkflowImpact, WorkflowValidationPolicy } from './types';
|
|
3
|
+
export declare function matchesWorkflowPathFilter(changedPath: string, workflowPathFilter: string): boolean;
|
|
4
|
+
export declare function getWorkflowImpacts(rootDir: string, packages: WorkspacePackage[], changedPaths: string[], policyOverrides?: Partial<WorkflowValidationPolicy>): WorkflowImpact[];
|
|
5
|
+
//# sourceMappingURL=impact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../../src/workflow/impact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKvD,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAqBxE,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAWT;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,YAAY,EAAE,MAAM,EAAE,EACtB,eAAe,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAClD,cAAc,EAAE,CA6BlB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/workflow/parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAkB9C,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,cAAc,CAuBhB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/workflow/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAExD,eAAO,MAAM,+BAA+B,EAAE,wBAU7C,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface WorkflowValidationPolicy {
|
|
2
|
+
workflowFilePatterns: string[];
|
|
3
|
+
/**
|
|
4
|
+
* Root-level paths that currently act as global workflow-impact paths and
|
|
5
|
+
* validator-ignored runtime config paths.
|
|
6
|
+
*/
|
|
7
|
+
allowedRootPaths: string[];
|
|
8
|
+
includeDevDependenciesForRootPackage: boolean;
|
|
9
|
+
includeDevDependenciesTransitively: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface WorkflowValidationIssue {
|
|
12
|
+
kind: 'missing' | 'unnecessary' | 'broad-wildcard' | 'parse-error' | 'config-error';
|
|
13
|
+
message: string;
|
|
14
|
+
path?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface WorkflowValidationResult {
|
|
17
|
+
workflow: string;
|
|
18
|
+
targetPackage: string;
|
|
19
|
+
valid: boolean;
|
|
20
|
+
expectedPaths: string[];
|
|
21
|
+
actualPaths: string[];
|
|
22
|
+
missing: string[];
|
|
23
|
+
unnecessary: string[];
|
|
24
|
+
issues: WorkflowValidationIssue[];
|
|
25
|
+
}
|
|
26
|
+
export interface ParsedWorkflow {
|
|
27
|
+
name?: string;
|
|
28
|
+
pushPaths: string[];
|
|
29
|
+
pullRequestPaths: string[];
|
|
30
|
+
paths: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface WorkflowTarget {
|
|
33
|
+
workflowFile: string;
|
|
34
|
+
workflowPath: string;
|
|
35
|
+
targetSlug: string;
|
|
36
|
+
targetPackage: string | null;
|
|
37
|
+
}
|
|
38
|
+
export interface WorkflowImpact extends WorkflowTarget {
|
|
39
|
+
matchedPaths: string[];
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/workflow/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B;;;OAGG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,oCAAoC,EAAE,OAAO,CAAC;IAC9C,kCAAkC,EAAE,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EACA,SAAS,GACT,aAAa,GACb,gBAAgB,GAChB,aAAa,GACb,cAAc,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,uBAAuB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { WorkflowValidationPolicy, WorkflowValidationResult } from './types';
|
|
2
|
+
export declare function validateWorkflows(rootDir: string, policyOverrides?: Partial<WorkflowValidationPolicy>): Promise<WorkflowValidationResult[]>;
|
|
3
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/workflow/validator.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAwHjB,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAClD,OAAO,CAAC,wBAAwB,EAAE,CAAC,CA8GrC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { WorkspacePackage } from '../graph/types';
|
|
2
|
+
import type { FileSystemClient, GlobClient, YamlClient } from '../types/clients';
|
|
3
|
+
export interface WorkspaceConfig {
|
|
4
|
+
packages: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface WorkspaceDiscoveryConfig {
|
|
7
|
+
fs: FileSystemClient;
|
|
8
|
+
glob: GlobClient;
|
|
9
|
+
yaml: YamlClient;
|
|
10
|
+
}
|
|
11
|
+
export declare function discoverWorkspaces(rootDir: string, config: WorkspaceDiscoveryConfig): Promise<WorkspacePackage[]>;
|
|
12
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/workspace/discovery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EACV,UAAU,EACX,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,gBAAgB,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwC7B"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WorkspacePackage } from '../graph/types';
|
|
2
|
+
export declare function findPackageForFile(filePath: string, packages: WorkspacePackage[]): WorkspacePackage | undefined;
|
|
3
|
+
export declare function mapFilesToPackages(files: string[], packages: WorkspacePackage[]): Map<string, string[]>;
|
|
4
|
+
//# sourceMappingURL=file-mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-mapping.d.ts","sourceRoot":"","sources":["../../src/workspace/file-mapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,gBAAgB,GAAG,SAAS,CAU9B;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAcvB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { WorkspacePackage } from '../graph/types';
|
|
2
|
+
export interface MappedWorkspacePath {
|
|
3
|
+
filesystemPath: string;
|
|
4
|
+
workflowPath: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface WorkspacePackageMap {
|
|
7
|
+
packageMap: Map<string, MappedWorkspacePath>;
|
|
8
|
+
workspaceRoots: Set<string>;
|
|
9
|
+
}
|
|
10
|
+
export declare function normalizeRelativePath(path: string): string;
|
|
11
|
+
export declare function buildPackageMap(packages: WorkspacePackage[], rootDir: string): WorkspacePackageMap;
|
|
12
|
+
//# sourceMappingURL=package-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-map.d.ts","sourceRoot":"","sources":["../../src/workspace/package-map.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AA2BD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,EAAE,MAAM,GACd,mBAAmB,CA2BrB"}
|
package/package.json
CHANGED
|
@@ -1,32 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crossplatformai/dependency-graph",
|
|
3
3
|
"description": "Workspace dependency graph tooling for CrossPlatform.ai projects.",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
"license": "SEE LICENSE IN LICENSE",
|
|
8
|
-
"main": "./src/index.ts",
|
|
9
|
-
"types": "./src/index.ts",
|
|
10
|
-
"repository": {
|
|
11
|
-
"type": "git",
|
|
12
|
-
"url": "git+https://github.com/crossplatformai/framework.git",
|
|
13
|
-
"directory": "packages/dependency-graph"
|
|
14
|
-
},
|
|
15
|
-
"publishConfig": {
|
|
16
|
-
"access": "public"
|
|
17
|
-
},
|
|
18
|
-
"files": [
|
|
19
|
-
"src"
|
|
20
|
-
],
|
|
21
|
-
"exports": {
|
|
22
|
-
".": {
|
|
23
|
-
"types": "./src/index.ts",
|
|
24
|
-
"import": "./src/index.ts"
|
|
25
|
-
}
|
|
4
|
+
"version": "0.11.0-next.0",
|
|
5
|
+
"bin": {
|
|
6
|
+
"dependency-graph": "./dist/index-cli.js"
|
|
26
7
|
},
|
|
27
8
|
"dependencies": {
|
|
28
9
|
"glob": "^13.0.6",
|
|
29
|
-
"yaml": "^2.
|
|
10
|
+
"yaml": "^2.8.3"
|
|
30
11
|
},
|
|
31
12
|
"devDependencies": {
|
|
32
13
|
"@eslint/js": "^9.39.2",
|
|
@@ -37,18 +18,42 @@
|
|
|
37
18
|
"eslint-plugin-prettier": "^5.5.5",
|
|
38
19
|
"globals": "^17.3.0",
|
|
39
20
|
"prettier": "^3.8.1",
|
|
21
|
+
"tsup": "^8.4.0",
|
|
40
22
|
"typescript": "~5.9.3",
|
|
41
23
|
"typescript-eslint": "^8.54.0",
|
|
42
24
|
"vitest": "^4.0.17",
|
|
43
|
-
"@crossplatformai/typescript-config": "0.7.0"
|
|
25
|
+
"@crossplatformai/typescript-config": "0.7.1-next.0"
|
|
44
26
|
},
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist",
|
|
35
|
+
"README.md",
|
|
36
|
+
"LICENSE"
|
|
37
|
+
],
|
|
38
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
39
|
+
"main": "./dist/index.js",
|
|
40
|
+
"private": false,
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
},
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "git+https://github.com/crossplatformai/framework.git",
|
|
47
|
+
"directory": "packages/dependency-graph"
|
|
48
|
+
},
|
|
49
|
+
"type": "module",
|
|
50
|
+
"types": "./dist/index.d.ts",
|
|
45
51
|
"scripts": {
|
|
46
|
-
"
|
|
52
|
+
"build": "tsup && tsc -p tsconfig.build.json --emitDeclarationOnly",
|
|
47
53
|
"lint": "eslint . --cache --fix --max-warnings 0",
|
|
48
|
-
"
|
|
54
|
+
"release": "node ../../scripts/publish-smart.mjs",
|
|
49
55
|
"test": "vitest run",
|
|
50
56
|
"test:watch": "vitest",
|
|
51
|
-
"
|
|
52
|
-
"publish:latest": "node ../../scripts/publish-release.mjs latest"
|
|
57
|
+
"typecheck": "tsc --noEmit --skipLibCheck"
|
|
53
58
|
}
|
|
54
59
|
}
|