diff --git a/get_packages.py b/get_packages.py index 965d6d6..d88b304 100755 --- a/get_packages.py +++ b/get_packages.py @@ -2,59 +2,42 @@ import os import json -from collections import defaultdict -def parse_package_json(file_path): - with open(file_path, 'r') as f: - return json.load(f) +def get_deps(package): + with open(os.path.join('packages', package, 'package.json'), 'r') as f: + package_data = json.load(f) -def get_dependencies(package_data): dependencies = set() for dep_type in ['dependencies', 'devDependencies', 'peerDependencies']: if dep_type in package_data: dependencies.update(package_data[dep_type].keys()) - return dependencies -def topological_sort(graph): - visited = set() - stack = [] - - def dfs(node): - visited.add(node) - for neighbor in graph[node]: - if neighbor not in visited: - dfs(neighbor) - stack.append(node) - - for node in graph: - if node not in visited: - dfs(node) - - return stack[::-1] + return [ + dep.replace('@welshman/', '') + for dep in dependencies + if dep.startswith('@welshman/') + ] def main(): - packages_dir = 'packages' - package_graph = defaultdict(set) - all_packages = set() + sorted_packages = [] + remaining_packages = {} + for package in os.listdir('packages'): + deps = get_deps(package) - # Walk through the packages directory - for package_name in os.listdir(packages_dir): - package_path = os.path.join(packages_dir, package_name) - if os.path.isdir(package_path): - package_json_path = os.path.join(package_path, 'package.json') - if os.path.exists(package_json_path): - all_packages.add(package_name) - package_data = parse_package_json(package_json_path) - dependencies = get_dependencies(package_data) + if not deps: + sorted_packages.append(package) + else: + remaining_packages[package] = deps - # Only consider dependencies that are in the packages directory - internal_dependencies = dependencies.intersection(all_packages) - package_graph[package_name].update(internal_dependencies) + while remaining_packages: + for package, deps in remaining_packages.items(): + if all([dep in sorted_packages for dep in deps]): + sorted_packages.append(package) - # Perform topological sort - sorted_packages = topological_sort(package_graph) + for package in sorted_packages: + if package in remaining_packages: + del remaining_packages[package] - # Output the result for package in sorted_packages: print(package) diff --git a/package-lock.json b/package-lock.json index b6a43d2..1bf525f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3341,6 +3341,7 @@ "version": "0.0.15", "license": "MIT", "dependencies": { + "@welshman/lib": "0.0.15", "@welshman/util": "0.0.27" }, "devDependencies": { @@ -3410,6 +3411,8 @@ "version": "0.0.3", "license": "MIT", "dependencies": { + "@welshman/lib": "0.0.15", + "@welshman/util": "0.0.27", "svelte": "^4.2.18" }, "devDependencies": { diff --git a/packages/feeds/package.json b/packages/feeds/package.json index 7758489..102f0c7 100644 --- a/packages/feeds/package.json +++ b/packages/feeds/package.json @@ -31,6 +31,7 @@ "typescript": "~5.1.6" }, "dependencies": { + "@welshman/lib": "0.0.15", "@welshman/util": "0.0.27" } } diff --git a/packages/store/package.json b/packages/store/package.json index ff7637a..3544b84 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -31,6 +31,8 @@ "typescript": "~5.1.6" }, "dependencies": { + "@welshman/lib": "0.0.15", + "@welshman/util": "0.0.27", "svelte": "^4.2.18" } }