@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.
Files changed (60) hide show
  1. package/dist/esm/commands/config.d.ts.map +1 -1
  2. package/dist/esm/commands/config.js +106 -35
  3. package/dist/esm/commands/config.js.map +1 -1
  4. package/dist/esm/commands/help.d.ts +1 -1
  5. package/dist/esm/commands/help.d.ts.map +1 -1
  6. package/dist/esm/commands/help.js +25 -3
  7. package/dist/esm/commands/help.js.map +1 -1
  8. package/dist/esm/commands/init.d.ts +3 -3
  9. package/dist/esm/commands/init.d.ts.map +1 -1
  10. package/dist/esm/commands/init.js +95 -9
  11. package/dist/esm/commands/init.js.map +1 -1
  12. package/dist/esm/commands/list.d.ts.map +1 -1
  13. package/dist/esm/commands/list.js +90 -36
  14. package/dist/esm/commands/list.js.map +1 -1
  15. package/dist/esm/commands/pack.d.ts +20 -0
  16. package/dist/esm/commands/pack.d.ts.map +1 -0
  17. package/dist/esm/commands/pack.js +81 -0
  18. package/dist/esm/commands/pack.js.map +1 -0
  19. package/dist/esm/commands/pkg.d.ts +1 -1
  20. package/dist/esm/commands/pkg.d.ts.map +1 -1
  21. package/dist/esm/commands/pkg.js +135 -35
  22. package/dist/esm/commands/pkg.js.map +1 -1
  23. package/dist/esm/commands/publish.d.ts +21 -0
  24. package/dist/esm/commands/publish.d.ts.map +1 -0
  25. package/dist/esm/commands/publish.js +168 -0
  26. package/dist/esm/commands/publish.js.map +1 -0
  27. package/dist/esm/commands/query.d.ts +1 -1
  28. package/dist/esm/commands/query.d.ts.map +1 -1
  29. package/dist/esm/commands/query.js +81 -23
  30. package/dist/esm/commands/query.js.map +1 -1
  31. package/dist/esm/commands/version.d.ts +22 -0
  32. package/dist/esm/commands/version.d.ts.map +1 -0
  33. package/dist/esm/commands/version.js +151 -0
  34. package/dist/esm/commands/version.js.map +1 -0
  35. package/dist/esm/config/definition.d.ts +30 -2
  36. package/dist/esm/config/definition.d.ts.map +1 -1
  37. package/dist/esm/config/definition.js +28 -4
  38. package/dist/esm/config/definition.js.map +1 -1
  39. package/dist/esm/config/index.d.ts.map +1 -1
  40. package/dist/esm/config/index.js +4 -0
  41. package/dist/esm/config/index.js.map +1 -1
  42. package/dist/esm/exec-command.js +2 -2
  43. package/dist/esm/exec-command.js.map +1 -1
  44. package/dist/esm/index.d.ts +1 -14
  45. package/dist/esm/index.d.ts.map +1 -1
  46. package/dist/esm/index.js +13 -22
  47. package/dist/esm/index.js.map +1 -1
  48. package/dist/esm/load-command.d.ts +16 -0
  49. package/dist/esm/load-command.d.ts.map +1 -0
  50. package/dist/esm/load-command.js +21 -0
  51. package/dist/esm/load-command.js.map +1 -0
  52. package/dist/esm/pack-tarball.d.ts +21 -0
  53. package/dist/esm/pack-tarball.d.ts.map +1 -0
  54. package/dist/esm/pack-tarball.js +226 -0
  55. package/dist/esm/pack-tarball.js.map +1 -0
  56. package/dist/esm/start-gui.d.ts +1 -0
  57. package/dist/esm/start-gui.d.ts.map +1 -1
  58. package/dist/esm/start-gui.js +5 -3
  59. package/dist/esm/start-gui.js.map +1 -1
  60. 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
- '[query | specs] [--view=human | json | mermaid | gui]',
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 resulting
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
- The vlt Dependency Selector Syntax is a CSS-like query language that
17
- allows you to filter installed dependencies using a variety of metadata
18
- in the form of CSS-like attributes, pseudo selectors & combinators.
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
- [`'[name="@scoped/package"] > *'`]: {
33
- description: 'Lists direct dependencies of a specific package',
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
- [`'*:workspace > *:peer'`]: {
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, '/explore?query=' + encodeURIComponent(queryString));
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
- const queryString = conf.positionals
64
- .map(k => (/^[@\w-]/.test(k) ? `#${k.replace(/\//, '\\/')}` : k))
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 securityArchive = Query.hasSecuritySelectors(queryString) ?
67
- await SecurityArchive.start({
68
- graph,
69
- specOptions: conf.options,
70
- })
71
- : undefined;
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
- if (monorepo) {
82
- for (const workspace of monorepo.filter(conf.values)) {
83
- const w = graph.nodes.get(workspace.id);
84
- if (w) {
85
- importers.add(w);
86
- selectImporters.push(`[name="${w.name}"]`);
87
- selectImporters.push(`[name="${w.name}"] > *`);
88
- scopeIDs.push(workspace.id);
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
- if (importers.size === 0) {
93
- for (const importer of graph.importers) {
94
- importers.add(importer);
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: !!queryString,
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: (results: unknown, options: import("../view.ts").ViewOptions, config: import("../config/index.ts").ParsedConfig) => unknown;
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":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAM1D,eAAO,MAAM,KAAK;;CAmBQ,CAAA;AAE1B,eAAO,MAAM,KAAK,EAAE,YAoChB,CAAA;AAEJ,eAAO,MAAM,OAAO,EAAE,SA6BrB,CAAA"}
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"}
@@ -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: (results, options, config) => {
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, options, config);
18
+ return initViews.human(results);
13
19
  }
14
- return results && typeof results === 'object' ?
15
- Object.fromEntries(Object.entries(results).filter(([k]) => typeof k !== 'symbol'))
16
- : results;
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
- const mani = pkg.read(conf.projectRoot);
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(mani, args);
123
+ return get(manifests, args);
64
124
  case 'pick':
65
- return pick(mani, args);
125
+ return pick(manifests, args);
66
126
  case 'set':
67
- return set(conf, mani, pkg, args);
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, mani, pkg, args);
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 = (mani, args) => {
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(mani, args);
148
+ return pick(manifests, args);
89
149
  }
90
- assert(args[0], noArg());
91
- return dotProp.get(mani, args[0]);
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 = (mani, args) => {
94
- return args.length ?
95
- args.reduce((acc, key) => dotProp.set(acc, key, dotProp.get(mani, key)), {})
96
- : mani;
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 = (conf, mani, pkg, args) => {
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 res = args.reduce((acc, p) => {
103
- const index = p.indexOf('=');
104
- if (index === -1) {
105
- throw error('set arguments must contain `=`', {
106
- code: 'EUSAGE',
107
- });
108
- }
109
- return dotProp.set(acc, p.substring(0, index), p.substring(index + 1));
110
- }, mani);
111
- pkg.write(conf.projectRoot, res);
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 = (conf, mani, pkg, args) => {
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 res = args.reduce((acc, key) => {
118
- dotProp.del(acc, key);
119
- return acc;
120
- }, mani);
121
- pkg.write(conf.projectRoot, res);
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