-
Notifications
You must be signed in to change notification settings - Fork 221
PNPM workspaces #663
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
PNPM workspaces #663
Changes from 65 commits
Commits
Show all changes
71 commits
Select commit
Hold shift + click to select a range
b144b97
remove baseUrl/typeRoots
sandersn 689ccfc
WIP dtslint checks
sandersn 85f0532
check version in package.json
sandersn 2dbbcee
update to ts@next to match DT
sandersn 683cbf2
Switch from no-outside-dependencies to import/no-extraneous-dependencies
sandersn 2a62b4b
Fix used-files calculation and improve error output
sandersn 9ffae5f
allow all @types deps
sandersn 55bde30
Mostly done switching to package.json dep/devDeps
sandersn b19ebf4
Restore code for finding global values in source
sandersn 3b866d1
definitions-parser tests pass
sandersn c30e50a
*now* definitions-parser tests all pass
sandersn ffc9fc4
Make generate-packages tests pass
sandersn da605a2
npm i -> pnpm i (compiles but hasn't run yet)
sandersn 3d5cd40
Delete installDependencies entirely
sandersn a336a4e
Remove pathMapping check in definition-parser
sandersn ecac2cc
slice multiple prefixes from resolved filenames
sandersn 39d5fe7
add debug entrypoint for dtslint-runner
sandersn 72c0633
Switch from index.d.ts header to package.json
sandersn 2c80d98
Require either contributor url XOR githubUsername
sandersn 05fcf43
Switch to reporting errors at end, not throwing one at a time
sandersn dfa99bd
1. Remove npm consistency checks in dtslint-runner. They are unused.
sandersn 7bca052
Switch to more semver
sandersn 1749d27
Package publication works now.
sandersn fbbc16d
Merge branch 'master' into pnpm-workspaces
andrewbranch 1747765
Fix merge conflict mistakes
andrewbranch c0890ef
Merge branch 'master' into pnpm-workspaces
sandersn 0e51163
Test fixes
sandersn 069c892
1. Add two new external dependencies
sandersn 957cb23
dprint
sandersn 8a19bd0
fix lint
sandersn 3626e27
Fix version of packages after parsing
sandersn b302acc
Minor fixes
sandersn 246e90d
Merge branch 'master' into pnpm-workspaces
andrewbranch ce65d47
Merge branch 'master' into pnpm-workspaces
andrewbranch a93d80e
realpath when enumerating files
andrewbranch f0903be
Rename name-related fields (#752)
andrewbranch 7cf05ac
Include nonNpm in published package.json
andrewbranch 8a2d200
Pnpm workspaces: fix dtslint-runner incremental (#753)
sandersn 669100b
getAffectedPackages:array of errors, don't throw
sandersn 6c3f181
fix lint
sandersn 1c95ea2
Cleanup and TODOs
sandersn fc9aa97
Move more things to header-parser
sandersn a80c7dd
Parse with semver
sandersn ea10c0d
require devDeps to have self-ref w/workspace:.
sandersn 67ad027
Move semver deps
sandersn f22f195
Forbid references to old /v* packages
sandersn 249031c
make definitions-parser error handling more like header-parser
sandersn cef6149
new validation for tsconfig "paths"
sandersn d5f2a9d
format files
sandersn cda4775
Remove lint + a couple of TODOs
sandersn e5a2fb2
lint rule to forbid old header
sandersn a99ce6c
new lint: forbid devDep imports in .d.ts
sandersn 7d58195
Allow self-reference in no-import-of-dev-dependencies
sandersn 53402d2
forbid pinning on-DT @types/ packages
sandersn 2b3ad3b
update READMEs
sandersn 12b8ddc
make dtslint example files more generic
sandersn beb0355
Edits from self-review of PR
sandersn 9266a75
npmNaming: report all errors always
sandersn 1095384
dtslint-runner --clone SHA runs pnpm install once again
sandersn 4aba26b
fix direction of clone check
sandersn 102c3f3
Remove globals, make praser not crash on empty directories, remove de…
andrewbranch 945114b
Remove obsolete test
andrewbranch b3509c5
Finish removing globals stuff
andrewbranch 86a0736
Package.json: change properties and patch version
sandersn 577b7da
address PR comments
sandersn 2bfab35
Update dts-critic message to reference package.json instead of header…
andrewbranch 2904537
dts-critic correctly passes typesVersions to header-parser
sandersn f1c69db
allow 0.0 versions to mismatch npm again
sandersn b4e40d1
get-affected-packages: check for dependents by package name
sandersn 1e7bb28
dtslint-runner: Simplify getAffectedPackagesFromDiff
sandersn 4a24663
Add changeset for shipping
sandersn File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
169 changes: 71 additions & 98 deletions
169
packages/definitions-parser/src/get-affected-packages.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,109 +1,82 @@ | ||
| import { mapDefined, mapIterable, sort } from "@definitelytyped/utils"; | ||
| import { | ||
| TypingsData, | ||
| AllPackages, | ||
| PackageId, | ||
| PackageBase, | ||
| getMangledNameForScopedPackage, | ||
| formatDependencyVersion, | ||
| } from "./packages"; | ||
|
|
||
| export interface Affected { | ||
| readonly changedPackages: readonly TypingsData[]; | ||
| readonly dependentPackages: readonly TypingsData[]; | ||
| allPackages: AllPackages; | ||
| import { assertDefined, execAndThrowErrors, mapDefined, withoutStart } from "@definitelytyped/utils"; | ||
| import { sourceBranch, sourceRemote } from "./lib/settings"; | ||
| import { AllPackages, PackageId, formatTypingVersion, getDependencyFromFile } from "./packages"; | ||
| import { resolve } from "path"; | ||
| import { satisfies } from "semver"; | ||
| export interface PreparePackagesResult { | ||
| readonly packageNames: Set<string>; | ||
| readonly dependents: Set<string>; | ||
| } | ||
|
|
||
| /** Gets all packages that have changed on this branch, plus all packages affected by the change. */ | ||
| export function getAffectedPackages(allPackages: AllPackages, changedPackageIds: PackageId[]): Affected { | ||
| const resolved = changedPackageIds.map((id) => allPackages.tryResolve(id)); | ||
| // If a package doesn't exist, that's because it was deleted. | ||
| const changed = mapDefined(resolved, (id) => allPackages.tryGetTypingsData(id)); | ||
| const dependent = mapIterable(collectDependers(resolved, getReverseDependencies(allPackages, resolved)), (p) => | ||
| allPackages.getTypingsData(p) | ||
| ); | ||
| return { changedPackages: changed, dependentPackages: sortPackages(dependent), allPackages }; | ||
| } | ||
|
|
||
| /** Every package name in the original list, plus their dependencies (incl. dependencies' dependencies). */ | ||
| export function allDependencies(allPackages: AllPackages, packages: Iterable<TypingsData>): TypingsData[] { | ||
| return sortPackages(transitiveClosure(packages, (pkg) => allPackages.allDependencyTypings(pkg))); | ||
| } | ||
|
|
||
| /** Collect all packages that depend on changed packages, and all that depend on those, etc. */ | ||
| function collectDependers( | ||
| changedPackages: PackageId[], | ||
| reverseDependencies: Map<PackageId, Set<PackageId>> | ||
| ): Set<PackageId> { | ||
| const dependers = transitiveClosure(changedPackages, (pkg) => reverseDependencies.get(pkg) || []); | ||
| // Don't include the original changed packages, just their dependers | ||
| for (const original of changedPackages) { | ||
| dependers.delete(original); | ||
| } | ||
| return dependers; | ||
| } | ||
|
|
||
| function sortPackages(packages: Iterable<TypingsData>): TypingsData[] { | ||
| return sort<TypingsData>(packages, PackageBase.compare); // tslint:disable-line no-unbound-method | ||
| } | ||
|
|
||
| function transitiveClosure<T>(initialItems: Iterable<T>, getRelatedItems: (item: T) => Iterable<T>): Set<T> { | ||
| const all = new Set<T>(); | ||
| const workList: T[] = []; | ||
|
|
||
| function add(item: T): void { | ||
| if (!all.has(item)) { | ||
| all.add(item); | ||
| workList.push(item); | ||
| export async function getAffectedPackages( | ||
| allPackages: AllPackages, | ||
| deletions: PackageId[], | ||
| definitelyTypedPath: string | ||
| ): Promise<PreparePackagesResult> { | ||
| const allDependents = []; | ||
| const filters = [`--filter '...[${sourceRemote}/${sourceBranch}]'`]; | ||
| for (const d of deletions) { | ||
| for (const dep of allPackages.allTypings()) { | ||
| for (const [name, version] of dep.allPackageJsonDependencies()) { | ||
| if ( | ||
| "@types/" + d.typesDirectoryName === name && | ||
| (d.version === "*" || satisfies(formatTypingVersion(d.version), version)) | ||
| ) { | ||
| filters.push(`--filter '...{./types/${dep.name}}'`); | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| for (const item of initialItems) { | ||
| add(item); | ||
| } | ||
|
|
||
| while (workList.length) { | ||
| const item = workList.pop()!; | ||
| for (const newItem of getRelatedItems(item)) { | ||
| add(newItem); | ||
| } | ||
| const changedPackageNames = await execAndThrowErrors( | ||
| `pnpm ls -r --depth -1 --parseable --filter '[${sourceRemote}/${sourceBranch}]'`, | ||
sandersn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| definitelyTypedPath | ||
| ); | ||
| // Chunk into 100-package chunks because of CMD.COM's command-line length limit | ||
| for (let i = 0; i < filters.length; i += 100) { | ||
| allDependents.push( | ||
| await execAndThrowErrors( | ||
| `pnpm ls -r --depth -1 --parseable ${filters.slice(i, i + 100).join(" ")}`, | ||
| definitelyTypedPath | ||
| ) | ||
| ); | ||
| } | ||
|
|
||
| return all; | ||
| return getAffectedPackagesWorker(allPackages, changedPackageNames, allDependents, definitelyTypedPath); | ||
| } | ||
|
|
||
| /** Generate a map from a package to packages that depend on it. */ | ||
| function getReverseDependencies( | ||
| /** This function is exported for testing, since it's determined entirely by its inputs. */ | ||
| export function getAffectedPackagesWorker( | ||
| allPackages: AllPackages, | ||
| changedPackages: PackageId[] | ||
| ): Map<PackageId, Set<PackageId>> { | ||
| const map = new Map<string, [PackageId, Set<PackageId>]>(); | ||
| for (const changed of changedPackages) { | ||
| map.set(packageIdToKey(changed), [changed, new Set()]); | ||
| } | ||
| for (const typing of allPackages.allTypings()) { | ||
| if (!map.has(packageIdToKey(typing.id))) { | ||
| map.set(packageIdToKey(typing.id), [typing.id, new Set()]); | ||
| } | ||
| } | ||
| for (const typing of allPackages.allTypings()) { | ||
| for (const [name, version] of Object.entries(typing.dependencies)) { | ||
| const dependencies = map.get(packageIdToKey(allPackages.tryResolve({ name, version }))); | ||
| if (dependencies) { | ||
| dependencies[1].add(typing.id); | ||
| } | ||
| } | ||
| for (const dependencyName of typing.testDependencies) { | ||
| const version = typing.pathMappings[dependencyName] || "*"; | ||
| const dependencies = map.get(packageIdToKey(allPackages.tryResolve({ name: dependencyName, version }))); | ||
| if (dependencies) { | ||
| dependencies[1].add(typing.id); | ||
| } | ||
| } | ||
| } | ||
| return new Map(map.values()); | ||
| changedOutput: string, | ||
| dependentOutputs: string[], | ||
| definitelyTypedPath: string | ||
| ): PreparePackagesResult { | ||
| const dt = resolve(definitelyTypedPath); | ||
| const changedDirs = mapDefined(changedOutput.split("\n"), getDirectoryName(dt)); | ||
| const dependentDirs = mapDefined(dependentOutputs.join("\n").split("\n"), getDirectoryName(dt)); | ||
| const packageNames = new Set( | ||
| changedDirs.map( | ||
| (c) => | ||
| assertDefined( | ||
| allPackages.tryGetTypingsData(assertDefined(getDependencyFromFile(c + "/index.d.ts"), "bad path " + c)) | ||
| ).subDirectoryPath | ||
| ) | ||
| ); | ||
| const dependents = new Set( | ||
| dependentDirs | ||
| .map( | ||
| (d) => | ||
| assertDefined( | ||
| allPackages.tryGetTypingsData(assertDefined(getDependencyFromFile(d + "/index.d.ts"), "bad path " + d)), | ||
| d + " package not found" | ||
| ).subDirectoryPath | ||
| ) | ||
| .filter((d) => !packageNames.has(d)) | ||
| ); | ||
| return { packageNames, dependents }; | ||
| } | ||
|
|
||
| function packageIdToKey(pkg: PackageId): string { | ||
| return getMangledNameForScopedPackage(pkg.name) + "/v" + formatDependencyVersion(pkg.version); | ||
| function getDirectoryName(dt: string): (line: string) => string | undefined { | ||
| return (line) => | ||
| line && line !== dt ? assertDefined(withoutStart(line, dt + "/"), line + " is missing prefix " + dt) : undefined; | ||
| } | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.