@vltpkg/query 1.0.0-rc.3 → 1.0.0-rc.31
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/{esm/attribute.d.ts → attribute.d.ts} +0 -1
- package/dist/{esm/attribute.js → attribute.js} +0 -1
- package/dist/{esm/combinator.d.ts → combinator.d.ts} +0 -1
- package/dist/{esm/combinator.js → combinator.js} +0 -1
- package/dist/{esm/id.d.ts → id.d.ts} +0 -1
- package/dist/{esm/id.js → id.js} +0 -1
- package/dist/{esm/index.d.ts → index.d.ts} +3 -3
- package/dist/{esm/index.js → index.js} +4 -2
- package/dist/{esm/parser.d.ts → parser.d.ts} +0 -1
- package/dist/{esm/parser.js → parser.js} +0 -1
- package/dist/{esm/pseudo → pseudo}/abandoned.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/abandoned.js +0 -1
- package/dist/{esm/pseudo → pseudo}/attr.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/attr.js +0 -1
- package/dist/{esm/pseudo → pseudo}/built.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/built.js +0 -1
- package/dist/{esm/pseudo → pseudo}/confused.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/confused.js +0 -1
- package/dist/{esm/pseudo → pseudo}/cve.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/cve.js +0 -1
- package/dist/{esm/pseudo → pseudo}/cwe.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/cwe.js +0 -1
- package/dist/{esm/pseudo → pseudo}/debug.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/debug.js +0 -1
- package/dist/{esm/pseudo → pseudo}/deprecated.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/deprecated.js +0 -1
- package/dist/{esm/pseudo → pseudo}/dev.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/dev.js +0 -1
- package/dist/pseudo/diff.d.ts +26 -0
- package/dist/pseudo/diff.js +75 -0
- package/dist/{esm/pseudo → pseudo}/dynamic.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/dynamic.js +0 -1
- package/dist/{esm/pseudo → pseudo}/empty.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/empty.js +0 -1
- package/dist/{esm/pseudo → pseudo}/entropic.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/entropic.js +0 -1
- package/dist/{esm/pseudo → pseudo}/env.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/env.js +0 -1
- package/dist/{esm/pseudo → pseudo}/eval.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/eval.js +0 -1
- package/dist/{esm/pseudo → pseudo}/fs.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/fs.js +0 -1
- package/dist/{esm/pseudo → pseudo}/helpers.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/helpers.js +8 -6
- package/dist/{esm/pseudo → pseudo}/host.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/host.js +0 -1
- package/dist/pseudo/hostname.d.ts +11 -0
- package/dist/pseudo/hostname.js +138 -0
- package/dist/{esm/pseudo → pseudo}/license.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/license.js +0 -1
- package/dist/{esm/pseudo → pseudo}/link.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/link.js +0 -1
- package/dist/{esm/pseudo → pseudo}/malware.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/malware.js +0 -1
- package/dist/{esm/pseudo → pseudo}/minified.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/minified.js +0 -1
- package/dist/{esm/pseudo → pseudo}/missing.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/missing.js +0 -1
- package/dist/{esm/pseudo → pseudo}/native.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/native.js +0 -1
- package/dist/{esm/pseudo → pseudo}/network.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/network.js +0 -1
- package/dist/{esm/pseudo → pseudo}/obfuscated.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/obfuscated.js +0 -1
- package/dist/{esm/pseudo → pseudo}/optional.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/optional.js +0 -1
- package/dist/{esm/pseudo → pseudo}/outdated.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/outdated.js +0 -1
- package/dist/{esm/pseudo → pseudo}/overridden.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/overridden.js +0 -1
- package/dist/{esm/pseudo → pseudo}/path.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/path.js +1 -4
- package/dist/{esm/pseudo → pseudo}/peer.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/peer.js +0 -1
- package/dist/{esm/pseudo → pseudo}/prerelease.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/prerelease.js +0 -1
- package/dist/{esm/pseudo → pseudo}/private.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/private.js +0 -1
- package/dist/{esm/pseudo → pseudo}/prod.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/prod.js +0 -1
- package/dist/{esm/pseudo → pseudo}/published.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/published.js +0 -1
- package/dist/pseudo/registry.d.ts +10 -0
- package/dist/pseudo/registry.js +24 -0
- package/dist/{esm/pseudo → pseudo}/root.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/root.js +0 -1
- package/dist/{esm/pseudo → pseudo}/scanned.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/scanned.js +0 -1
- package/dist/{esm/pseudo → pseudo}/score.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/score.js +0 -1
- package/dist/{esm/pseudo → pseudo}/scripts.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/scripts.js +0 -1
- package/dist/{esm/pseudo → pseudo}/semver.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/semver.js +0 -1
- package/dist/{esm/pseudo → pseudo}/severity.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/severity.js +0 -1
- package/dist/{esm/pseudo → pseudo}/shell.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/shell.js +0 -1
- package/dist/{esm/pseudo → pseudo}/shrinkwrap.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/shrinkwrap.js +0 -1
- package/dist/{esm/pseudo → pseudo}/spec.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/spec.js +0 -1
- package/dist/{esm/pseudo → pseudo}/squat.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/squat.js +0 -1
- package/dist/{esm/pseudo → pseudo}/suspicious.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/suspicious.js +0 -1
- package/dist/{esm/pseudo → pseudo}/tracker.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/tracker.js +0 -1
- package/dist/{esm/pseudo → pseudo}/trivial.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/trivial.js +0 -1
- package/dist/{esm/pseudo → pseudo}/type.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/type.js +0 -1
- package/dist/{esm/pseudo → pseudo}/undesirable.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/undesirable.js +0 -1
- package/dist/{esm/pseudo → pseudo}/unknown.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/unknown.js +0 -1
- package/dist/{esm/pseudo → pseudo}/unmaintained.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/unmaintained.js +0 -1
- package/dist/{esm/pseudo → pseudo}/unpopular.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/unpopular.js +0 -1
- package/dist/{esm/pseudo → pseudo}/unstable.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/unstable.js +0 -1
- package/dist/{esm/pseudo → pseudo}/workspace.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/workspace.js +0 -1
- package/dist/{esm/pseudo.d.ts → pseudo.d.ts} +0 -1
- package/dist/{esm/pseudo.js → pseudo.js} +11 -1
- package/dist/{esm/types.d.ts → types.d.ts} +7 -1
- package/dist/types.js +1 -0
- package/package.json +37 -47
- package/dist/esm/attribute.d.ts.map +0 -1
- package/dist/esm/attribute.js.map +0 -1
- package/dist/esm/combinator.d.ts.map +0 -1
- package/dist/esm/combinator.js.map +0 -1
- package/dist/esm/id.d.ts.map +0 -1
- package/dist/esm/id.js.map +0 -1
- package/dist/esm/index.d.ts.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/package.json +0 -3
- package/dist/esm/parser.d.ts.map +0 -1
- package/dist/esm/parser.js.map +0 -1
- package/dist/esm/pseudo/abandoned.d.ts.map +0 -1
- package/dist/esm/pseudo/abandoned.js.map +0 -1
- package/dist/esm/pseudo/attr.d.ts.map +0 -1
- package/dist/esm/pseudo/attr.js.map +0 -1
- package/dist/esm/pseudo/built.d.ts.map +0 -1
- package/dist/esm/pseudo/built.js.map +0 -1
- package/dist/esm/pseudo/confused.d.ts.map +0 -1
- package/dist/esm/pseudo/confused.js.map +0 -1
- package/dist/esm/pseudo/cve.d.ts.map +0 -1
- package/dist/esm/pseudo/cve.js.map +0 -1
- package/dist/esm/pseudo/cwe.d.ts.map +0 -1
- package/dist/esm/pseudo/cwe.js.map +0 -1
- package/dist/esm/pseudo/debug.d.ts.map +0 -1
- package/dist/esm/pseudo/debug.js.map +0 -1
- package/dist/esm/pseudo/deprecated.d.ts.map +0 -1
- package/dist/esm/pseudo/deprecated.js.map +0 -1
- package/dist/esm/pseudo/dev.d.ts.map +0 -1
- package/dist/esm/pseudo/dev.js.map +0 -1
- package/dist/esm/pseudo/dynamic.d.ts.map +0 -1
- package/dist/esm/pseudo/dynamic.js.map +0 -1
- package/dist/esm/pseudo/empty.d.ts.map +0 -1
- package/dist/esm/pseudo/empty.js.map +0 -1
- package/dist/esm/pseudo/entropic.d.ts.map +0 -1
- package/dist/esm/pseudo/entropic.js.map +0 -1
- package/dist/esm/pseudo/env.d.ts.map +0 -1
- package/dist/esm/pseudo/env.js.map +0 -1
- package/dist/esm/pseudo/eval.d.ts.map +0 -1
- package/dist/esm/pseudo/eval.js.map +0 -1
- package/dist/esm/pseudo/fs.d.ts.map +0 -1
- package/dist/esm/pseudo/fs.js.map +0 -1
- package/dist/esm/pseudo/helpers.d.ts.map +0 -1
- package/dist/esm/pseudo/helpers.js.map +0 -1
- package/dist/esm/pseudo/host.d.ts.map +0 -1
- package/dist/esm/pseudo/host.js.map +0 -1
- package/dist/esm/pseudo/license.d.ts.map +0 -1
- package/dist/esm/pseudo/license.js.map +0 -1
- package/dist/esm/pseudo/link.d.ts.map +0 -1
- package/dist/esm/pseudo/link.js.map +0 -1
- package/dist/esm/pseudo/malware.d.ts.map +0 -1
- package/dist/esm/pseudo/malware.js.map +0 -1
- package/dist/esm/pseudo/minified.d.ts.map +0 -1
- package/dist/esm/pseudo/minified.js.map +0 -1
- package/dist/esm/pseudo/missing.d.ts.map +0 -1
- package/dist/esm/pseudo/missing.js.map +0 -1
- package/dist/esm/pseudo/native.d.ts.map +0 -1
- package/dist/esm/pseudo/native.js.map +0 -1
- package/dist/esm/pseudo/network.d.ts.map +0 -1
- package/dist/esm/pseudo/network.js.map +0 -1
- package/dist/esm/pseudo/obfuscated.d.ts.map +0 -1
- package/dist/esm/pseudo/obfuscated.js.map +0 -1
- package/dist/esm/pseudo/optional.d.ts.map +0 -1
- package/dist/esm/pseudo/optional.js.map +0 -1
- package/dist/esm/pseudo/outdated.d.ts.map +0 -1
- package/dist/esm/pseudo/outdated.js.map +0 -1
- package/dist/esm/pseudo/overridden.d.ts.map +0 -1
- package/dist/esm/pseudo/overridden.js.map +0 -1
- package/dist/esm/pseudo/path.d.ts.map +0 -1
- package/dist/esm/pseudo/path.js.map +0 -1
- package/dist/esm/pseudo/peer.d.ts.map +0 -1
- package/dist/esm/pseudo/peer.js.map +0 -1
- package/dist/esm/pseudo/prerelease.d.ts.map +0 -1
- package/dist/esm/pseudo/prerelease.js.map +0 -1
- package/dist/esm/pseudo/private.d.ts.map +0 -1
- package/dist/esm/pseudo/private.js.map +0 -1
- package/dist/esm/pseudo/prod.d.ts.map +0 -1
- package/dist/esm/pseudo/prod.js.map +0 -1
- package/dist/esm/pseudo/published.d.ts.map +0 -1
- package/dist/esm/pseudo/published.js.map +0 -1
- package/dist/esm/pseudo/root.d.ts.map +0 -1
- package/dist/esm/pseudo/root.js.map +0 -1
- package/dist/esm/pseudo/scanned.d.ts.map +0 -1
- package/dist/esm/pseudo/scanned.js.map +0 -1
- package/dist/esm/pseudo/score.d.ts.map +0 -1
- package/dist/esm/pseudo/score.js.map +0 -1
- package/dist/esm/pseudo/scripts.d.ts.map +0 -1
- package/dist/esm/pseudo/scripts.js.map +0 -1
- package/dist/esm/pseudo/semver.d.ts.map +0 -1
- package/dist/esm/pseudo/semver.js.map +0 -1
- package/dist/esm/pseudo/severity.d.ts.map +0 -1
- package/dist/esm/pseudo/severity.js.map +0 -1
- package/dist/esm/pseudo/shell.d.ts.map +0 -1
- package/dist/esm/pseudo/shell.js.map +0 -1
- package/dist/esm/pseudo/shrinkwrap.d.ts.map +0 -1
- package/dist/esm/pseudo/shrinkwrap.js.map +0 -1
- package/dist/esm/pseudo/spec.d.ts.map +0 -1
- package/dist/esm/pseudo/spec.js.map +0 -1
- package/dist/esm/pseudo/squat.d.ts.map +0 -1
- package/dist/esm/pseudo/squat.js.map +0 -1
- package/dist/esm/pseudo/suspicious.d.ts.map +0 -1
- package/dist/esm/pseudo/suspicious.js.map +0 -1
- package/dist/esm/pseudo/tracker.d.ts.map +0 -1
- package/dist/esm/pseudo/tracker.js.map +0 -1
- package/dist/esm/pseudo/trivial.d.ts.map +0 -1
- package/dist/esm/pseudo/trivial.js.map +0 -1
- package/dist/esm/pseudo/type.d.ts.map +0 -1
- package/dist/esm/pseudo/type.js.map +0 -1
- package/dist/esm/pseudo/undesirable.d.ts.map +0 -1
- package/dist/esm/pseudo/undesirable.js.map +0 -1
- package/dist/esm/pseudo/unknown.d.ts.map +0 -1
- package/dist/esm/pseudo/unknown.js.map +0 -1
- package/dist/esm/pseudo/unmaintained.d.ts.map +0 -1
- package/dist/esm/pseudo/unmaintained.js.map +0 -1
- package/dist/esm/pseudo/unpopular.d.ts.map +0 -1
- package/dist/esm/pseudo/unpopular.js.map +0 -1
- package/dist/esm/pseudo/unstable.d.ts.map +0 -1
- package/dist/esm/pseudo/unstable.js.map +0 -1
- package/dist/esm/pseudo/workspace.d.ts.map +0 -1
- package/dist/esm/pseudo/workspace.js.map +0 -1
- package/dist/esm/pseudo.d.ts.map +0 -1
- package/dist/esm/pseudo.js.map +0 -1
- package/dist/esm/types.d.ts.map +0 -1
- package/dist/esm/types.js +0 -2
- package/dist/esm/types.js.map +0 -1
package/dist/{esm/id.js → id.js}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { EdgeLike, NodeLike } from '@vltpkg/types';
|
|
2
2
|
import type { SecurityArchiveLike } from '@vltpkg/security-archive';
|
|
3
|
-
import type { HostContextsMap, ParsedSelectorToken, ParserState, QueryResponse } from './types.ts';
|
|
3
|
+
import type { DiffFilesProvider, HostContextsMap, ParsedSelectorToken, ParserState, QueryResponse } from './types.ts';
|
|
4
4
|
import type { DepID } from '@vltpkg/dep-id';
|
|
5
5
|
export * from './types.ts';
|
|
6
6
|
export type SearchOptions = {
|
|
@@ -15,6 +15,7 @@ export type QueryOptions = {
|
|
|
15
15
|
retries?: number;
|
|
16
16
|
securityArchive: SecurityArchiveLike | undefined;
|
|
17
17
|
hostContexts?: HostContextsMap;
|
|
18
|
+
diffFiles?: DiffFilesProvider;
|
|
18
19
|
};
|
|
19
20
|
/**
|
|
20
21
|
* The Query class is used to search the graph for nodes and edges
|
|
@@ -35,7 +36,7 @@ export declare class Query {
|
|
|
35
36
|
* the original order is preserved.
|
|
36
37
|
*/
|
|
37
38
|
static specificitySort(responses: QueryResponse[]): QueryResponse[];
|
|
38
|
-
constructor({ edges, nodes, importers, retries, securityArchive, hostContexts, }: QueryOptions);
|
|
39
|
+
constructor({ edges, nodes, importers, retries, securityArchive, hostContexts, diffFiles, }: QueryOptions);
|
|
39
40
|
/**
|
|
40
41
|
* Search the graph for nodes and edges that match the given query.
|
|
41
42
|
*/
|
|
@@ -45,4 +46,3 @@ export declare class Query {
|
|
|
45
46
|
*/
|
|
46
47
|
static getQueryTokens(query: string): ParsedSelectorToken[];
|
|
47
48
|
}
|
|
48
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -139,6 +139,7 @@ const setMethodToJSON = (node) => {
|
|
|
139
139
|
*/
|
|
140
140
|
export class Query {
|
|
141
141
|
#cache;
|
|
142
|
+
#diffFiles;
|
|
142
143
|
#edges;
|
|
143
144
|
#nodes;
|
|
144
145
|
#importers;
|
|
@@ -178,8 +179,9 @@ export class Query {
|
|
|
178
179
|
return 0;
|
|
179
180
|
});
|
|
180
181
|
}
|
|
181
|
-
constructor({ edges, nodes, importers, retries, securityArchive, hostContexts, }) {
|
|
182
|
+
constructor({ edges, nodes, importers, retries, securityArchive, hostContexts, diffFiles, }) {
|
|
182
183
|
this.#cache = new Map();
|
|
184
|
+
this.#diffFiles = diffFiles;
|
|
183
185
|
this.#edges = edges;
|
|
184
186
|
this.#nodes = nodes;
|
|
185
187
|
this.#importers = importers;
|
|
@@ -322,6 +324,7 @@ export class Query {
|
|
|
322
324
|
edges: new Set(),
|
|
323
325
|
},
|
|
324
326
|
comment: '',
|
|
327
|
+
diffFiles: this.#diffFiles,
|
|
325
328
|
loose,
|
|
326
329
|
importers,
|
|
327
330
|
partial: { nodes, edges },
|
|
@@ -405,4 +408,3 @@ export class Query {
|
|
|
405
408
|
return tokens;
|
|
406
409
|
}
|
|
407
410
|
}
|
|
408
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ParserState } from '../types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Given a set of changed file paths and a package location
|
|
4
|
+
* (relative to the project root), returns true if any changed
|
|
5
|
+
* file belongs to that package.
|
|
6
|
+
*/
|
|
7
|
+
export declare const packageHasChanges: (changedFiles: Set<string>, packageLocation: string) => boolean;
|
|
8
|
+
/**
|
|
9
|
+
* :diff(<commitish>) Pseudo-Selector, matches only nodes
|
|
10
|
+
* whose files have changed between the current state and
|
|
11
|
+
* the specified commitish reference.
|
|
12
|
+
*
|
|
13
|
+
* Requires a `diffFiles` provider to be set on the
|
|
14
|
+
* {@link ParserState}. The provider is a callback that
|
|
15
|
+
* takes a commitish string and returns a Set of changed
|
|
16
|
+
* file paths relative to the project root.
|
|
17
|
+
*
|
|
18
|
+
* When called with no argument, defaults to HEAD (uncommitted changes).
|
|
19
|
+
*
|
|
20
|
+
* Examples:
|
|
21
|
+
* - :diff() — packages with uncommitted changes (defaults to HEAD)
|
|
22
|
+
* - :diff(main) — packages changed since main branch
|
|
23
|
+
* - :diff(HEAD~1) — packages changed since last commit
|
|
24
|
+
* - :diff("v1.0.0") — packages changed since tag v1.0.0
|
|
25
|
+
*/
|
|
26
|
+
export declare const diff: (state: ParserState) => Promise<ParserState>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { error } from '@vltpkg/error-cause';
|
|
2
|
+
import { asPostcssNodeWithChildren } from '@vltpkg/dss-parser';
|
|
3
|
+
import { removeDanglingEdges, removeNode } from "./helpers.js";
|
|
4
|
+
import { parseInternals } from "./spec.js";
|
|
5
|
+
/**
|
|
6
|
+
* Given a set of changed file paths and a package location
|
|
7
|
+
* (relative to the project root), returns true if any changed
|
|
8
|
+
* file belongs to that package.
|
|
9
|
+
*/
|
|
10
|
+
export const packageHasChanges = (changedFiles, packageLocation) => {
|
|
11
|
+
// Normalize the package location — remove leading './'
|
|
12
|
+
const normalized = packageLocation.startsWith('./') ?
|
|
13
|
+
packageLocation.slice(2)
|
|
14
|
+
: packageLocation;
|
|
15
|
+
// Root package — check if any file at root level changed
|
|
16
|
+
// (not inside a subdirectory that is another package)
|
|
17
|
+
if (!normalized || normalized === '.') {
|
|
18
|
+
// Any changed file means the root package changed
|
|
19
|
+
return changedFiles.size > 0;
|
|
20
|
+
}
|
|
21
|
+
// Check if any changed file starts with the package path
|
|
22
|
+
for (const file of changedFiles) {
|
|
23
|
+
if (file === normalized || file.startsWith(normalized + '/')) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* :diff(<commitish>) Pseudo-Selector, matches only nodes
|
|
31
|
+
* whose files have changed between the current state and
|
|
32
|
+
* the specified commitish reference.
|
|
33
|
+
*
|
|
34
|
+
* Requires a `diffFiles` provider to be set on the
|
|
35
|
+
* {@link ParserState}. The provider is a callback that
|
|
36
|
+
* takes a commitish string and returns a Set of changed
|
|
37
|
+
* file paths relative to the project root.
|
|
38
|
+
*
|
|
39
|
+
* When called with no argument, defaults to HEAD (uncommitted changes).
|
|
40
|
+
*
|
|
41
|
+
* Examples:
|
|
42
|
+
* - :diff() — packages with uncommitted changes (defaults to HEAD)
|
|
43
|
+
* - :diff(main) — packages changed since main branch
|
|
44
|
+
* - :diff(HEAD~1) — packages changed since last commit
|
|
45
|
+
* - :diff("v1.0.0") — packages changed since tag v1.0.0
|
|
46
|
+
*/
|
|
47
|
+
export const diff = async (state) => {
|
|
48
|
+
const currentNodes = asPostcssNodeWithChildren(state.current).nodes;
|
|
49
|
+
const hasArg = currentNodes.length > 0 &&
|
|
50
|
+
asPostcssNodeWithChildren(currentNodes[0]).nodes.length > 0;
|
|
51
|
+
let commitish = 'HEAD';
|
|
52
|
+
if (hasArg) {
|
|
53
|
+
try {
|
|
54
|
+
commitish = parseInternals(currentNodes).specValue;
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
throw error('Failed to parse :diff selector', {
|
|
58
|
+
cause: err,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!state.diffFiles) {
|
|
63
|
+
throw error('The :diff() selector requires a diffFiles provider');
|
|
64
|
+
}
|
|
65
|
+
const changedFiles = state.diffFiles(commitish);
|
|
66
|
+
for (const node of state.partial.nodes) {
|
|
67
|
+
/* c8 ignore next -- location is always set on real nodes */
|
|
68
|
+
const location = node.location ?? '';
|
|
69
|
+
if (!packageHasChanges(changedFiles, location)) {
|
|
70
|
+
removeNode(state, node);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
removeDanglingEdges(state);
|
|
74
|
+
return state;
|
|
75
|
+
};
|
|
@@ -3,4 +3,3 @@ import { createSecuritySelectorFilter } from "./helpers.js";
|
|
|
3
3
|
* Filters out any node that does not have a **highEntropyStrings** report alert.
|
|
4
4
|
*/
|
|
5
5
|
export const entropic = createSecuritySelectorFilter('entropic', 'highEntropyStrings');
|
|
6
|
-
//# sourceMappingURL=entropic.js.map
|
|
@@ -36,4 +36,3 @@ export declare const clear: (state: ParserState) => ParserState;
|
|
|
36
36
|
export declare const createSecuritySelectorFilter: (name: string, type: string) => (state: ParserState) => Promise<ParserState & {
|
|
37
37
|
securityArchive: NonNullable<ParserState["securityArchive"]>;
|
|
38
38
|
}>;
|
|
39
|
-
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -13,7 +13,7 @@ export const removeNode = (state, node) => {
|
|
|
13
13
|
*/
|
|
14
14
|
export const removeEdge = (state, edge) => {
|
|
15
15
|
state.partial.edges.delete(edge);
|
|
16
|
-
if (edge.to) {
|
|
16
|
+
if (edge.to?.edgesIn.size === 1) {
|
|
17
17
|
state.partial.nodes.delete(edge.to);
|
|
18
18
|
}
|
|
19
19
|
};
|
|
@@ -22,7 +22,7 @@ export const removeEdge = (state, edge) => {
|
|
|
22
22
|
*/
|
|
23
23
|
export const removeDanglingEdges = (state) => {
|
|
24
24
|
for (const edge of state.partial.edges) {
|
|
25
|
-
if (!edge.to) {
|
|
25
|
+
if (!edge.to || !state.partial.nodes.has(edge.to)) {
|
|
26
26
|
state.partial.edges.delete(edge);
|
|
27
27
|
}
|
|
28
28
|
}
|
|
@@ -31,10 +31,13 @@ export const removeDanglingEdges = (state) => {
|
|
|
31
31
|
* Removes any nodes that have no incoming edges from the results.
|
|
32
32
|
*/
|
|
33
33
|
export const removeUnlinkedNodes = (state) => {
|
|
34
|
-
for (const node of state.partial.nodes) {
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
nodeLoop: for (const node of state.partial.nodes) {
|
|
35
|
+
for (const edge of state.partial.edges) {
|
|
36
|
+
if (edge.to === node) {
|
|
37
|
+
continue nodeLoop;
|
|
38
|
+
}
|
|
37
39
|
}
|
|
40
|
+
state.partial.nodes.delete(node);
|
|
38
41
|
}
|
|
39
42
|
};
|
|
40
43
|
/**
|
|
@@ -74,4 +77,3 @@ export const createSecuritySelectorFilter = (name, type) => {
|
|
|
74
77
|
return state;
|
|
75
78
|
};
|
|
76
79
|
};
|
|
77
|
-
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ParserState } from '../types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* :hostname(str) Pseudo-Selector, matches only nodes whose
|
|
4
|
+
* upstream hostname matches the provided domain string.
|
|
5
|
+
*
|
|
6
|
+
* Examples:
|
|
7
|
+
* - :hostname("registry.npmjs.org") — default npm registry deps
|
|
8
|
+
* - :hostname("github.com") — github git deps
|
|
9
|
+
* - :hostname("example.com") — custom registry deps
|
|
10
|
+
*/
|
|
11
|
+
export declare const hostname: (state: ParserState) => Promise<ParserState>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { splitDepID } from '@vltpkg/dep-id/browser';
|
|
2
|
+
import { getOptions, gitHostWebsites } from '@vltpkg/spec/browser';
|
|
3
|
+
import { asPostcssNodeWithChildren } from '@vltpkg/dss-parser';
|
|
4
|
+
import { error } from '@vltpkg/error-cause';
|
|
5
|
+
import { removeDanglingEdges, removeNode } from "./helpers.js";
|
|
6
|
+
import { parseInternals } from "./spec.js";
|
|
7
|
+
/**
|
|
8
|
+
* Given a named git host (e.g. "github"), resolve its hostname
|
|
9
|
+
* by looking up `gitHostWebsites` (e.g. "github.com"), or
|
|
10
|
+
* falling back to the `git-hosts` template URL.
|
|
11
|
+
*/
|
|
12
|
+
const resolveGitHostname = (namedHost, gitHosts) => {
|
|
13
|
+
// Check gitHostWebsites first (e.g. github -> github.com)
|
|
14
|
+
const website = gitHostWebsites[namedHost];
|
|
15
|
+
if (website) {
|
|
16
|
+
try {
|
|
17
|
+
return new URL(website).hostname;
|
|
18
|
+
/* c8 ignore next */
|
|
19
|
+
}
|
|
20
|
+
catch { }
|
|
21
|
+
}
|
|
22
|
+
// Fall back to parsing the git-hosts template URL
|
|
23
|
+
const template = gitHosts[namedHost];
|
|
24
|
+
if (template) {
|
|
25
|
+
try {
|
|
26
|
+
// Templates look like 'git+ssh://git@github.com:$1/$2.git'
|
|
27
|
+
// Replace colons after the host with / for URL parsing
|
|
28
|
+
const normalized = template
|
|
29
|
+
.replace(/^git\+/, '')
|
|
30
|
+
.replace(/:(\$)/, '/$1');
|
|
31
|
+
return new URL(normalized).hostname;
|
|
32
|
+
/* c8 ignore next */
|
|
33
|
+
}
|
|
34
|
+
catch { }
|
|
35
|
+
}
|
|
36
|
+
/* c8 ignore next */
|
|
37
|
+
return undefined;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Resolve the hostname for a git remote string.
|
|
41
|
+
* Named hosts: "github:user/repo" -> extract "github" and look up.
|
|
42
|
+
* Full URLs: "git+ssh://git@example.com/repo.git" -> parse URL.
|
|
43
|
+
*/
|
|
44
|
+
const getGitHostname = (gitRemote, gitHosts) => {
|
|
45
|
+
// Check if it's a named git host like "github:user/repo"
|
|
46
|
+
const colonIdx = gitRemote.indexOf(':');
|
|
47
|
+
if (colonIdx > 0) {
|
|
48
|
+
const possibleHost = gitRemote.slice(0, colonIdx);
|
|
49
|
+
// If this is a known named git host, resolve it
|
|
50
|
+
if (possibleHost in gitHosts) {
|
|
51
|
+
return resolveGitHostname(possibleHost, gitHosts);
|
|
52
|
+
}
|
|
53
|
+
// Could be a protocol URL like git+ssh://...
|
|
54
|
+
try {
|
|
55
|
+
const normalized = gitRemote
|
|
56
|
+
.replace(/^git\+/, '')
|
|
57
|
+
.replace(/^ssh:\/\/([^@]+@)?([^:/]+)[:/]/, 'ssh://$1$2/');
|
|
58
|
+
return new URL(normalized).hostname;
|
|
59
|
+
/* c8 ignore next */
|
|
60
|
+
}
|
|
61
|
+
catch { }
|
|
62
|
+
}
|
|
63
|
+
/* c8 ignore start - git remotes always contain a colon */
|
|
64
|
+
// Try parsing as a plain URL
|
|
65
|
+
try {
|
|
66
|
+
return new URL(gitRemote).hostname;
|
|
67
|
+
}
|
|
68
|
+
catch { }
|
|
69
|
+
return undefined;
|
|
70
|
+
/* c8 ignore stop */
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* :hostname(str) Pseudo-Selector, matches only nodes whose
|
|
74
|
+
* upstream hostname matches the provided domain string.
|
|
75
|
+
*
|
|
76
|
+
* Examples:
|
|
77
|
+
* - :hostname("registry.npmjs.org") — default npm registry deps
|
|
78
|
+
* - :hostname("github.com") — github git deps
|
|
79
|
+
* - :hostname("example.com") — custom registry deps
|
|
80
|
+
*/
|
|
81
|
+
export const hostname = async (state) => {
|
|
82
|
+
let internals;
|
|
83
|
+
try {
|
|
84
|
+
internals = parseInternals(asPostcssNodeWithChildren(state.current).nodes);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
throw error('Failed to parse :hostname selector', {
|
|
88
|
+
cause: err,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const targetHostname = internals.specValue;
|
|
92
|
+
for (const node of state.partial.nodes) {
|
|
93
|
+
const tuple = splitDepID(node.id);
|
|
94
|
+
const type = tuple[0];
|
|
95
|
+
let nodeHostname;
|
|
96
|
+
switch (type) {
|
|
97
|
+
case 'registry': {
|
|
98
|
+
const registryName = tuple[1];
|
|
99
|
+
const options = getOptions(node.options);
|
|
100
|
+
// Look up the registry URL from registries map
|
|
101
|
+
const registryUrl = options.registries[registryName] ?? options.registry;
|
|
102
|
+
if (registryUrl) {
|
|
103
|
+
try {
|
|
104
|
+
nodeHostname = new URL(registryUrl).hostname;
|
|
105
|
+
/* c8 ignore next */
|
|
106
|
+
}
|
|
107
|
+
catch { }
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case 'git': {
|
|
112
|
+
const gitRemote = tuple[1];
|
|
113
|
+
const options = getOptions(node.options);
|
|
114
|
+
nodeHostname = getGitHostname(gitRemote, options['git-hosts']);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case 'remote': {
|
|
118
|
+
const url = tuple[1];
|
|
119
|
+
try {
|
|
120
|
+
nodeHostname = new URL(url).hostname;
|
|
121
|
+
/* c8 ignore next */
|
|
122
|
+
}
|
|
123
|
+
catch { }
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
// file and workspace deps are local — no hostname
|
|
127
|
+
default: {
|
|
128
|
+
nodeHostname = undefined;
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (nodeHostname !== targetHostname) {
|
|
133
|
+
removeNode(state, node);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
removeDanglingEdges(state);
|
|
137
|
+
return state;
|
|
138
|
+
};
|