@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
@@ -0,0 +1,226 @@
1
+ import { create as tarCreate, list as tarList } from 'tar';
2
+ import { minimatch } from 'minimatch';
3
+ import { error } from '@vltpkg/error-cause';
4
+ import * as ssri from 'ssri';
5
+ import assert from 'node:assert';
6
+ import { Spec } from '@vltpkg/spec';
7
+ /**
8
+ * Replace workspace: and catalog: specs with actual versions
9
+ * @param {Manifest} manifest_ - The manifest to process
10
+ * @param {LoadedConfig} config - The loaded configuration containing project root, monorepo, and catalog data
11
+ * @returns {Manifest} The manifest with replaced specs
12
+ */
13
+ const replaceWorkspaceAndCatalogSpecs = (manifest_, config) => {
14
+ // Create a deep copy of the manifest to avoid modifying the original
15
+ const manifest = structuredClone(manifest_);
16
+ // Get workspace and catalog configuration from config
17
+ const { monorepo, catalog = {}, catalogs = {} } = config.options;
18
+ // Process dependency types
19
+ const depTypes = [
20
+ 'dependencies',
21
+ 'devDependencies',
22
+ 'optionalDependencies',
23
+ 'peerDependencies',
24
+ ];
25
+ for (const depType of depTypes) {
26
+ const deps = manifest[depType];
27
+ /* c8 ignore next */
28
+ if (!deps || typeof deps !== 'object')
29
+ continue;
30
+ const depsObj = deps;
31
+ for (const [depName, depSpec] of Object.entries(depsObj)) {
32
+ /* c8 ignore next */
33
+ if (typeof depSpec !== 'string')
34
+ continue;
35
+ const spec = Spec.parse(`${depName}@${depSpec}`, {
36
+ catalog,
37
+ catalogs,
38
+ });
39
+ switch (spec.type) {
40
+ case 'workspace': {
41
+ assert(monorepo, error(`No workspace configuration found for ${depName}`, {
42
+ found: depName,
43
+ }));
44
+ const workspaceName = spec.workspace;
45
+ assert(workspaceName, error(`No workspace name found for ${depName}`, {
46
+ found: depName,
47
+ }));
48
+ const workspace = monorepo.get(workspaceName);
49
+ assert(workspace, error(`Workspace '${workspaceName}' not found`, {
50
+ found: workspaceName,
51
+ validOptions: Array.from(monorepo.keys()),
52
+ }));
53
+ const actualVersion = workspace.manifest.version;
54
+ assert(actualVersion, error(`No version found for workspace '${workspaceName}'`, {
55
+ found: workspaceName,
56
+ wanted: 'package version',
57
+ }));
58
+ depsObj[depName] = actualVersion;
59
+ break;
60
+ }
61
+ case 'catalog': {
62
+ const catalogName = spec.catalog || '';
63
+ const targetCatalog = catalogName ? catalogs[catalogName] : catalog;
64
+ assert(targetCatalog, error(`Catalog '${catalogName}' not found`, {
65
+ found: catalogName,
66
+ validOptions: Object.keys(catalogs),
67
+ }));
68
+ const actualVersion = targetCatalog[depName];
69
+ assert(actualVersion, error(`Package '${depName}' not found in catalog '${catalogName || 'default'}'`, {
70
+ found: depName,
71
+ validOptions: Object.keys(targetCatalog),
72
+ }));
73
+ depsObj[depName] = actualVersion;
74
+ break;
75
+ }
76
+ }
77
+ }
78
+ }
79
+ return manifest;
80
+ };
81
+ /**
82
+ * Create a tarball from a package directory
83
+ * @param {Manifest} manifest - The manifest of the package to pack
84
+ * @param {string} dir - The directory containing the package to pack
85
+ * @param {LoadedConfig} [config] - The loaded configuration (for workspace/catalog resolution)
86
+ * @returns {Promise<PackTarballResult>} The manifest, filename, and tarball data (unless dry run)
87
+ */
88
+ export const packTarball = async (manifest, dir, config) => {
89
+ assert(manifest.name && manifest.version, error('Package must have a name and version'));
90
+ const processedManifest = replaceWorkspaceAndCatalogSpecs(manifest, config);
91
+ const filename = `${manifest.name.replace('@', '').replace('/', '-')}-${manifest.version}.tgz`;
92
+ try {
93
+ config.options.packageJson.write(dir, processedManifest);
94
+ const tarballData = await tarCreate({
95
+ cwd: dir,
96
+ gzip: true,
97
+ portable: true,
98
+ prefix: 'package/',
99
+ filter: (path) => {
100
+ // Normalize path - remove leading './'
101
+ const normalizedPath = path.replace(/^\.\//, '');
102
+ // Always include root directory
103
+ if (path === '.' || normalizedPath === '') {
104
+ return true;
105
+ }
106
+ // Always exclude certain files/directories
107
+ const alwaysExcludePatterns = [
108
+ /^\.?\/?\.git(\/|$)/,
109
+ /^\.?\/?node_modules(\/|$)/,
110
+ /^\.?\/?\.nyc_output(\/|$)/,
111
+ /^\.?\/?coverage(\/|$)/,
112
+ /^\.?\/?\.DS_Store$/,
113
+ /^\.?\/?\.npmrc$/,
114
+ /^\.?\/?package-lock\.json$/,
115
+ /^\.?\/?yarn\.lock$/,
116
+ /^\.?\/?pnpm-lock\.yaml$/,
117
+ /^\.?\/?bun\.lockb$/,
118
+ /^\.?\/?bun\.lock$/,
119
+ /^\.?\/?vlt-lock\.json$/,
120
+ /~$/,
121
+ /\.swp$/,
122
+ ];
123
+ if (alwaysExcludePatterns.some(pattern => pattern.test(normalizedPath))) {
124
+ return false;
125
+ }
126
+ // Always include certain files
127
+ const alwaysIncludePatterns = [
128
+ /^README(\..*)?$/i,
129
+ /^CHANGELOG(\..*)?$/i,
130
+ /^HISTORY(\..*)?$/i,
131
+ /^LICENSE(\..*)?$/i,
132
+ /^LICENCE(\..*)?$/i,
133
+ ];
134
+ if (alwaysIncludePatterns.some(pattern => pattern.test(normalizedPath))) {
135
+ return true;
136
+ }
137
+ // Always include package.json
138
+ if (normalizedPath === 'package.json') {
139
+ return true;
140
+ }
141
+ // If files field is specified in package.json, use it for inclusion
142
+ const manifestWithFiles = manifest;
143
+ if (manifestWithFiles.files &&
144
+ Array.isArray(manifestWithFiles.files)) {
145
+ // Empty files array means exclude everything except always-included files
146
+ if (manifestWithFiles.files.length === 0) {
147
+ return false;
148
+ }
149
+ return manifestWithFiles.files.some((pattern) => {
150
+ if (pattern.endsWith('/')) {
151
+ const dirName = pattern.slice(0, -1);
152
+ const globPattern = pattern.replace(/\/$/, '/**');
153
+ const matchesDir = normalizedPath === dirName;
154
+ const matchesContents = minimatch(normalizedPath, globPattern, {
155
+ dot: true,
156
+ });
157
+ return matchesDir || matchesContents;
158
+ }
159
+ // File pattern: check direct match and if this path is a directory that could contain the pattern
160
+ const directMatch = minimatch(normalizedPath, pattern, {
161
+ dot: true,
162
+ });
163
+ // Check if this path is a directory that could contain the pattern
164
+ const isParentDir = pattern.includes('/') &&
165
+ pattern.startsWith(normalizedPath + '/');
166
+ return directMatch || isParentDir;
167
+ });
168
+ }
169
+ // Default behavior when no files field - exclude common development files
170
+ const defaultExcludePatterns = [
171
+ /^\.?\/?\.vscode(\/|$)/,
172
+ /^\.?\/?\.idea(\/|$)/,
173
+ /^\.?\/?\.gitignore$/,
174
+ /^\.?\/?\.npmignore$/,
175
+ /^\.?\/?\.editorconfig$/,
176
+ ];
177
+ return !defaultExcludePatterns.some(pattern => pattern.test(normalizedPath));
178
+ },
179
+ }, ['.']).concat();
180
+ let unpackedSize = 0;
181
+ const files = [];
182
+ await new Promise((resolve, reject) => {
183
+ const stream = tarList({
184
+ onentry: entry => {
185
+ if (entry.type === 'File') {
186
+ unpackedSize += entry.size;
187
+ // Remove the package/ prefix for cleaner file listing
188
+ const cleanPath = entry.path.replace(/^[^/]+\//, '');
189
+ if (cleanPath) {
190
+ // Skip empty paths
191
+ files.push(cleanPath);
192
+ }
193
+ }
194
+ },
195
+ });
196
+ stream
197
+ .on('end', () => resolve())
198
+ .on('error', reject)
199
+ .write(tarballData);
200
+ stream.end();
201
+ });
202
+ const integrityMap = ssri.fromData(tarballData, {
203
+ algorithms: [...new Set(['sha1', 'sha512'])],
204
+ });
205
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
206
+ const integrity = integrityMap.sha512?.[0]?.toString();
207
+ // @ts-expect-error -- types from DT are missing hexDigest
208
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
209
+ const shasum = integrityMap.sha1?.[0]?.hexDigest();
210
+ return {
211
+ name: manifest.name,
212
+ version: manifest.version,
213
+ filename,
214
+ tarballData,
215
+ unpackedSize,
216
+ files,
217
+ integrity,
218
+ shasum,
219
+ };
220
+ }
221
+ finally {
222
+ // Restore the original package.json
223
+ config.options.packageJson.write(dir, manifest);
224
+ }
225
+ };
226
+ //# sourceMappingURL=pack-tarball.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-tarball.js","sourceRoot":"","sources":["../../src/pack-tarball.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Manifest } from '@vltpkg/types'\nimport { create as tarCreate, list as tarList } from 'tar'\nimport { minimatch } from 'minimatch'\nimport { error } from '@vltpkg/error-cause'\nimport * as ssri from 'ssri'\nimport assert from 'node:assert'\nimport { Spec } from '@vltpkg/spec'\nimport type { LoadedConfig } from './config/index.ts'\n\nexport type PackTarballResult = {\n name: string\n version: string\n filename: string\n tarballData: Buffer\n unpackedSize: number\n files: string[]\n integrity?: string\n shasum?: string\n}\n\n/**\n * Replace workspace: and catalog: specs with actual versions\n * @param {Manifest} manifest_ - The manifest to process\n * @param {LoadedConfig} config - The loaded configuration containing project root, monorepo, and catalog data\n * @returns {Manifest} The manifest with replaced specs\n */\nconst replaceWorkspaceAndCatalogSpecs = (\n manifest_: Manifest,\n config: LoadedConfig,\n): Manifest => {\n // Create a deep copy of the manifest to avoid modifying the original\n const manifest = structuredClone(manifest_)\n\n // Get workspace and catalog configuration from config\n const { monorepo, catalog = {}, catalogs = {} } = config.options\n\n // Process dependency types\n const depTypes = [\n 'dependencies',\n 'devDependencies',\n 'optionalDependencies',\n 'peerDependencies',\n ] as const\n\n for (const depType of depTypes) {\n const deps = manifest[depType]\n /* c8 ignore next */\n if (!deps || typeof deps !== 'object') continue\n\n const depsObj = deps as Record<string, unknown>\n for (const [depName, depSpec] of Object.entries(depsObj)) {\n /* c8 ignore next */\n if (typeof depSpec !== 'string') continue\n\n const spec = Spec.parse(`${depName}@${depSpec}`, {\n catalog,\n catalogs,\n })\n\n switch (spec.type) {\n case 'workspace': {\n assert(\n monorepo,\n error(`No workspace configuration found for ${depName}`, {\n found: depName,\n }),\n )\n\n const workspaceName = spec.workspace\n assert(\n workspaceName,\n error(`No workspace name found for ${depName}`, {\n found: depName,\n }),\n )\n\n const workspace = monorepo.get(workspaceName)\n assert(\n workspace,\n error(`Workspace '${workspaceName}' not found`, {\n found: workspaceName,\n validOptions: Array.from(monorepo.keys()),\n }),\n )\n\n const actualVersion = workspace.manifest.version\n assert(\n actualVersion,\n error(\n `No version found for workspace '${workspaceName}'`,\n {\n found: workspaceName,\n wanted: 'package version',\n },\n ),\n )\n\n depsObj[depName] = actualVersion\n\n break\n }\n\n case 'catalog': {\n const catalogName = spec.catalog || ''\n const targetCatalog =\n catalogName ? catalogs[catalogName] : catalog\n assert(\n targetCatalog,\n error(`Catalog '${catalogName}' not found`, {\n found: catalogName,\n validOptions: Object.keys(catalogs),\n }),\n )\n\n const actualVersion = targetCatalog[depName]\n assert(\n actualVersion,\n error(\n `Package '${depName}' not found in catalog '${catalogName || 'default'}'`,\n {\n found: depName,\n validOptions: Object.keys(targetCatalog),\n },\n ),\n )\n\n depsObj[depName] = actualVersion\n\n break\n }\n }\n }\n }\n\n return manifest\n}\n\n/**\n * Create a tarball from a package directory\n * @param {Manifest} manifest - The manifest of the package to pack\n * @param {string} dir - The directory containing the package to pack\n * @param {LoadedConfig} [config] - The loaded configuration (for workspace/catalog resolution)\n * @returns {Promise<PackTarballResult>} The manifest, filename, and tarball data (unless dry run)\n */\nexport const packTarball = async (\n manifest: Manifest,\n dir: string,\n config: LoadedConfig,\n): Promise<PackTarballResult> => {\n assert(\n manifest.name && manifest.version,\n error('Package must have a name and version'),\n )\n\n const processedManifest = replaceWorkspaceAndCatalogSpecs(\n manifest,\n config,\n )\n\n const filename = `${manifest.name.replace('@', '').replace('/', '-')}-${manifest.version}.tgz`\n\n try {\n config.options.packageJson.write(dir, processedManifest)\n\n const tarballData = await tarCreate(\n {\n cwd: dir,\n gzip: true,\n portable: true,\n prefix: 'package/',\n filter: (path: string) => {\n // Normalize path - remove leading './'\n const normalizedPath = path.replace(/^\\.\\//, '')\n\n // Always include root directory\n if (path === '.' || normalizedPath === '') {\n return true\n }\n\n // Always exclude certain files/directories\n const alwaysExcludePatterns = [\n /^\\.?\\/?\\.git(\\/|$)/,\n /^\\.?\\/?node_modules(\\/|$)/,\n /^\\.?\\/?\\.nyc_output(\\/|$)/,\n /^\\.?\\/?coverage(\\/|$)/,\n /^\\.?\\/?\\.DS_Store$/,\n /^\\.?\\/?\\.npmrc$/,\n /^\\.?\\/?package-lock\\.json$/,\n /^\\.?\\/?yarn\\.lock$/,\n /^\\.?\\/?pnpm-lock\\.yaml$/,\n /^\\.?\\/?bun\\.lockb$/,\n /^\\.?\\/?bun\\.lock$/,\n /^\\.?\\/?vlt-lock\\.json$/,\n /~$/,\n /\\.swp$/,\n ]\n\n if (\n alwaysExcludePatterns.some(pattern =>\n pattern.test(normalizedPath),\n )\n ) {\n return false\n }\n\n // Always include certain files\n const alwaysIncludePatterns = [\n /^README(\\..*)?$/i,\n /^CHANGELOG(\\..*)?$/i,\n /^HISTORY(\\..*)?$/i,\n /^LICENSE(\\..*)?$/i,\n /^LICENCE(\\..*)?$/i,\n ]\n\n if (\n alwaysIncludePatterns.some(pattern =>\n pattern.test(normalizedPath),\n )\n ) {\n return true\n }\n\n // Always include package.json\n if (normalizedPath === 'package.json') {\n return true\n }\n\n // If files field is specified in package.json, use it for inclusion\n const manifestWithFiles = manifest as Manifest & {\n files?: string[]\n }\n if (\n manifestWithFiles.files &&\n Array.isArray(manifestWithFiles.files)\n ) {\n // Empty files array means exclude everything except always-included files\n if (manifestWithFiles.files.length === 0) {\n return false\n }\n return manifestWithFiles.files.some((pattern: string) => {\n if (pattern.endsWith('/')) {\n const dirName = pattern.slice(0, -1)\n const globPattern = pattern.replace(/\\/$/, '/**')\n const matchesDir = normalizedPath === dirName\n const matchesContents = minimatch(\n normalizedPath,\n globPattern,\n {\n dot: true,\n },\n )\n return matchesDir || matchesContents\n }\n\n // File pattern: check direct match and if this path is a directory that could contain the pattern\n const directMatch = minimatch(normalizedPath, pattern, {\n dot: true,\n })\n // Check if this path is a directory that could contain the pattern\n const isParentDir =\n pattern.includes('/') &&\n pattern.startsWith(normalizedPath + '/')\n return directMatch || isParentDir\n })\n }\n\n // Default behavior when no files field - exclude common development files\n const defaultExcludePatterns = [\n /^\\.?\\/?\\.vscode(\\/|$)/,\n /^\\.?\\/?\\.idea(\\/|$)/,\n /^\\.?\\/?\\.gitignore$/,\n /^\\.?\\/?\\.npmignore$/,\n /^\\.?\\/?\\.editorconfig$/,\n ]\n\n return !defaultExcludePatterns.some(pattern =>\n pattern.test(normalizedPath),\n )\n },\n },\n ['.'],\n ).concat()\n\n let unpackedSize = 0\n const files: string[] = []\n await new Promise<void>((resolve, reject) => {\n const stream = tarList({\n onentry: entry => {\n if (entry.type === 'File') {\n unpackedSize += entry.size\n // Remove the package/ prefix for cleaner file listing\n const cleanPath = entry.path.replace(/^[^/]+\\//, '')\n if (cleanPath) {\n // Skip empty paths\n files.push(cleanPath)\n }\n }\n },\n })\n stream\n .on('end', () => resolve())\n .on('error', reject)\n .write(tarballData)\n stream.end()\n })\n\n const integrityMap = ssri.fromData(tarballData, {\n algorithms: [...new Set(['sha1', 'sha512'])],\n })\n\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const integrity = integrityMap.sha512?.[0]?.toString()\n // @ts-expect-error -- types from DT are missing hexDigest\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n const shasum = integrityMap.sha1?.[0]?.hexDigest() as\n | string\n | undefined\n\n return {\n name: manifest.name,\n version: manifest.version,\n filename,\n tarballData,\n unpackedSize,\n files,\n integrity,\n shasum,\n }\n } finally {\n // Restore the original package.json\n config.options.packageJson.write(dir, manifest)\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import type { PathScurry } from 'path-scurry';
2
2
  import type { LoadedConfig } from './config/index.ts';
3
3
  export declare const getDefaultStartingRoute: (options: {
4
+ queryString?: string;
4
5
  startingRoute?: string;
5
6
  projectRoot: string;
6
7
  scurry: PathScurry;
@@ -1 +1 @@
1
- {"version":3,"file":"start-gui.d.ts","sourceRoot":"","sources":["../../src/start-gui.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIrD,eAAO,MAAM,uBAAuB,YAAmB;IACrD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,UAAU,CAAA;CACnB,oBAOA,CAAA;AAaD,eAAO,MAAM,QAAQ,SACb,YAAY,kBACF,MAAM,gDAuBvB,CAAA"}
1
+ {"version":3,"file":"start-gui.d.ts","sourceRoot":"","sources":["../../src/start-gui.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,eAAO,MAAM,uBAAuB,YAAmB;IACrD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,UAAU,CAAA;CACnB,oBAYA,CAAA;AAaD,eAAO,MAAM,QAAQ,SACb,YAAY,kBACF,MAAM,gDAwBvB,CAAA"}
@@ -1,14 +1,15 @@
1
+ import { resolve } from 'node:path';
2
+ import LZString from 'lz-string';
1
3
  import { createServer } from '@vltpkg/server';
2
4
  import { urlOpen } from '@vltpkg/url-open';
3
5
  import { stdout } from "./output.js";
4
- import { resolve } from 'node:path';
5
6
  export const getDefaultStartingRoute = async (options) => {
6
- const { startingRoute, projectRoot, scurry } = options;
7
+ const { queryString = ':root', startingRoute, projectRoot, scurry, } = options;
7
8
  if (startingRoute)
8
9
  return startingRoute;
9
10
  const stat = await scurry.lstat(`${projectRoot}/package.json`);
10
11
  return stat?.isFile() && !stat.isSymbolicLink() ?
11
- `/explore?query=${encodeURIComponent(':root')}`
12
+ `/explore/${LZString.compressToEncodedURIComponent(queryString)}/overview`
12
13
  : '/';
13
14
  };
14
15
  const getAssetsDir = () => {
@@ -31,6 +32,7 @@ export const startGUI = async (conf, startingRoute) => {
31
32
  await server.start();
32
33
  stdout(`⚡️ vlt GUI running at ${server.address()}`);
33
34
  void urlOpen(server.address(await getDefaultStartingRoute({
35
+ queryString: conf.values.target,
34
36
  startingRoute,
35
37
  projectRoot,
36
38
  scurry,
@@ -1 +1 @@
1
- {"version":3,"file":"start-gui.js","sourceRoot":"","sources":["../../src/start-gui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,OAI7C,EAAE,EAAE;IACH,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IACtD,IAAI,aAAa;QAAE,OAAO,aAAa,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,eAAe,CAAC,CAAA;IAC9D,OAAO,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7C,kBAAkB,kBAAkB,CAAC,OAAO,CAAC,EAAE;QACjD,CAAC,CAAC,GAAG,CAAA;AACT,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,GAAG,EAAE;IACxB,qBAAqB;IACrB,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;QAC9C,OAAO,OAAO,CACZ,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAC1C,CAAA;IACH,CAAC;IACD,oBAAoB;AACtB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,IAAkB,EAClB,aAAsB,EACtB,EAAE;IACF,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,GAAG,IAAI,CAAC,OAAO;QACf,SAAS,EAAE,YAAY,EAAE;KAC1B,CAAC,CAAA;IACF,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAAE;QAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CACrB;QAAC,MAA6B,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IACF,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;IAC5C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IACpB,MAAM,CAAC,yBAAyB,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACnD,KAAK,OAAO,CACV,MAAM,CAAC,OAAO,CACZ,MAAM,uBAAuB,CAAC;QAC5B,aAAa;QACb,WAAW;QACX,MAAM;KACP,CAAC,CACH,CACF,CAAA;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA","sourcesContent":["import type { VltServerListening } from '@vltpkg/server'\nimport { createServer } from '@vltpkg/server'\nimport { urlOpen } from '@vltpkg/url-open'\nimport type { PathScurry } from 'path-scurry'\nimport type { LoadedConfig } from './config/index.ts'\nimport { stdout } from './output.ts'\nimport { resolve } from 'node:path'\n\nexport const getDefaultStartingRoute = async (options: {\n startingRoute?: string\n projectRoot: string\n scurry: PathScurry\n}) => {\n const { startingRoute, projectRoot, scurry } = options\n if (startingRoute) return startingRoute\n const stat = await scurry.lstat(`${projectRoot}/package.json`)\n return stat?.isFile() && !stat.isSymbolicLink() ?\n `/explore?query=${encodeURIComponent(':root')}`\n : '/'\n}\n\nconst getAssetsDir = () => {\n /* c8 ignore start */\n if (process.env.__VLT_INTERNAL_GUI_ASSETS_DIR) {\n return resolve(\n import.meta.dirname,\n process.env.__VLT_INTERNAL_GUI_ASSETS_DIR,\n )\n }\n /* c8 ignore stop */\n}\n\nexport const startGUI = async (\n conf: LoadedConfig,\n startingRoute?: string,\n) => {\n const server = createServer({\n ...conf.options,\n assetsDir: getAssetsDir(),\n })\n server.on('needConfigUpdate', dir => {\n conf.resetOptions(dir)\n ;(server as VltServerListening).updateOptions(conf.options)\n })\n const { projectRoot, scurry } = conf.options\n await server.start()\n stdout(`⚡️ vlt GUI running at ${server.address()}`)\n void urlOpen(\n server.address(\n await getDefaultStartingRoute({\n startingRoute,\n projectRoot,\n scurry,\n }),\n ),\n )\n return server\n}\n"]}
1
+ {"version":3,"file":"start-gui.js","sourceRoot":"","sources":["../../src/start-gui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,QAAQ,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAKpC,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,OAK7C,EAAE,EAAE;IACH,MAAM,EACJ,WAAW,GAAG,OAAO,EACrB,aAAa,EACb,WAAW,EACX,MAAM,GACP,GAAG,OAAO,CAAA;IACX,IAAI,aAAa;QAAE,OAAO,aAAa,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,eAAe,CAAC,CAAA;IAC9D,OAAO,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7C,YAAY,QAAQ,CAAC,6BAA6B,CAAC,WAAW,CAAC,WAAW;QAC5E,CAAC,CAAC,GAAG,CAAA;AACT,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,GAAG,EAAE;IACxB,qBAAqB;IACrB,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;QAC9C,OAAO,OAAO,CACZ,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAC1C,CAAA;IACH,CAAC;IACD,oBAAoB;AACtB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,IAAkB,EAClB,aAAsB,EACtB,EAAE;IACF,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,GAAG,IAAI,CAAC,OAAO;QACf,SAAS,EAAE,YAAY,EAAE;KAC1B,CAAC,CAAA;IACF,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAAE;QAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CACrB;QAAC,MAA6B,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IACF,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;IAC5C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IACpB,MAAM,CAAC,yBAAyB,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACnD,KAAK,OAAO,CACV,MAAM,CAAC,OAAO,CACZ,MAAM,uBAAuB,CAAC;QAC5B,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QAC/B,aAAa;QACb,WAAW;QACX,MAAM;KACP,CAAC,CACH,CACF,CAAA;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA","sourcesContent":["import { resolve } from 'node:path'\nimport LZString from 'lz-string'\nimport { createServer } from '@vltpkg/server'\nimport { urlOpen } from '@vltpkg/url-open'\nimport { stdout } from './output.ts'\nimport type { PathScurry } from 'path-scurry'\nimport type { LoadedConfig } from './config/index.ts'\nimport type { VltServerListening } from '@vltpkg/server'\n\nexport const getDefaultStartingRoute = async (options: {\n queryString?: string\n startingRoute?: string\n projectRoot: string\n scurry: PathScurry\n}) => {\n const {\n queryString = ':root',\n startingRoute,\n projectRoot,\n scurry,\n } = options\n if (startingRoute) return startingRoute\n const stat = await scurry.lstat(`${projectRoot}/package.json`)\n return stat?.isFile() && !stat.isSymbolicLink() ?\n `/explore/${LZString.compressToEncodedURIComponent(queryString)}/overview`\n : '/'\n}\n\nconst getAssetsDir = () => {\n /* c8 ignore start */\n if (process.env.__VLT_INTERNAL_GUI_ASSETS_DIR) {\n return resolve(\n import.meta.dirname,\n process.env.__VLT_INTERNAL_GUI_ASSETS_DIR,\n )\n }\n /* c8 ignore stop */\n}\n\nexport const startGUI = async (\n conf: LoadedConfig,\n startingRoute?: string,\n) => {\n const server = createServer({\n ...conf.options,\n assetsDir: getAssetsDir(),\n })\n server.on('needConfigUpdate', dir => {\n conf.resetOptions(dir)\n ;(server as VltServerListening).updateOptions(conf.options)\n })\n const { projectRoot, scurry } = conf.options\n await server.start()\n stdout(`⚡️ vlt GUI running at ${server.address()}`)\n void urlOpen(\n server.address(\n await getDefaultStartingRoute({\n queryString: conf.values.target,\n startingRoute,\n projectRoot,\n scurry,\n }),\n ),\n )\n return server\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vltpkg/cli-sdk",
3
3
  "description": "The source for the vlt CLI",
4
- "version": "0.0.0-15",
4
+ "version": "0.0.0-17",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/vltpkg/vltpkg.git",
@@ -27,40 +27,46 @@
27
27
  "ink": "^5.2.1",
28
28
  "ink-spinner": "^5.0.0",
29
29
  "jackspeak": "^4.1.1",
30
+ "lz-string": "^1.5.0",
31
+ "minimatch": "^10.0.1",
30
32
  "package-json-from-dist": "^1.0.1",
31
33
  "path-scurry": "^2.0.0",
32
34
  "pretty-bytes": "^6.1.1",
33
35
  "react": "^18.3.1",
34
36
  "react-devtools-core": "^4.28.5",
37
+ "ssri": "^12.0.0",
35
38
  "supports-color": "^10.0.0",
36
- "@vltpkg/dep-id": "0.0.0-15",
37
- "@vltpkg/error-cause": "0.0.0-15",
38
- "@vltpkg/dot-prop": "0.0.0-15",
39
- "@vltpkg/graph": "0.0.0-15",
40
- "@vltpkg/output": "0.0.0-15",
41
- "@vltpkg/init": "0.0.0-15",
42
- "@vltpkg/package-json": "0.0.0-15",
43
- "@vltpkg/package-info": "0.0.0-15",
44
- "@vltpkg/query": "0.0.0-15",
45
- "@vltpkg/registry-client": "0.0.0-15",
46
- "@vltpkg/run": "0.0.0-15",
47
- "@vltpkg/security-archive": "0.0.0-15",
48
- "@vltpkg/server": "0.0.0-15",
49
- "@vltpkg/rollback-remove": "0.0.0-15",
50
- "@vltpkg/spec": "0.0.0-15",
51
- "@vltpkg/url-open": "0.0.0-15",
52
- "@vltpkg/vlt-json": "0.0.0-15",
53
- "@vltpkg/xdg": "0.0.0-15",
54
- "@vltpkg/vlx": "0.0.0-15",
55
- "@vltpkg/types": "0.0.0-15",
56
- "@vltpkg/workspaces": "0.0.0-15"
39
+ "tar": "^7.4.3",
40
+ "@vltpkg/dep-id": "0.0.0-17",
41
+ "@vltpkg/dot-prop": "0.0.0-17",
42
+ "@vltpkg/git": "0.0.0-17",
43
+ "@vltpkg/graph": "0.0.0-17",
44
+ "@vltpkg/error-cause": "0.0.0-17",
45
+ "@vltpkg/package-info": "0.0.0-17",
46
+ "@vltpkg/output": "0.0.0-17",
47
+ "@vltpkg/package-json": "0.0.0-17",
48
+ "@vltpkg/registry-client": "0.0.0-17",
49
+ "@vltpkg/query": "0.0.0-17",
50
+ "@vltpkg/rollback-remove": "0.0.0-17",
51
+ "@vltpkg/init": "0.0.0-17",
52
+ "@vltpkg/run": "0.0.0-17",
53
+ "@vltpkg/security-archive": "0.0.0-17",
54
+ "@vltpkg/server": "0.0.0-17",
55
+ "@vltpkg/spec": "0.0.0-17",
56
+ "@vltpkg/types": "0.0.0-17",
57
+ "@vltpkg/url-open": "0.0.0-17",
58
+ "@vltpkg/workspaces": "0.0.0-17",
59
+ "@vltpkg/xdg": "0.0.0-17",
60
+ "@vltpkg/vlt-json": "0.0.0-17",
61
+ "@vltpkg/vlx": "0.0.0-17"
57
62
  },
58
63
  "devDependencies": {
59
64
  "@eslint/js": "^9.28.0",
60
65
  "@types/node": "^22.15.29",
61
66
  "@types/react": "^18.3.23",
67
+ "@types/ssri": "^7.1.5",
62
68
  "eslint": "^9.28.0",
63
- "prettier": "^3.5.3",
69
+ "prettier": "^3.6.0",
64
70
  "tap": "^21.1.0",
65
71
  "tshy": "^3.0.2",
66
72
  "typedoc": "~0.27.9",