@vltpkg/cli-sdk 0.0.0-15 → 0.0.0-17
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/commands/config.d.ts.map +1 -1
- package/dist/esm/commands/config.js +106 -35
- package/dist/esm/commands/config.js.map +1 -1
- package/dist/esm/commands/help.d.ts +1 -1
- package/dist/esm/commands/help.d.ts.map +1 -1
- package/dist/esm/commands/help.js +25 -3
- package/dist/esm/commands/help.js.map +1 -1
- package/dist/esm/commands/init.d.ts +3 -3
- package/dist/esm/commands/init.d.ts.map +1 -1
- package/dist/esm/commands/init.js +95 -9
- package/dist/esm/commands/init.js.map +1 -1
- package/dist/esm/commands/list.d.ts.map +1 -1
- package/dist/esm/commands/list.js +90 -36
- package/dist/esm/commands/list.js.map +1 -1
- package/dist/esm/commands/pack.d.ts +20 -0
- package/dist/esm/commands/pack.d.ts.map +1 -0
- package/dist/esm/commands/pack.js +81 -0
- package/dist/esm/commands/pack.js.map +1 -0
- package/dist/esm/commands/pkg.d.ts +1 -1
- package/dist/esm/commands/pkg.d.ts.map +1 -1
- package/dist/esm/commands/pkg.js +135 -35
- package/dist/esm/commands/pkg.js.map +1 -1
- package/dist/esm/commands/publish.d.ts +21 -0
- package/dist/esm/commands/publish.d.ts.map +1 -0
- package/dist/esm/commands/publish.js +168 -0
- package/dist/esm/commands/publish.js.map +1 -0
- package/dist/esm/commands/query.d.ts +1 -1
- package/dist/esm/commands/query.d.ts.map +1 -1
- package/dist/esm/commands/query.js +81 -23
- package/dist/esm/commands/query.js.map +1 -1
- package/dist/esm/commands/version.d.ts +22 -0
- package/dist/esm/commands/version.d.ts.map +1 -0
- package/dist/esm/commands/version.js +151 -0
- package/dist/esm/commands/version.js.map +1 -0
- package/dist/esm/config/definition.d.ts +30 -2
- package/dist/esm/config/definition.d.ts.map +1 -1
- package/dist/esm/config/definition.js +28 -4
- package/dist/esm/config/definition.js.map +1 -1
- package/dist/esm/config/index.d.ts.map +1 -1
- package/dist/esm/config/index.js +4 -0
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/exec-command.js +2 -2
- package/dist/esm/exec-command.js.map +1 -1
- package/dist/esm/index.d.ts +1 -14
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +13 -22
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/load-command.d.ts +16 -0
- package/dist/esm/load-command.d.ts.map +1 -0
- package/dist/esm/load-command.js +21 -0
- package/dist/esm/load-command.js.map +1 -0
- package/dist/esm/pack-tarball.d.ts +21 -0
- package/dist/esm/pack-tarball.d.ts.map +1 -0
- package/dist/esm/pack-tarball.js +226 -0
- package/dist/esm/pack-tarball.js.map +1 -0
- package/dist/esm/start-gui.d.ts +1 -0
- package/dist/esm/start-gui.d.ts.map +1 -1
- package/dist/esm/start-gui.js +5 -3
- package/dist/esm/start-gui.js.map +1 -1
- package/package.json +29 -23
|
@@ -1,21 +1,27 @@
|
|
|
1
|
-
import { actual, humanReadableOutput, jsonOutput, mermaidOutput, } from '@vltpkg/graph';
|
|
1
|
+
import { actual, asNode, humanReadableOutput, jsonOutput, mermaidOutput, GraphModifier, } from '@vltpkg/graph';
|
|
2
|
+
import LZString from 'lz-string';
|
|
2
3
|
import { Query } from '@vltpkg/query';
|
|
3
4
|
import { SecurityArchive } from '@vltpkg/security-archive';
|
|
5
|
+
import { error } from '@vltpkg/error-cause';
|
|
4
6
|
import { commandUsage } from "../config/usage.js";
|
|
5
7
|
import { startGUI } from "../start-gui.js";
|
|
6
8
|
export const usage = () => commandUsage({
|
|
7
9
|
command: 'ls',
|
|
8
10
|
usage: [
|
|
9
11
|
'',
|
|
10
|
-
'[
|
|
12
|
+
'[package-names...] [--view=human | json | mermaid | gui]',
|
|
13
|
+
'[--scope=<query>] [--target=<query>] [--view=human | json | mermaid | gui]',
|
|
11
14
|
],
|
|
12
|
-
description: `List installed dependencies matching given package names or
|
|
13
|
-
packages from matching a given Dependency Selector Syntax query if one
|
|
14
|
-
is provided.
|
|
15
|
+
description: `List installed dependencies matching given package names or query selectors.
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
Package names provided as positional arguments will be used to filter
|
|
18
|
+
the results to show only dependencies with those names.
|
|
19
|
+
|
|
20
|
+
The --scope and --target options accepts DSS query selectors to filter
|
|
21
|
+
packages. Using --scope, you can specify which packages to treat as the
|
|
22
|
+
top-level items in the output graph. The --target option allows you to
|
|
23
|
+
filter what dependencies to include in the output. Using both options
|
|
24
|
+
allows you to render subgraphs of the dependency graph.
|
|
19
25
|
|
|
20
26
|
Defaults to listing direct dependencies of a project and any configured
|
|
21
27
|
workspace.`,
|
|
@@ -23,20 +29,28 @@ export const usage = () => commandUsage({
|
|
|
23
29
|
'': {
|
|
24
30
|
description: 'List direct dependencies of the current project / workspace',
|
|
25
31
|
},
|
|
26
|
-
'"*"': {
|
|
27
|
-
description: 'List all dependencies for the current project / workspace',
|
|
28
|
-
},
|
|
29
32
|
'foo bar baz': {
|
|
30
33
|
description: `List all dependencies named 'foo', 'bar', or 'baz'`,
|
|
31
34
|
},
|
|
32
|
-
|
|
33
|
-
description: '
|
|
35
|
+
'--scope=":root > #dependency-name"': {
|
|
36
|
+
description: 'Defines a direct dependency as the output top-level scope',
|
|
37
|
+
},
|
|
38
|
+
'--target="*"': {
|
|
39
|
+
description: 'List all dependencies using a query selector',
|
|
34
40
|
},
|
|
35
|
-
|
|
41
|
+
'--target=":workspace > *:peer"': {
|
|
36
42
|
description: 'List all peer dependencies of all workspaces',
|
|
37
43
|
},
|
|
38
44
|
},
|
|
39
45
|
options: {
|
|
46
|
+
scope: {
|
|
47
|
+
value: '<query>',
|
|
48
|
+
description: 'Query selector to select top-level packages using the DSS query language syntax.',
|
|
49
|
+
},
|
|
50
|
+
target: {
|
|
51
|
+
value: '<query>',
|
|
52
|
+
description: 'Query selector to filter packages using the DSS query language syntax.',
|
|
53
|
+
},
|
|
40
54
|
view: {
|
|
41
55
|
value: '[human | json | mermaid | gui]',
|
|
42
56
|
description: 'Output format. Defaults to human-readable or json if no tty.',
|
|
@@ -48,27 +62,38 @@ export const views = {
|
|
|
48
62
|
mermaid: mermaidOutput,
|
|
49
63
|
human: humanReadableOutput,
|
|
50
64
|
gui: async ({ queryString }, _, conf) => {
|
|
51
|
-
await startGUI(conf,
|
|
65
|
+
await startGUI(conf, `/explore/${LZString.compressToEncodedURIComponent(queryString)}/overview`);
|
|
52
66
|
},
|
|
53
67
|
};
|
|
54
68
|
export const command = async (conf) => {
|
|
69
|
+
const modifiers = GraphModifier.maybeLoad(conf.options);
|
|
55
70
|
const monorepo = conf.options.monorepo;
|
|
56
71
|
const mainManifest = conf.options.packageJson.read(conf.options.projectRoot);
|
|
57
72
|
const graph = actual.load({
|
|
58
73
|
...conf.options,
|
|
59
74
|
mainManifest,
|
|
75
|
+
modifiers,
|
|
60
76
|
monorepo,
|
|
61
77
|
loadManifests: true,
|
|
62
78
|
});
|
|
63
|
-
|
|
64
|
-
|
|
79
|
+
// Validate positional arguments - only allow package names, not direct queries
|
|
80
|
+
for (const arg of conf.positionals) {
|
|
81
|
+
if (!/^[@\w-]/.test(arg)) {
|
|
82
|
+
throw error(`Direct queries are not supported as positional arguments. Use package names only.`, {
|
|
83
|
+
code: 'EUSAGE',
|
|
84
|
+
cause: `Argument '${arg}' appears to be a query syntax. Only package names are allowed as positional arguments.`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const positionalQueryString = conf.positionals
|
|
89
|
+
.map(k => `#${k.replace(/\//, '\\/')}`)
|
|
65
90
|
.join(', ');
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
91
|
+
const targetQueryString = conf.get('target');
|
|
92
|
+
const queryString = targetQueryString || positionalQueryString;
|
|
93
|
+
const securityArchive = await SecurityArchive.start({
|
|
94
|
+
graph,
|
|
95
|
+
specOptions: conf.options,
|
|
96
|
+
});
|
|
72
97
|
const query = new Query({
|
|
73
98
|
graph,
|
|
74
99
|
specOptions: conf.options,
|
|
@@ -78,27 +103,56 @@ export const command = async (conf) => {
|
|
|
78
103
|
const selectImporters = [];
|
|
79
104
|
const importers = new Set();
|
|
80
105
|
const scopeIDs = [];
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
106
|
+
// handle --scope option to add scope nodes as importers
|
|
107
|
+
const scopeQueryString = conf.get('scope');
|
|
108
|
+
let scopeNodes;
|
|
109
|
+
if (scopeQueryString) {
|
|
110
|
+
// run scope query to get all matching nodes
|
|
111
|
+
const scopeQuery = new Query({
|
|
112
|
+
graph,
|
|
113
|
+
specOptions: conf.options,
|
|
114
|
+
securityArchive,
|
|
115
|
+
});
|
|
116
|
+
const { nodes } = await scopeQuery.search(scopeQueryString, {
|
|
117
|
+
signal: new AbortController().signal,
|
|
118
|
+
});
|
|
119
|
+
scopeNodes = nodes;
|
|
120
|
+
}
|
|
121
|
+
if (scopeQueryString && scopeNodes) {
|
|
122
|
+
// Add all scope nodes to importers Set (treat them as top-level items)
|
|
123
|
+
for (const queryNode of scopeNodes) {
|
|
124
|
+
importers.add(asNode(queryNode));
|
|
90
125
|
}
|
|
91
126
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
127
|
+
else {
|
|
128
|
+
// if in a workspace environment, select only the specified
|
|
129
|
+
// workspaces as top-level items
|
|
130
|
+
if (monorepo) {
|
|
131
|
+
for (const workspace of monorepo.filter(conf.values)) {
|
|
132
|
+
const w = graph.nodes.get(workspace.id);
|
|
133
|
+
if (w) {
|
|
134
|
+
importers.add(w);
|
|
135
|
+
selectImporters.push(`[name="${w.name}"]`);
|
|
136
|
+
selectImporters.push(`[name="${w.name}"] > *`);
|
|
137
|
+
scopeIDs.push(workspace.id);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// if no top-level item was set then by default
|
|
142
|
+
// we just set all importers as top-level items
|
|
143
|
+
if (importers.size === 0) {
|
|
144
|
+
for (const importer of graph.importers) {
|
|
145
|
+
importers.add(importer);
|
|
146
|
+
}
|
|
95
147
|
}
|
|
96
148
|
}
|
|
149
|
+
// build a default query string to use in the target search
|
|
97
150
|
const selectImportersQueryString = selectImporters.join(', ');
|
|
98
151
|
const defaultQueryString = (selectImporters.length &&
|
|
99
152
|
selectImporters.length < graph.importers.size) ?
|
|
100
153
|
selectImportersQueryString
|
|
101
154
|
: projectQueryString;
|
|
155
|
+
// retrieve the selected nodes and edges
|
|
102
156
|
const { edges, nodes } = await query.search(queryString || defaultQueryString, {
|
|
103
157
|
signal: new AbortController().signal,
|
|
104
158
|
scopeIDs: scopeIDs.length > 0 ? scopeIDs : undefined,
|
|
@@ -108,7 +162,7 @@ export const command = async (conf) => {
|
|
|
108
162
|
edges,
|
|
109
163
|
nodes,
|
|
110
164
|
queryString: queryString || defaultQueryString,
|
|
111
|
-
highlightSelection: !!
|
|
165
|
+
highlightSelection: !!(targetQueryString || positionalQueryString),
|
|
112
166
|
};
|
|
113
167
|
};
|
|
114
168
|
//# sourceMappingURL=list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n HumanReadableOutputGraph,\n JSONOutputGraph,\n MermaidOutputGraph,\n Node,\n} from '@vltpkg/graph'\nimport {\n actual,\n humanReadableOutput,\n jsonOutput,\n mermaidOutput,\n} from '@vltpkg/graph'\nimport { Query } from '@vltpkg/query'\nimport { SecurityArchive } from '@vltpkg/security-archive'\nimport type { DepID } from '@vltpkg/dep-id'\nimport { commandUsage } from '../config/usage.ts'\nimport type { CommandFn, CommandUsage } from '../index.ts'\nimport { startGUI } from '../start-gui.ts'\nimport type { Views } from '../view.ts'\n\nexport const usage: CommandUsage = () =>\n commandUsage({\n command: 'ls',\n usage: [\n '',\n '[query | specs] [--view=human | json | mermaid | gui]',\n ],\n description: `List installed dependencies matching given package names or resulting\n packages from matching a given Dependency Selector Syntax query if one\n is provided.\n\n The vlt Dependency Selector Syntax is a CSS-like query language that\n allows you to filter installed dependencies using a variety of metadata\n in the form of CSS-like attributes, pseudo selectors & combinators.\n\n Defaults to listing direct dependencies of a project and any configured\n workspace.`,\n examples: {\n '': {\n description:\n 'List direct dependencies of the current project / workspace',\n },\n '\"*\"': {\n description:\n 'List all dependencies for the current project / workspace',\n },\n 'foo bar baz': {\n description: `List all dependencies named 'foo', 'bar', or 'baz'`,\n },\n [`'[name=\"@scoped/package\"] > *'`]: {\n description:\n 'Lists direct dependencies of a specific package',\n },\n [`'*:workspace > *:peer'`]: {\n description: 'List all peer dependencies of all workspaces',\n },\n },\n options: {\n view: {\n value: '[human | json | mermaid | gui]',\n description:\n 'Output format. Defaults to human-readable or json if no tty.',\n },\n },\n })\n\nexport type ListResult = JSONOutputGraph &\n MermaidOutputGraph &\n HumanReadableOutputGraph & { queryString: string }\n\nexport const views = {\n json: jsonOutput,\n mermaid: mermaidOutput,\n human: humanReadableOutput,\n gui: async ({ queryString }, _, conf) => {\n await startGUI(\n conf,\n '/explore?query=' + encodeURIComponent(queryString),\n )\n },\n} as const satisfies Views<ListResult>\n\nexport const command: CommandFn<ListResult> = async conf => {\n const monorepo = conf.options.monorepo\n const mainManifest = conf.options.packageJson.read(\n conf.options.projectRoot,\n )\n const graph = actual.load({\n ...conf.options,\n mainManifest,\n monorepo,\n loadManifests: true,\n })\n\n const queryString = conf.positionals\n .map(k => (/^[@\\w-]/.test(k) ? `#${k.replace(/\\//, '\\\\/')}` : k))\n .join(', ')\n const securityArchive =\n Query.hasSecuritySelectors(queryString) ?\n await SecurityArchive.start({\n graph,\n specOptions: conf.options,\n })\n : undefined\n const query = new Query({\n graph,\n specOptions: conf.options,\n securityArchive,\n })\n const projectQueryString = ':project, :project > *'\n const selectImporters: string[] = []\n\n const importers = new Set<Node>()\n const scopeIDs: DepID[] = []\n\n if (monorepo) {\n for (const workspace of monorepo.filter(conf.values)) {\n const w: Node | undefined = graph.nodes.get(workspace.id)\n if (w) {\n importers.add(w)\n selectImporters.push(`[name=\"${w.name}\"]`)\n selectImporters.push(`[name=\"${w.name}\"] > *`)\n scopeIDs.push(workspace.id)\n }\n }\n }\n if (importers.size === 0) {\n for (const importer of graph.importers) {\n importers.add(importer)\n }\n }\n\n const selectImportersQueryString = selectImporters.join(', ')\n const defaultQueryString =\n (\n selectImporters.length &&\n selectImporters.length < graph.importers.size\n ) ?\n selectImportersQueryString\n : projectQueryString\n\n const { edges, nodes } = await query.search(\n queryString || defaultQueryString,\n {\n signal: new AbortController().signal,\n scopeIDs: scopeIDs.length > 0 ? scopeIDs : undefined,\n },\n )\n\n return {\n importers,\n edges,\n nodes,\n queryString: queryString || defaultQueryString,\n highlightSelection: !!queryString,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n HumanReadableOutputGraph,\n JSONOutputGraph,\n MermaidOutputGraph,\n Node,\n} from '@vltpkg/graph'\nimport {\n actual,\n asNode,\n humanReadableOutput,\n jsonOutput,\n mermaidOutput,\n GraphModifier,\n} from '@vltpkg/graph'\nimport LZString from 'lz-string'\nimport { Query } from '@vltpkg/query'\nimport { SecurityArchive } from '@vltpkg/security-archive'\nimport type { DepID } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport { commandUsage } from '../config/usage.ts'\nimport type { CommandFn, CommandUsage } from '../index.ts'\nimport { startGUI } from '../start-gui.ts'\nimport type { Views } from '../view.ts'\n\nexport const usage: CommandUsage = () =>\n commandUsage({\n command: 'ls',\n usage: [\n '',\n '[package-names...] [--view=human | json | mermaid | gui]',\n '[--scope=<query>] [--target=<query>] [--view=human | json | mermaid | gui]',\n ],\n description: `List installed dependencies matching given package names or query selectors.\n\n Package names provided as positional arguments will be used to filter\n the results to show only dependencies with those names.\n\n The --scope and --target options accepts DSS query selectors to filter\n packages. Using --scope, you can specify which packages to treat as the\n top-level items in the output graph. The --target option allows you to\n filter what dependencies to include in the output. Using both options\n allows you to render subgraphs of the dependency graph.\n\n Defaults to listing direct dependencies of a project and any configured\n workspace.`,\n examples: {\n '': {\n description:\n 'List direct dependencies of the current project / workspace',\n },\n 'foo bar baz': {\n description: `List all dependencies named 'foo', 'bar', or 'baz'`,\n },\n '--scope=\":root > #dependency-name\"': {\n description:\n 'Defines a direct dependency as the output top-level scope',\n },\n '--target=\"*\"': {\n description: 'List all dependencies using a query selector',\n },\n '--target=\":workspace > *:peer\"': {\n description: 'List all peer dependencies of all workspaces',\n },\n },\n options: {\n scope: {\n value: '<query>',\n description:\n 'Query selector to select top-level packages using the DSS query language syntax.',\n },\n target: {\n value: '<query>',\n description:\n 'Query selector to filter packages using the DSS query language syntax.',\n },\n view: {\n value: '[human | json | mermaid | gui]',\n description:\n 'Output format. Defaults to human-readable or json if no tty.',\n },\n },\n })\n\nexport type ListResult = JSONOutputGraph &\n MermaidOutputGraph &\n HumanReadableOutputGraph & { queryString: string }\n\nexport const views = {\n json: jsonOutput,\n mermaid: mermaidOutput,\n human: humanReadableOutput,\n gui: async ({ queryString }, _, conf) => {\n await startGUI(\n conf,\n `/explore/${LZString.compressToEncodedURIComponent(queryString)}/overview`,\n )\n },\n} as const satisfies Views<ListResult>\n\nexport const command: CommandFn<ListResult> = async conf => {\n const modifiers = GraphModifier.maybeLoad(conf.options)\n const monorepo = conf.options.monorepo\n const mainManifest = conf.options.packageJson.read(\n conf.options.projectRoot,\n )\n const graph = actual.load({\n ...conf.options,\n mainManifest,\n modifiers,\n monorepo,\n loadManifests: true,\n })\n\n // Validate positional arguments - only allow package names, not direct queries\n for (const arg of conf.positionals) {\n if (!/^[@\\w-]/.test(arg)) {\n throw error(\n `Direct queries are not supported as positional arguments. Use package names only.`,\n {\n code: 'EUSAGE',\n cause: `Argument '${arg}' appears to be a query syntax. Only package names are allowed as positional arguments.`,\n },\n )\n }\n }\n\n const positionalQueryString = conf.positionals\n .map(k => `#${k.replace(/\\//, '\\\\/')}`)\n .join(', ')\n const targetQueryString = conf.get('target')\n const queryString = targetQueryString || positionalQueryString\n\n const securityArchive = await SecurityArchive.start({\n graph,\n specOptions: conf.options,\n })\n const query = new Query({\n graph,\n specOptions: conf.options,\n securityArchive,\n })\n const projectQueryString = ':project, :project > *'\n const selectImporters: string[] = []\n\n const importers = new Set<Node>()\n const scopeIDs: DepID[] = []\n\n // handle --scope option to add scope nodes as importers\n const scopeQueryString = conf.get('scope')\n let scopeNodes\n if (scopeQueryString) {\n // run scope query to get all matching nodes\n const scopeQuery = new Query({\n graph,\n specOptions: conf.options,\n securityArchive,\n })\n const { nodes } = await scopeQuery.search(scopeQueryString, {\n signal: new AbortController().signal,\n })\n scopeNodes = nodes\n }\n\n if (scopeQueryString && scopeNodes) {\n // Add all scope nodes to importers Set (treat them as top-level items)\n for (const queryNode of scopeNodes) {\n importers.add(asNode(queryNode))\n }\n } else {\n // if in a workspace environment, select only the specified\n // workspaces as top-level items\n if (monorepo) {\n for (const workspace of monorepo.filter(conf.values)) {\n const w: Node | undefined = graph.nodes.get(workspace.id)\n if (w) {\n importers.add(w)\n selectImporters.push(`[name=\"${w.name}\"]`)\n selectImporters.push(`[name=\"${w.name}\"] > *`)\n scopeIDs.push(workspace.id)\n }\n }\n }\n // if no top-level item was set then by default\n // we just set all importers as top-level items\n if (importers.size === 0) {\n for (const importer of graph.importers) {\n importers.add(importer)\n }\n }\n }\n\n // build a default query string to use in the target search\n const selectImportersQueryString = selectImporters.join(', ')\n const defaultQueryString =\n (\n selectImporters.length &&\n selectImporters.length < graph.importers.size\n ) ?\n selectImportersQueryString\n : projectQueryString\n\n // retrieve the selected nodes and edges\n const { edges, nodes } = await query.search(\n queryString || defaultQueryString,\n {\n signal: new AbortController().signal,\n scopeIDs: scopeIDs.length > 0 ? scopeIDs : undefined,\n },\n )\n\n return {\n importers,\n edges,\n nodes,\n queryString: queryString || defaultQueryString,\n highlightSelection: !!(\n targetQueryString || positionalQueryString\n ),\n }\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CommandFn, CommandUsage } from '../index.ts';
|
|
2
|
+
export declare const usage: CommandUsage;
|
|
3
|
+
type CommandResult = {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
filename: string;
|
|
8
|
+
files: string[];
|
|
9
|
+
size: number;
|
|
10
|
+
unpackedSize: number;
|
|
11
|
+
shasum?: string;
|
|
12
|
+
integrity?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare const views: {
|
|
15
|
+
readonly human: (r: CommandResult) => string;
|
|
16
|
+
readonly json: (r: CommandResult) => CommandResult;
|
|
17
|
+
};
|
|
18
|
+
export declare const command: CommandFn<CommandResult>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../../src/commands/pack.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK1D,eAAO,MAAM,KAAK,EAAE,YAchB,CAAA;AAEJ,KAAK,aAAa,GAAG;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,KAAK;;;CAeuB,CAAA;AAEzC,eAAO,MAAM,OAAO,EAAE,SAAS,CAAC,aAAa,CAyD5C,CAAA"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import assert from 'node:assert';
|
|
4
|
+
import { run } from '@vltpkg/run';
|
|
5
|
+
import { commandUsage } from "../config/usage.js";
|
|
6
|
+
import { packTarball } from "../pack-tarball.js";
|
|
7
|
+
import prettyBytes from 'pretty-bytes';
|
|
8
|
+
export const usage = () => commandUsage({
|
|
9
|
+
command: 'pack',
|
|
10
|
+
usage: '',
|
|
11
|
+
description: `Create a tarball from a package in the current directory or specified folder.
|
|
12
|
+
|
|
13
|
+
The tarball will be saved to the current directory with the name
|
|
14
|
+
<name>-<version>.tgz.`,
|
|
15
|
+
options: {
|
|
16
|
+
'dry-run': {
|
|
17
|
+
description: 'Show what would be packed without creating a tarball',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
export const views = {
|
|
22
|
+
human: r => {
|
|
23
|
+
const lines = [
|
|
24
|
+
`📦 ${r.name}@${r.version}`,
|
|
25
|
+
`📄 ${r.filename}`,
|
|
26
|
+
`📁 ${r.files.length} files`,
|
|
27
|
+
...r.files.map(f => ` - ${f}`),
|
|
28
|
+
`📊 package size: ${prettyBytes(r.size)}`,
|
|
29
|
+
`📂 unpacked size: ${prettyBytes(r.unpackedSize)}`,
|
|
30
|
+
];
|
|
31
|
+
if (r.shasum)
|
|
32
|
+
lines.push(`🔒 shasum: ${r.shasum}`);
|
|
33
|
+
if (r.integrity)
|
|
34
|
+
lines.push(`🔐 integrity: ${r.integrity}`);
|
|
35
|
+
return lines.join('\n');
|
|
36
|
+
},
|
|
37
|
+
json: r => r,
|
|
38
|
+
};
|
|
39
|
+
export const command = async (conf) => {
|
|
40
|
+
const manifestPath = conf.options.packageJson.find();
|
|
41
|
+
assert(manifestPath, 'No package.json found');
|
|
42
|
+
const manifestDir = dirname(manifestPath);
|
|
43
|
+
const manifest = conf.options.packageJson.read(manifestDir);
|
|
44
|
+
const isDryRun = conf.options['dry-run'];
|
|
45
|
+
const runOptions = {
|
|
46
|
+
cwd: manifestDir,
|
|
47
|
+
projectRoot: conf.projectRoot,
|
|
48
|
+
packageJson: conf.options.packageJson,
|
|
49
|
+
manifest,
|
|
50
|
+
ignoreMissing: true,
|
|
51
|
+
ignorePrePost: true,
|
|
52
|
+
};
|
|
53
|
+
await run({
|
|
54
|
+
...runOptions,
|
|
55
|
+
arg0: 'prepack',
|
|
56
|
+
});
|
|
57
|
+
await run({
|
|
58
|
+
...runOptions,
|
|
59
|
+
arg0: 'prepare',
|
|
60
|
+
});
|
|
61
|
+
const { name, version, filename, tarballData, unpackedSize, files, integrity, shasum, } = await packTarball(manifest, manifestDir, conf);
|
|
62
|
+
if (!isDryRun) {
|
|
63
|
+
await writeFile(join(manifestDir, filename), tarballData);
|
|
64
|
+
}
|
|
65
|
+
await run({
|
|
66
|
+
...runOptions,
|
|
67
|
+
arg0: 'postpack',
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
id: `${name}@${version}`,
|
|
71
|
+
name,
|
|
72
|
+
version,
|
|
73
|
+
filename,
|
|
74
|
+
files,
|
|
75
|
+
size: tarballData.length,
|
|
76
|
+
unpackedSize,
|
|
77
|
+
shasum,
|
|
78
|
+
integrity,
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../../src/commands/pack.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\nimport assert from 'node:assert'\nimport { run } from '@vltpkg/run'\nimport { commandUsage } from '../config/usage.ts'\nimport type { CommandFn, CommandUsage } from '../index.ts'\nimport { packTarball } from '../pack-tarball.ts'\nimport type { Views } from '../view.ts'\nimport prettyBytes from 'pretty-bytes'\n\nexport const usage: CommandUsage = () =>\n commandUsage({\n command: 'pack',\n usage: '',\n description: `Create a tarball from a package in the current directory or specified folder.\n \n The tarball will be saved to the current directory with the name\n <name>-<version>.tgz.`,\n options: {\n 'dry-run': {\n description:\n 'Show what would be packed without creating a tarball',\n },\n },\n })\n\ntype CommandResult = {\n id: string\n name: string\n version: string\n filename: string\n files: string[]\n size: number\n unpackedSize: number\n shasum?: string\n integrity?: string\n}\n\nexport const views = {\n human: r => {\n const lines = [\n `📦 ${r.name}@${r.version}`,\n `📄 ${r.filename}`,\n `📁 ${r.files.length} files`,\n ...r.files.map(f => ` - ${f}`),\n `📊 package size: ${prettyBytes(r.size)}`,\n `📂 unpacked size: ${prettyBytes(r.unpackedSize)}`,\n ]\n if (r.shasum) lines.push(`🔒 shasum: ${r.shasum}`)\n if (r.integrity) lines.push(`🔐 integrity: ${r.integrity}`)\n return lines.join('\\n')\n },\n json: r => r,\n} as const satisfies Views<CommandResult>\n\nexport const command: CommandFn<CommandResult> = async conf => {\n const manifestPath = conf.options.packageJson.find()\n assert(manifestPath, 'No package.json found')\n const manifestDir = dirname(manifestPath)\n const manifest = conf.options.packageJson.read(manifestDir)\n\n const isDryRun = conf.options['dry-run']\n const runOptions = {\n cwd: manifestDir,\n projectRoot: conf.projectRoot,\n packageJson: conf.options.packageJson,\n manifest,\n ignoreMissing: true,\n ignorePrePost: true,\n }\n\n await run({\n ...runOptions,\n arg0: 'prepack',\n })\n\n await run({\n ...runOptions,\n arg0: 'prepare',\n })\n\n const {\n name,\n version,\n filename,\n tarballData,\n unpackedSize,\n files,\n integrity,\n shasum,\n } = await packTarball(manifest, manifestDir, conf)\n\n if (!isDryRun) {\n await writeFile(join(manifestDir, filename), tarballData)\n }\n\n await run({\n ...runOptions,\n arg0: 'postpack',\n })\n\n return {\n id: `${name}@${version}`,\n name,\n version,\n filename,\n files,\n size: tarballData.length,\n unpackedSize,\n shasum,\n integrity,\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CommandFn, CommandUsage } from '../index.ts';
|
|
2
2
|
export declare const views: {
|
|
3
|
-
readonly human: (
|
|
3
|
+
readonly human: (_results: unknown, _options: import("../view.ts").ViewOptions, config: import("../config/index.ts").ParsedConfig) => string;
|
|
4
4
|
};
|
|
5
5
|
export declare const usage: CommandUsage;
|
|
6
6
|
export declare const command: CommandFn;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pkg.d.ts","sourceRoot":"","sources":["../../../src/commands/pkg.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pkg.d.ts","sourceRoot":"","sources":["../../../src/commands/pkg.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAoB1D,eAAO,MAAM,KAAK;;CAmBQ,CAAA;AAE1B,eAAO,MAAM,KAAK,EAAE,YAoChB,CAAA;AAEJ,eAAO,MAAM,OAAO,EAAE,SA8FrB,CAAA"}
|
package/dist/esm/commands/pkg.js
CHANGED
|
@@ -1,19 +1,27 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
1
2
|
import * as dotProp from '@vltpkg/dot-prop';
|
|
2
3
|
import { error } from '@vltpkg/error-cause';
|
|
3
4
|
import assert from 'node:assert';
|
|
4
5
|
import { commandUsage } from "../config/usage.js";
|
|
5
6
|
import { init } from '@vltpkg/init';
|
|
6
7
|
import { views as initViews } from "./init.js";
|
|
8
|
+
import { actual, GraphModifier } from '@vltpkg/graph';
|
|
9
|
+
import { Query } from '@vltpkg/query';
|
|
10
|
+
import { SecurityArchive } from '@vltpkg/security-archive';
|
|
11
|
+
const json = (results) => JSON.stringify(results, null, 2);
|
|
7
12
|
export const views = {
|
|
8
|
-
human: (
|
|
13
|
+
human: (_results, _options, config) => {
|
|
14
|
+
const results = _results;
|
|
9
15
|
// `vlt pkg init` is an alias for `vlt init`
|
|
10
16
|
// use the same output handling
|
|
11
17
|
if (config.positionals[0] === 'init') {
|
|
12
|
-
return initViews.human(results
|
|
18
|
+
return initViews.human(results);
|
|
13
19
|
}
|
|
14
|
-
return results
|
|
15
|
-
|
|
16
|
-
|
|
20
|
+
return (Array.isArray(results) ?
|
|
21
|
+
typeof results[0] === 'string' ?
|
|
22
|
+
results.join('\n')
|
|
23
|
+
: json(results)
|
|
24
|
+
: json(results));
|
|
17
25
|
},
|
|
18
26
|
};
|
|
19
27
|
export const usage = () => commandUsage({
|
|
@@ -57,19 +65,71 @@ export const command = async (conf) => {
|
|
|
57
65
|
return await init({ cwd: process.cwd() });
|
|
58
66
|
}
|
|
59
67
|
const pkg = conf.options.packageJson;
|
|
60
|
-
|
|
68
|
+
// Handle --scope option to get multiple manifests
|
|
69
|
+
const scopeQueryString = conf.get('scope');
|
|
70
|
+
let manifests;
|
|
71
|
+
if (scopeQueryString) {
|
|
72
|
+
const modifiers = GraphModifier.maybeLoad(conf.options);
|
|
73
|
+
const monorepo = conf.options.monorepo;
|
|
74
|
+
const mainManifest = conf.options.packageJson.read(conf.options.projectRoot);
|
|
75
|
+
const graph = actual.load({
|
|
76
|
+
...conf.options,
|
|
77
|
+
mainManifest,
|
|
78
|
+
modifiers,
|
|
79
|
+
monorepo,
|
|
80
|
+
loadManifests: false,
|
|
81
|
+
});
|
|
82
|
+
const securityArchive = Query.hasSecuritySelectors(scopeQueryString) ?
|
|
83
|
+
await SecurityArchive.start({
|
|
84
|
+
graph,
|
|
85
|
+
specOptions: conf.options,
|
|
86
|
+
})
|
|
87
|
+
: undefined;
|
|
88
|
+
const query = new Query({
|
|
89
|
+
graph,
|
|
90
|
+
specOptions: conf.options,
|
|
91
|
+
securityArchive,
|
|
92
|
+
});
|
|
93
|
+
const { nodes } = await query.search(scopeQueryString, {
|
|
94
|
+
signal: new AbortController().signal,
|
|
95
|
+
});
|
|
96
|
+
// collects the paths of the nodes selected using --scope
|
|
97
|
+
const scopePaths = nodes
|
|
98
|
+
.filter((n) => n.location !== undefined)
|
|
99
|
+
.map(n => resolve(conf.options.projectRoot, n.location));
|
|
100
|
+
// reads multiple manifests for each selected scope
|
|
101
|
+
manifests = scopePaths.map(location => ({
|
|
102
|
+
manifest: pkg.read(location),
|
|
103
|
+
location,
|
|
104
|
+
}));
|
|
105
|
+
if (manifests.length === 0) {
|
|
106
|
+
throw error('No matching package found using scope', {
|
|
107
|
+
found: scopeQueryString,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
// Single manifest mode
|
|
113
|
+
const location = pkg.find() ?? conf.projectRoot;
|
|
114
|
+
manifests = [
|
|
115
|
+
{
|
|
116
|
+
manifest: pkg.read(location),
|
|
117
|
+
location,
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
}
|
|
61
121
|
switch (sub) {
|
|
62
122
|
case 'get':
|
|
63
|
-
return get(
|
|
123
|
+
return get(manifests, args);
|
|
64
124
|
case 'pick':
|
|
65
|
-
return pick(
|
|
125
|
+
return pick(manifests, args);
|
|
66
126
|
case 'set':
|
|
67
|
-
return set(conf,
|
|
127
|
+
return set(conf, manifests, pkg, args);
|
|
68
128
|
case 'rm':
|
|
69
129
|
case 'remove':
|
|
70
130
|
case 'unset':
|
|
71
131
|
case 'delete':
|
|
72
|
-
return rm(conf,
|
|
132
|
+
return rm(conf, manifests, pkg, args);
|
|
73
133
|
default: {
|
|
74
134
|
throw error('Unrecognized pkg command', {
|
|
75
135
|
code: 'EUSAGE',
|
|
@@ -79,45 +139,85 @@ export const command = async (conf) => {
|
|
|
79
139
|
}
|
|
80
140
|
}
|
|
81
141
|
};
|
|
82
|
-
const get = (
|
|
142
|
+
const get = (manifests, args) => {
|
|
83
143
|
const noArg = () => error('get requires not more than 1 argument. use `pick` to get more than 1.', { code: 'EUSAGE' }, noArg);
|
|
84
144
|
if (args.length !== 1) {
|
|
85
145
|
if (args.length > 1) {
|
|
86
146
|
throw noArg();
|
|
87
147
|
}
|
|
88
|
-
return pick(
|
|
148
|
+
return pick(manifests, args);
|
|
89
149
|
}
|
|
90
|
-
assert(args[0], noArg());
|
|
91
|
-
|
|
150
|
+
assert(args[0] != null, noArg());
|
|
151
|
+
const [key] = args;
|
|
152
|
+
if (manifests.length === 1) {
|
|
153
|
+
const [firstManifest] = manifests;
|
|
154
|
+
if (!firstManifest?.manifest) {
|
|
155
|
+
/* c8 ignore start */
|
|
156
|
+
throw error('No manifest found', firstManifest?.location ?
|
|
157
|
+
{ path: firstManifest.location }
|
|
158
|
+
: {});
|
|
159
|
+
/* c8 ignore stop */
|
|
160
|
+
}
|
|
161
|
+
return dotProp.get(firstManifest.manifest, key);
|
|
162
|
+
}
|
|
163
|
+
return manifests.map(manifest => dotProp.get(manifest.manifest, key));
|
|
92
164
|
};
|
|
93
|
-
const pick = (
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
165
|
+
const pick = (manifests, args) => {
|
|
166
|
+
if (manifests.length === 1) {
|
|
167
|
+
const [firstManifest] = manifests;
|
|
168
|
+
/* c8 ignore start */
|
|
169
|
+
if (!firstManifest?.manifest) {
|
|
170
|
+
throw error('No manifest found', firstManifest?.location ?
|
|
171
|
+
{ path: firstManifest.location }
|
|
172
|
+
: {});
|
|
173
|
+
}
|
|
174
|
+
/* c8 ignore stop */
|
|
175
|
+
const { manifest } = firstManifest;
|
|
176
|
+
return args.length ?
|
|
177
|
+
args.reduce((acc, key) => dotProp.set(acc, key, dotProp.get(manifest, key)), {})
|
|
178
|
+
: manifest;
|
|
179
|
+
}
|
|
180
|
+
// Multiple manifests - return results keyed by location
|
|
181
|
+
return manifests.map(manifest => args.length ?
|
|
182
|
+
args.reduce((acc, key) => dotProp.set(acc, key, dotProp.get(manifest.manifest, key)), {})
|
|
183
|
+
: manifest.manifest);
|
|
97
184
|
};
|
|
98
|
-
const set = (
|
|
185
|
+
const set = (_conf, manifests, pkg, args) => {
|
|
99
186
|
if (args.length < 1) {
|
|
100
187
|
throw error('set requires arguments', { code: 'EUSAGE' });
|
|
101
188
|
}
|
|
102
|
-
const
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
189
|
+
for (const { manifest, location } of manifests) {
|
|
190
|
+
const res = args.reduce((acc, p) => {
|
|
191
|
+
const index = p.indexOf('=');
|
|
192
|
+
if (index === -1) {
|
|
193
|
+
throw error('set arguments must contain `=`', {
|
|
194
|
+
code: 'EUSAGE',
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return dotProp.set(acc, p.substring(0, index), p.substring(index + 1));
|
|
198
|
+
}, manifest);
|
|
199
|
+
pkg.write(location, res);
|
|
200
|
+
}
|
|
112
201
|
};
|
|
113
|
-
const rm = (
|
|
202
|
+
const rm = (_conf, manifests, pkg, args) => {
|
|
114
203
|
if (args.length < 1) {
|
|
115
204
|
throw error('rm requires arguments', { code: 'EUSAGE' });
|
|
116
205
|
}
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
206
|
+
const results = [];
|
|
207
|
+
for (const { manifest, location } of manifests) {
|
|
208
|
+
const res = args.reduce((acc, key) => {
|
|
209
|
+
dotProp.del(acc, key);
|
|
210
|
+
return acc;
|
|
211
|
+
}, manifest);
|
|
212
|
+
pkg.write(location, res);
|
|
213
|
+
results.push({
|
|
214
|
+
manifest: res,
|
|
215
|
+
location,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
if (manifests.length === 1) {
|
|
219
|
+
return results[0];
|
|
220
|
+
}
|
|
221
|
+
return results;
|
|
122
222
|
};
|
|
123
223
|
//# sourceMappingURL=pkg.js.map
|