@vltpkg/cli-sdk 0.0.0-3 → 0.0.0-5
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/README.md +3 -0
- package/dist/esm/commands/gui.d.ts.map +1 -1
- package/dist/esm/commands/gui.js +1 -2
- package/dist/esm/commands/gui.js.map +1 -1
- package/dist/esm/commands/list.d.ts +1 -1
- package/dist/esm/commands/list.d.ts.map +1 -1
- package/dist/esm/commands/list.js +1 -4
- package/dist/esm/commands/list.js.map +1 -1
- 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 +1 -4
- package/dist/esm/commands/query.js.map +1 -1
- package/dist/esm/commands/uninstall.d.ts +4 -1
- package/dist/esm/commands/uninstall.d.ts.map +1 -1
- package/dist/esm/commands/uninstall.js +7 -1
- package/dist/esm/commands/uninstall.js.map +1 -1
- package/dist/esm/output.d.ts.map +1 -1
- package/dist/esm/output.js +3 -1
- package/dist/esm/output.js.map +1 -1
- package/dist/esm/start-gui.d.ts +6 -33
- package/dist/esm/start-gui.d.ts.map +1 -1
- package/dist/esm/start-gui.js +22 -350
- package/dist/esm/start-gui.js.map +1 -1
- package/package.json +21 -20
- package/dist/esm/ignored-homedir-folder-names.d.ts +0 -7
- package/dist/esm/ignored-homedir-folder-names.d.ts.map +0 -1
- package/dist/esm/ignored-homedir-folder-names.js +0 -35
- package/dist/esm/ignored-homedir-folder-names.js.map +0 -1
- package/dist/esm/project-info.d.ts +0 -32
- package/dist/esm/project-info.d.ts.map +0 -1
- package/dist/esm/project-info.js +0 -90
- package/dist/esm/project-info.js.map +0 -1
- package/dist/esm/read-project-folders.d.ts +0 -27
- package/dist/esm/read-project-folders.d.ts.map +0 -1
- package/dist/esm/read-project-folders.js +0 -66
- package/dist/esm/read-project-folders.js.map +0 -1
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gui.d.ts","sourceRoot":"","sources":["../../../src/commands/gui.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAGxC,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"gui.d.ts","sourceRoot":"","sources":["../../../src/commands/gui.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAGxC,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,IAAI,CAE9B,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,YAKhB,CAAA;AAEJ,eAAO,MAAM,OAAO,EAAE,SAA4B,CAAA"}
|
package/dist/esm/commands/gui.js
CHANGED
|
@@ -2,8 +2,7 @@ import { commandUsage } from "../config/usage.js";
|
|
|
2
2
|
import { startGUI } from "../start-gui.js";
|
|
3
3
|
// this command is only a view, it doesn't actually do anything at this time
|
|
4
4
|
export const views = async (_, __, conf) => {
|
|
5
|
-
await startGUI(
|
|
6
|
-
return '';
|
|
5
|
+
await startGUI(conf);
|
|
7
6
|
};
|
|
8
7
|
export const usage = () => commandUsage({
|
|
9
8
|
command: 'gui',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gui.js","sourceRoot":"","sources":["../../../src/commands/gui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG1C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,KAAK,GAAiB,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IACvD,MAAM,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"gui.js","sourceRoot":"","sources":["../../../src/commands/gui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG1C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,KAAK,GAAiB,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IACvD,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAA;AACtB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAiB,GAAG,EAAE,CACtC,YAAY,CAAC;IACX,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,gDAAgD;CAC9D,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,OAAO,GAAc,KAAK,IAAI,EAAE,CAAC,IAAI,CAAA","sourcesContent":["import { commandUsage } from '../config/usage.ts'\nimport type { CommandFn, CommandUsage } from '../index.ts'\nimport { startGUI } from '../start-gui.ts'\nimport type { ViewFn } from '../view.ts'\n\n// this command is only a view, it doesn't actually do anything at this time\nexport const views: ViewFn<null> = async (_, __, conf) => {\n await startGUI(conf)\n}\n\nexport const usage: CommandUsage = () =>\n commandUsage({\n command: 'gui',\n usage: '',\n description: 'Launch a graphical user interface in a browser',\n })\n\nexport const command: CommandFn = async () => null\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { humanReadableOutput, jsonOutput, mermaidOutput } from '@vltpkg/graph';
|
|
2
1
|
import type { HumanReadableOutputGraph, JSONOutputGraph, MermaidOutputGraph } from '@vltpkg/graph';
|
|
2
|
+
import { humanReadableOutput, jsonOutput, mermaidOutput } from '@vltpkg/graph';
|
|
3
3
|
import type { CommandFn, CommandUsage } from '../index.ts';
|
|
4
4
|
export declare const usage: CommandUsage;
|
|
5
5
|
export type ListResult = JSONOutputGraph & MermaidOutputGraph & HumanReadableOutputGraph & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAEnB,MAAM,eAAe,CAAA;AACtB,OAAO,EAEL,mBAAmB,EACnB,UAAU,EACV,aAAa,EACd,MAAM,eAAe,CAAA;AAGtB,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI1D,eAAO,MAAM,KAAK,EAAE,YAkChB,CAAA;AAEJ,MAAM,MAAM,UAAU,GAAG,eAAe,GACtC,kBAAkB,GAClB,wBAAwB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpD,eAAO,MAAM,KAAK;;;;;CAUoB,CAAA;AAEtC,eAAO,MAAM,OAAO,EAAE,SAAS,CAAC,UAAU,CAwDzC,CAAA"}
|
|
@@ -37,10 +37,7 @@ export const views = {
|
|
|
37
37
|
mermaid: mermaidOutput,
|
|
38
38
|
human: humanReadableOutput,
|
|
39
39
|
gui: async ({ queryString }, _, conf) => {
|
|
40
|
-
await startGUI(
|
|
41
|
-
conf,
|
|
42
|
-
startingRoute: '/explore?query=' + encodeURIComponent(queryString),
|
|
43
|
-
});
|
|
40
|
+
await startGUI(conf, '/explore?query=' + encodeURIComponent(queryString));
|
|
44
41
|
},
|
|
45
42
|
};
|
|
46
43
|
export const command = async (conf) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"
|
|
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 { 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: ['', '<query> --view=[human | json | mermaid | gui]'],\n description: `List installed dependencies matching the provided query.\n Defaults to listing direct dependencies of a project and\n any configured 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 query = new Query({ graph, specOptions: conf.options })\n const projectQueryString = ':project, :project > *'\n const selectImporters: string[] = []\n\n const importers = new Set<Node>()\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 }\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\n return {\n importers,\n edges,\n nodes,\n queryString: queryString || defaultQueryString,\n highlightSelection: !!queryString,\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { humanReadableOutput, jsonOutput, mermaidOutput } from '@vltpkg/graph';
|
|
2
1
|
import type { HumanReadableOutputGraph, JSONOutputGraph, MermaidOutputGraph } from '@vltpkg/graph';
|
|
2
|
+
import { humanReadableOutput, jsonOutput, mermaidOutput } from '@vltpkg/graph';
|
|
3
3
|
import type { CommandFn, CommandUsage } from '../index.ts';
|
|
4
4
|
export declare const usage: CommandUsage;
|
|
5
5
|
type QueryResult = JSONOutputGraph & MermaidOutputGraph & HumanReadableOutputGraph & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAEnB,MAAM,eAAe,CAAA;AACtB,OAAO,EAEL,mBAAmB,EACnB,UAAU,EACV,aAAa,EACd,MAAM,eAAe,CAAA;AAGtB,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI1D,eAAO,MAAM,KAAK,EAAE,YA6BhB,CAAA;AAEJ,KAAK,WAAW,GAAG,eAAe,GAChC,kBAAkB,GAClB,wBAAwB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpD,eAAO,MAAM,KAAK;;;;;CAUqB,CAAA;AAEvC,eAAO,MAAM,OAAO,EAAE,SAAS,CAAC,WAAW,CAuC1C,CAAA"}
|
|
@@ -32,10 +32,7 @@ export const views = {
|
|
|
32
32
|
mermaid: mermaidOutput,
|
|
33
33
|
human: humanReadableOutput,
|
|
34
34
|
gui: async ({ queryString }, _, conf) => {
|
|
35
|
-
await startGUI(
|
|
36
|
-
conf,
|
|
37
|
-
startingRoute: '/explore?query=' + encodeURIComponent(queryString),
|
|
38
|
-
});
|
|
35
|
+
await startGUI(conf, '/explore?query=' + encodeURIComponent(queryString));
|
|
39
36
|
},
|
|
40
37
|
};
|
|
41
38
|
export const command = async (conf) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/commands/query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/commands/query.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 { 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: 'query',\n usage: ['', '<query> --view=[human | json | mermaid | gui]'],\n description:\n 'List installed dependencies matching the provided query.',\n examples: {\n [`'#foo'`]: {\n description: 'Query packages with the name \"foo\"',\n },\n [`'*.workspace > *.peer'`]: {\n description: 'Query all peer dependencies of workspaces',\n },\n [`':project > *:attr(scripts, [build])'`]: {\n description:\n 'Query all direct project dependencies with a \"build\" script',\n },\n [`'[name^=\"@vltpkg\"]'`]: {\n description:\n 'Query packages with names starting with \"@vltpkg\"',\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\ntype QueryResult = 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<QueryResult>\n\nexport const command: CommandFn<QueryResult> = 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 defaultQueryString = '*'\n const queryString = conf.positionals[0]\n const query = new Query({ graph, specOptions: conf.options })\n const { edges, nodes } = await query.search(\n queryString || defaultQueryString,\n )\n\n const importers = new Set<Node>()\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) importers.add(w)\n }\n }\n if (importers.size === 0) {\n for (const importer of graph.importers) {\n importers.add(importer)\n }\n }\n\n return {\n importers,\n edges,\n nodes,\n highlightSelection: !!queryString,\n queryString: queryString || defaultQueryString,\n }\n}\n"]}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import type { Graph } from '@vltpkg/graph';
|
|
1
2
|
import type { CommandFn, CommandUsage } from '../index.ts';
|
|
3
|
+
import type { Views } from '../view.ts';
|
|
2
4
|
export declare const usage: CommandUsage;
|
|
3
|
-
export declare const
|
|
5
|
+
export declare const views: Views<Graph>;
|
|
6
|
+
export declare const command: CommandFn<Graph>;
|
|
4
7
|
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/uninstall.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/uninstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,eAAO,MAAM,KAAK,EAAE,YAMhB,CAAA;AAEJ,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAG9B,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,SAAS,CAAC,KAAK,CAKpC,CAAA"}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { uninstall } from '@vltpkg/graph';
|
|
2
2
|
import { commandUsage } from "../config/usage.js";
|
|
3
3
|
import { parseRemoveArgs } from "../parse-add-remove-args.js";
|
|
4
|
+
import { InstallReporter } from "./install/reporter.js";
|
|
4
5
|
export const usage = () => commandUsage({
|
|
5
6
|
command: 'uninstall',
|
|
6
7
|
usage: '[package ...]',
|
|
7
8
|
description: `The opposite of \`vlt install\`. Removes deps and updates
|
|
8
9
|
vlt-lock.json and package.json appropriately.`,
|
|
9
10
|
});
|
|
11
|
+
export const views = {
|
|
12
|
+
json: g => g.toJSON(),
|
|
13
|
+
human: InstallReporter,
|
|
14
|
+
};
|
|
10
15
|
export const command = async (conf) => {
|
|
11
16
|
const monorepo = conf.options.monorepo;
|
|
12
17
|
const { remove } = parseRemoveArgs(conf, monorepo);
|
|
13
|
-
await uninstall(conf.options, remove);
|
|
18
|
+
const { graph } = await uninstall(conf.options, remove);
|
|
19
|
+
return graph;
|
|
14
20
|
};
|
|
15
21
|
//# sourceMappingURL=uninstall.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGvD,MAAM,CAAC,MAAM,KAAK,GAAiB,GAAG,EAAE,CACtC,YAAY,CAAC;IACX,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,eAAe;IACtB,WAAW,EAAE;gEAC+C;CAC7D,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,KAAK,GAAiB;IACjC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;IACrB,KAAK,EAAE,eAAe;CACvB,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAqB,KAAK,EAAC,IAAI,EAAC,EAAE;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAA;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAClD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACvD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { uninstall } from '@vltpkg/graph'\nimport type { Graph } from '@vltpkg/graph'\nimport { commandUsage } from '../config/usage.ts'\nimport type { CommandFn, CommandUsage } from '../index.ts'\nimport { parseRemoveArgs } from '../parse-add-remove-args.ts'\nimport { InstallReporter } from './install/reporter.ts'\nimport type { Views } from '../view.ts'\n\nexport const usage: CommandUsage = () =>\n commandUsage({\n command: 'uninstall',\n usage: '[package ...]',\n description: `The opposite of \\`vlt install\\`. Removes deps and updates\n vlt-lock.json and package.json appropriately.`,\n })\n\nexport const views: Views<Graph> = {\n json: g => g.toJSON(),\n human: InstallReporter,\n}\n\nexport const command: CommandFn<Graph> = async conf => {\n const monorepo = conf.options.monorepo\n const { remove } = parseRemoveArgs(conf, monorepo)\n const { graph } = await uninstall(conf.options, remove)\n return graph\n}\n"]}
|
package/dist/esm/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAK5C,eAAO,MAAM,MAAM,YAAa,OAAO,EAAE,SAAyB,CAAA;AAElE,eAAO,MAAM,MAAM,YAAa,OAAO,EAAE,SAA2B,CAAA;AAGpE,eAAO,MAAM,OAAO,GAAI,CAAC,QACjB,YAAY,UACV,KAAK,CAAC,CAAC,CAAC,KACf,IAAI,CAAC,CAAC,CAmBR,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,QACnB,YAAY,UACV,KAAK,CAAC,CAAC,CAAC,cACL;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,KAC3B;IACD,MAAM,EAAE,CACN,MAAM,EAAE,CAAC,KACN,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAAA;IACrD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CAgCjC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAU,CAAC,cACvB,OAAO,CAAC,CAAC,CAAC,QAChB,YAAY,cACP;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,kBAqB7B,CAAA"}
|
package/dist/esm/output.js
CHANGED
|
@@ -47,9 +47,11 @@ export const startView = (conf, views, { start } = { start: Date.now() }) => {
|
|
|
47
47
|
else {
|
|
48
48
|
return {
|
|
49
49
|
async onDone(r) {
|
|
50
|
-
if (r === undefined
|
|
50
|
+
if (r === undefined)
|
|
51
51
|
return;
|
|
52
52
|
const res = await View(r, opts, conf);
|
|
53
|
+
if (res === undefined)
|
|
54
|
+
return;
|
|
53
55
|
return conf.values.view === 'json' ?
|
|
54
56
|
JSON.stringify(res, null, 2)
|
|
55
57
|
: formatWithOptions({
|
package/dist/esm/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAGpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/output.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk'\nimport { formatWithOptions } from 'node:util'\nimport { defaultView } from './config/definition.ts'\nimport type { LoadedConfig } from './config/index.ts'\nimport type { Command } from './index.ts'\nimport { printErr } from './print-err.ts'\nimport type { View, Views } from './view.ts'\nimport { isViewClass } from './view.ts'\n\n// TODO: make these have log levels etc\n// eslint-disable-next-line no-console\nexport const stdout = (...args: unknown[]) => console.log(...args)\n// eslint-disable-next-line no-console\nexport const stderr = (...args: unknown[]) => console.error(...args)\n\nconst identity = <T>(x: T): T => x\nexport const getView = <T>(\n conf: LoadedConfig,\n views?: Views<T>,\n): View<T> => {\n const viewName = conf.values.view\n\n const viewFn =\n viewName === 'inspect' ? identity\n : typeof views === 'function' ? views\n : views && typeof views === 'object' ? views[viewName]\n : identity\n\n // if the user specified a view that doesn't exist,\n // then set it back to the default, and try again.\n // This will fall back to identity if it's also missing.\n if (!viewFn && conf.values.view !== defaultView) {\n conf.values.view = defaultView\n process.env.VLT_VIEW = defaultView\n return getView(conf, views)\n }\n\n return viewFn ?? identity\n}\n\n/**\n * If the view is a View class, then instantiate and start it.\n * If it's a view function, then just define the onDone method.\n */\nexport const startView = <T>(\n conf: LoadedConfig,\n views?: Views<T>,\n { start }: { start: number } = { start: Date.now() },\n): {\n onDone: (\n result: T,\n ) => Promise<string | undefined> | string | undefined\n onError?: (err: unknown) => void\n} => {\n const View = getView<T>(conf, views)\n const opts = { colors: conf.values.color ? chalk : undefined }\n if (isViewClass(View)) {\n const view = new View(opts, conf)\n view.start()\n return {\n onDone(r) {\n return view.done(r, { time: Date.now() - start })\n },\n onError(err) {\n view.error(err)\n },\n }\n } else {\n return {\n async onDone(r): Promise<string | undefined> {\n if (r === undefined) return\n const res = await View(r, opts, conf)\n if (res === undefined) return\n return conf.values.view === 'json' ?\n JSON.stringify(res, null, 2)\n : formatWithOptions(\n {\n colors: conf.values.color,\n },\n res,\n )\n },\n }\n }\n}\n\n/**\n * Main export. Run the command appropriately, displaying output using\n * the user-requested view, or the default if the user requested a view\n * that is not defined for this command.\n */\nexport const outputCommand = async <T>(\n cliCommand: Command<T>,\n conf: LoadedConfig,\n { start }: { start: number } = { start: Date.now() },\n) => {\n const { usage, views, command } = cliCommand\n if (conf.get('help')) {\n return stdout(usage().usage())\n }\n const { onDone, onError } = startView(conf, views, { start })\n\n try {\n const output = await onDone(await command(conf))\n if (output !== undefined) {\n stdout(output)\n }\n } catch (err) {\n onError?.(err)\n process.exitCode ||= 1\n\n printErr(err, usage, stderr)\n\n process.exit(process.exitCode)\n }\n}\n"]}
|
package/dist/esm/start-gui.d.ts
CHANGED
|
@@ -1,36 +1,9 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { PackageJson } from '@vltpkg/package-json';
|
|
3
|
-
import type { SpecOptions } from '@vltpkg/spec';
|
|
4
|
-
import type { DependencyTypeShort } from '@vltpkg/types';
|
|
5
|
-
import type { IncomingMessage, Server, ServerResponse } from 'node:http';
|
|
6
|
-
import type { PathBase, PathScurry } from 'path-scurry';
|
|
1
|
+
import type { PathScurry } from 'path-scurry';
|
|
7
2
|
import type { LoadedConfig } from './config/index.ts';
|
|
8
|
-
|
|
9
|
-
export type GUIInstallOptions = Record<string, Record<string, {
|
|
10
|
-
version: string;
|
|
11
|
-
type: DependencyTypeShort;
|
|
12
|
-
}>>;
|
|
13
|
-
export type GUIUninstallOptions = Record<string, Set<string>>;
|
|
14
|
-
export type StartGUIOptions = {
|
|
15
|
-
assetsDir?: string;
|
|
16
|
-
conf: LoadedConfig;
|
|
17
|
-
port?: number;
|
|
3
|
+
export declare const getDefaultStartingRoute: (options: {
|
|
18
4
|
startingRoute?: string;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
readablePath: string;
|
|
24
|
-
};
|
|
25
|
-
export type DashboardData = {
|
|
26
|
-
cwd: string;
|
|
27
|
-
buildVersion: string;
|
|
28
|
-
dashboardProjectLocations: DashboardLocation[];
|
|
29
|
-
defaultAuthor: string;
|
|
30
|
-
projects: DashboardProjectData[];
|
|
31
|
-
};
|
|
32
|
-
export declare const parseInstallOptions: (options: InstallOptions & SpecOptions, args: GUIInstallOptions) => [InstallOptions, AddImportersDependenciesMap];
|
|
33
|
-
export declare const parseUninstallOptions: (options: UninstallOptions, args: GUIUninstallOptions) => [UninstallOptions, RemoveImportersDependenciesMap];
|
|
34
|
-
export declare const formatDashboardJson: (projectFolders: PathBase[], dashboardRoot: string[], scurry: PathScurry, packageJson: PackageJson) => Promise<DashboardData>;
|
|
35
|
-
export declare const startGUI: ({ conf, assetsDir, port, startingRoute, tmpDir, }: StartGUIOptions) => Promise<Server<typeof IncomingMessage, typeof ServerResponse>>;
|
|
5
|
+
projectRoot: string;
|
|
6
|
+
scurry: PathScurry;
|
|
7
|
+
}) => Promise<string>;
|
|
8
|
+
export declare const startGUI: (conf: LoadedConfig, startingRoute?: string) => Promise<import("@vltpkg/server").VltServer>;
|
|
36
9
|
//# sourceMappingURL=start-gui.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-gui.d.ts","sourceRoot":"","sources":["../../src/start-gui.ts"],"names":[],"mappings":"
|
|
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;AAGrD,eAAO,MAAM,uBAAuB,YAAmB;IACrD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,UAAU,CAAA;CACnB,oBAOA,CAAA;AAED,eAAO,MAAM,QAAQ,SACb,YAAY,kBACF,MAAM,gDAoBvB,CAAA"}
|
package/dist/esm/start-gui.js
CHANGED
|
@@ -1,357 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getUser } from '@vltpkg/git';
|
|
3
|
-
import { actual, asDependency, install, uninstall, } from '@vltpkg/graph';
|
|
4
|
-
import { getAuthorFromGitUser, init } from '@vltpkg/init';
|
|
5
|
-
import { Spec } from '@vltpkg/spec';
|
|
1
|
+
import { createServer } from '@vltpkg/server';
|
|
6
2
|
import { urlOpen } from '@vltpkg/url-open';
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
import { loadPackageJson } from 'package-json-from-dist';
|
|
14
|
-
import handler from 'serve-handler';
|
|
15
|
-
import { stderr, stdout } from "./output.js";
|
|
16
|
-
import { getDashboardProjectData, getGraphProjectData, getReadablePath, } from "./project-info.js";
|
|
17
|
-
import { readProjectFolders } from "./read-project-folders.js";
|
|
18
|
-
const HOST = 'localhost';
|
|
19
|
-
const PORT = 7017;
|
|
20
|
-
const { version } = loadPackageJson(import.meta.filename, process.env.__VLT_INTERNAL_CLI_PACKAGE_JSON);
|
|
21
|
-
class AddImportersDependenciesMapImpl extends Map {
|
|
22
|
-
modifiedDependencies = false;
|
|
23
|
-
}
|
|
24
|
-
class RemoveImportersDependenciesMapImpl extends Map {
|
|
25
|
-
modifiedDependencies = false;
|
|
26
|
-
}
|
|
27
|
-
export const parseInstallOptions = (options, args) => {
|
|
28
|
-
const addArgs = new AddImportersDependenciesMapImpl();
|
|
29
|
-
for (const [importerId, deps] of Object.entries(args)) {
|
|
30
|
-
const depMap = new Map();
|
|
31
|
-
for (const [name, { version, type }] of Object.entries(deps)) {
|
|
32
|
-
depMap.set(name, asDependency({
|
|
33
|
-
spec: Spec.parse(name, version, options),
|
|
34
|
-
type,
|
|
35
|
-
}));
|
|
36
|
-
addArgs.modifiedDependencies = true;
|
|
37
|
-
}
|
|
38
|
-
addArgs.set(asDepID(importerId), depMap);
|
|
39
|
-
}
|
|
40
|
-
return [options, addArgs];
|
|
41
|
-
};
|
|
42
|
-
export const parseUninstallOptions = (options, args) => {
|
|
43
|
-
const removeArgs = new RemoveImportersDependenciesMapImpl();
|
|
44
|
-
for (const [importerId, deps] of Object.entries(args)) {
|
|
45
|
-
const depMap = new Set();
|
|
46
|
-
for (const name of deps) {
|
|
47
|
-
depMap.add(name);
|
|
48
|
-
}
|
|
49
|
-
removeArgs.set(asDepID(importerId), depMap);
|
|
50
|
-
removeArgs.modifiedDependencies = true;
|
|
51
|
-
}
|
|
52
|
-
return [options, removeArgs];
|
|
53
|
-
};
|
|
54
|
-
export const formatDashboardJson = async (projectFolders, dashboardRoot, scurry, packageJson) => {
|
|
55
|
-
const userDefinedProjectPaths = (dashboardRoot.length ? dashboardRoot : [homedir()]).map(path => ({
|
|
56
|
-
path,
|
|
57
|
-
readablePath: getReadablePath(path),
|
|
58
|
-
}));
|
|
59
|
-
const result = {
|
|
60
|
-
cwd: process.cwd(),
|
|
61
|
-
buildVersion: version,
|
|
62
|
-
dashboardProjectLocations: projectFolders
|
|
63
|
-
.map((dir) => {
|
|
64
|
-
const path = dirname(dir.fullpath());
|
|
65
|
-
const res = {
|
|
66
|
-
path,
|
|
67
|
-
readablePath: getReadablePath(path),
|
|
68
|
-
};
|
|
69
|
-
return res;
|
|
70
|
-
})
|
|
71
|
-
.concat(userDefinedProjectPaths)
|
|
72
|
-
.reduce((acc, curr) => {
|
|
73
|
-
if (acc.every(obj => obj.path !== curr.path)) {
|
|
74
|
-
acc.push(curr);
|
|
75
|
-
}
|
|
76
|
-
return acc;
|
|
77
|
-
}, [])
|
|
78
|
-
.sort((a, b) => a.readablePath.length - b.readablePath.length),
|
|
79
|
-
defaultAuthor: getAuthorFromGitUser(await getUser().catch(() => undefined)),
|
|
80
|
-
projects: [],
|
|
81
|
-
};
|
|
82
|
-
for (const folder of projectFolders) {
|
|
83
|
-
const projectData = getDashboardProjectData(folder, {
|
|
84
|
-
scurry,
|
|
85
|
-
packageJson,
|
|
86
|
-
});
|
|
87
|
-
if (projectData) {
|
|
88
|
-
result.projects.push(projectData);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return result;
|
|
92
|
-
};
|
|
93
|
-
const updateGraphData = (tmp, options, hasDashboard) => {
|
|
94
|
-
const { packageJson, projectRoot, scurry } = options;
|
|
95
|
-
const mainManifest = packageJson.read(projectRoot);
|
|
96
|
-
const graph = actual.load({
|
|
97
|
-
...options,
|
|
98
|
-
mainManifest,
|
|
99
|
-
loadManifests: true,
|
|
100
|
-
});
|
|
101
|
-
const importers = [...graph.importers];
|
|
102
|
-
const folder = scurry.lstatSync(projectRoot);
|
|
103
|
-
const graphJson = JSON.stringify({
|
|
104
|
-
hasDashboard,
|
|
105
|
-
importers,
|
|
106
|
-
lockfile: graph,
|
|
107
|
-
projectInfo: getGraphProjectData({ packageJson, scurry }, folder),
|
|
108
|
-
}, null, 2);
|
|
109
|
-
rmSync(resolve(tmp, 'graph.json'), { force: true });
|
|
110
|
-
writeFileSync(resolve(tmp, 'graph.json'), graphJson);
|
|
111
|
-
};
|
|
112
|
-
const updateDashboardData = async (tmp, options) => {
|
|
113
|
-
const { 'dashboard-root': userDefinedProjectPaths = [], scurry, packageJson, } = options;
|
|
114
|
-
const dashboard = await formatDashboardJson(await readProjectFolders({
|
|
115
|
-
scurry,
|
|
116
|
-
userDefinedProjectPaths,
|
|
117
|
-
}), userDefinedProjectPaths, scurry, packageJson);
|
|
118
|
-
const dashboardJson = JSON.stringify(dashboard, null, 2);
|
|
119
|
-
writeFileSync(resolve(tmp, 'dashboard.json'), dashboardJson);
|
|
120
|
-
return dashboard.projects.length > 0;
|
|
121
|
-
};
|
|
122
|
-
const getDefaultStartingRoute = (options) => {
|
|
123
|
-
const { projectRoot, scurry } = options;
|
|
124
|
-
const stat = scurry.lstatSync(`${projectRoot}/package.json`);
|
|
3
|
+
import { stdout } from "./output.js";
|
|
4
|
+
export const getDefaultStartingRoute = async (options) => {
|
|
5
|
+
const { startingRoute, projectRoot, scurry } = options;
|
|
6
|
+
if (startingRoute)
|
|
7
|
+
return startingRoute;
|
|
8
|
+
const stat = await scurry.lstat(`${projectRoot}/package.json`);
|
|
125
9
|
return stat?.isFile() && !stat.isSymbolicLink() ?
|
|
126
10
|
`/explore?query=${encodeURIComponent(':root')}`
|
|
127
|
-
: '/
|
|
128
|
-
};
|
|
129
|
-
/* c8 ignore start */
|
|
130
|
-
const createStaticHandler = ({ assetsDir, publicDir, }) => {
|
|
131
|
-
const opts = {
|
|
132
|
-
cleanUrls: true,
|
|
133
|
-
public: publicDir,
|
|
134
|
-
rewrites: [
|
|
135
|
-
{ source: '/', destination: '/index.html' },
|
|
136
|
-
{ source: '/error', destination: '/index.html' },
|
|
137
|
-
{ source: '/explore', destination: '/index.html' },
|
|
138
|
-
{ source: '/dashboard', destination: '/index.html' },
|
|
139
|
-
{ source: '/queries', destination: '/index.html' },
|
|
140
|
-
{ source: '/labels', destination: '/index.html' },
|
|
141
|
-
{ source: '/new-project', destination: '/index.html' },
|
|
142
|
-
],
|
|
143
|
-
};
|
|
144
|
-
const errHandler = (err, res) => {
|
|
145
|
-
stderr(err);
|
|
146
|
-
res.statusCode = 500;
|
|
147
|
-
res.end('Internal server error');
|
|
148
|
-
};
|
|
149
|
-
const staticHandler = (req, res) => handler(req, res, opts).catch((err) => errHandler(err, res));
|
|
150
|
-
// It's important for this guard to check to not be destructured
|
|
151
|
-
// because `infra/build` will replace the whole thing with `false`
|
|
152
|
-
// causing it to be stripped entirely from production builds.
|
|
153
|
-
if (process.env.__VLT_INTERNAL_LIVE_RELOAD) {
|
|
154
|
-
// Generate a set of routes that should be proxied to the esbuild server
|
|
155
|
-
const proxyRoutes = new Set([
|
|
156
|
-
// `/esbuild` is an SSE endpoint served by esbuild
|
|
157
|
-
'esbuild',
|
|
158
|
-
// Also proxy anything that currently exists in the assets dir
|
|
159
|
-
...readdirSync(assetsDir, {
|
|
160
|
-
withFileTypes: true,
|
|
161
|
-
recursive: true,
|
|
162
|
-
})
|
|
163
|
-
.filter(f => f.isFile())
|
|
164
|
-
.map(f => relative(assetsDir, resolve(f.parentPath, f.name))),
|
|
165
|
-
].map(p => `/${p}`));
|
|
166
|
-
return (req, res) => req.url && proxyRoutes.has(req.url) ?
|
|
167
|
-
void req.pipe(request({
|
|
168
|
-
hostname: HOST,
|
|
169
|
-
port: 7018,
|
|
170
|
-
path: req.url,
|
|
171
|
-
method: req.method,
|
|
172
|
-
headers: req.headers,
|
|
173
|
-
}, proxy => {
|
|
174
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
175
|
-
res.writeHead(proxy.statusCode, proxy.headers);
|
|
176
|
-
proxy.pipe(res, { end: true });
|
|
177
|
-
}).on('error', err => {
|
|
178
|
-
// If we get an ECONNREFUSED error, fallback to the static handler
|
|
179
|
-
// since the esbuild server is not running
|
|
180
|
-
if (err instanceof Error &&
|
|
181
|
-
'code' in err &&
|
|
182
|
-
err.code === 'ECONNREFUSED') {
|
|
183
|
-
// In this case the /esbuild route is expected to fail so the
|
|
184
|
-
// EventSource in the browser will be closed
|
|
185
|
-
if (req.url === '/esbuild') {
|
|
186
|
-
res.statusCode = 404;
|
|
187
|
-
return res.end();
|
|
188
|
-
}
|
|
189
|
-
return staticHandler(req, res);
|
|
190
|
-
}
|
|
191
|
-
errHandler(err, res);
|
|
192
|
-
}), { end: true })
|
|
193
|
-
: staticHandler(req, res);
|
|
194
|
-
}
|
|
195
|
-
return staticHandler;
|
|
196
|
-
};
|
|
197
|
-
/* c8 ignore start */
|
|
198
|
-
const getAssetsDir = () => {
|
|
199
|
-
const fromEnv = process.env.__VLT_INTERNAL_GUI_ASSETS_DIR;
|
|
200
|
-
// workaround for the import.meta.resolve issue not working with tap
|
|
201
|
-
if (process.env.TAP) {
|
|
202
|
-
assert(fromEnv, 'assets dir must be set from environment variable when running tests');
|
|
203
|
-
}
|
|
204
|
-
if (fromEnv) {
|
|
205
|
-
return resolve(import.meta.dirname, fromEnv);
|
|
206
|
-
}
|
|
207
|
-
return fileURLToPath(import.meta.resolve('@vltpkg/gui'));
|
|
11
|
+
: '/';
|
|
208
12
|
};
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
// This is the same as `cpSync(assetsDir, tmp, { recursive: true })`
|
|
215
|
-
// but that does not work in Deno yet (https://github.com/denoland/deno/issues/27494).
|
|
216
|
-
for (const asset of readdirSync(assetsDir, {
|
|
217
|
-
withFileTypes: true,
|
|
218
|
-
recursive: true,
|
|
219
|
-
})) {
|
|
220
|
-
if (!asset.isFile())
|
|
221
|
-
continue;
|
|
222
|
-
const source = resolve(asset.parentPath, asset.name);
|
|
223
|
-
const target = resolve(tmp, relative(assetsDir, source));
|
|
224
|
-
mkdirSync(dirname(target), { recursive: true });
|
|
225
|
-
writeFileSync(target, readFileSync(source));
|
|
226
|
-
}
|
|
227
|
-
// dashboard data is optional since the GUI might be started from a
|
|
228
|
-
// project in order to just explore its graph data
|
|
229
|
-
let hasDashboard = false;
|
|
230
|
-
const { scurry, 'dashboard-root': dashboardRoot, packageJson, } = conf.options;
|
|
231
|
-
const updateDashboard = async () => {
|
|
232
|
-
try {
|
|
233
|
-
hasDashboard = await updateDashboardData(tmp, {
|
|
234
|
-
scurry,
|
|
235
|
-
'dashboard-root': dashboardRoot,
|
|
236
|
-
packageJson,
|
|
237
|
-
});
|
|
238
|
-
/* c8 ignore next */
|
|
239
|
-
}
|
|
240
|
-
catch { }
|
|
241
|
-
if (!hasDashboard) {
|
|
242
|
-
rmSync(resolve(tmp, 'dashboard.json'), { force: true });
|
|
243
|
-
}
|
|
244
|
-
};
|
|
245
|
-
await updateDashboard();
|
|
246
|
-
// reading graph data is optional since the command might be run from a
|
|
247
|
-
// parend directory of any given project root, in which case the GUI is
|
|
248
|
-
// going to render only the dashboard to start with
|
|
249
|
-
try {
|
|
250
|
-
updateGraphData(tmp, conf.options, hasDashboard);
|
|
251
|
-
}
|
|
252
|
-
catch {
|
|
253
|
-
rmSync(resolve(tmp, 'graph.json'), { force: true });
|
|
254
|
-
}
|
|
255
|
-
const staticHandler = createStaticHandler({
|
|
256
|
-
publicDir: tmp,
|
|
257
|
-
assetsDir,
|
|
258
|
-
});
|
|
259
|
-
const server = createServer(async (req, res) => {
|
|
260
|
-
const json = () => new Promise(resolve => {
|
|
261
|
-
req.setEncoding('utf8');
|
|
262
|
-
let json = '';
|
|
263
|
-
req.on('data', (d) => (json += d));
|
|
264
|
-
req.on('end', () => resolve(JSON.parse(json)));
|
|
265
|
-
});
|
|
266
|
-
const jsonError = (errType, err, code) => {
|
|
267
|
-
stderr(err);
|
|
268
|
-
res.statusCode = code;
|
|
269
|
-
res.end(JSON.stringify(`${errType}\n${err}`));
|
|
270
|
-
};
|
|
271
|
-
const jsonOk = (result) => {
|
|
272
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
273
|
-
res.end(JSON.stringify(result));
|
|
274
|
-
};
|
|
275
|
-
switch (`${req.method} ${req.url}`) {
|
|
276
|
-
case 'POST /select-project': {
|
|
277
|
-
const data = await json();
|
|
278
|
-
conf.resetOptions(String(data.path));
|
|
279
|
-
await updateDashboard();
|
|
280
|
-
updateGraphData(tmp, conf.options, hasDashboard);
|
|
281
|
-
return jsonOk('ok');
|
|
282
|
-
}
|
|
283
|
-
case 'POST /create-project': {
|
|
284
|
-
const data = await json();
|
|
285
|
-
if (typeof data.path !== 'string') {
|
|
286
|
-
return jsonError('Bad request.', 'Project path must be a string', 400);
|
|
287
|
-
}
|
|
288
|
-
if (!/^[a-z0-9-]+$/.test(String(data.name)) ||
|
|
289
|
-
String(data.name).length > 128) {
|
|
290
|
-
return jsonError('Bad request.', 'Project name must be lowercase, alphanumeric, and may contain hyphens', 400);
|
|
291
|
-
}
|
|
292
|
-
const path = String(data.path);
|
|
293
|
-
const name = String(data.name);
|
|
294
|
-
const author = String(data.author);
|
|
295
|
-
try {
|
|
296
|
-
const cwd = resolve(path, name);
|
|
297
|
-
mkdirSync(cwd, { recursive: true });
|
|
298
|
-
await init({ cwd, author });
|
|
299
|
-
conf.resetOptions(cwd);
|
|
300
|
-
await install(conf.options);
|
|
301
|
-
conf.resetOptions(conf.options.projectRoot);
|
|
302
|
-
await updateDashboard();
|
|
303
|
-
updateGraphData(tmp, conf.options, hasDashboard);
|
|
304
|
-
}
|
|
305
|
-
catch (err) {
|
|
306
|
-
// eslint-disable-next-line no-console
|
|
307
|
-
console.error(err);
|
|
308
|
-
return jsonError('CLI Error', err.message, 500);
|
|
309
|
-
}
|
|
310
|
-
return jsonOk('ok');
|
|
311
|
-
}
|
|
312
|
-
case `POST /install`: {
|
|
313
|
-
const { add } = await json();
|
|
314
|
-
if (!add) {
|
|
315
|
-
return jsonError('Bad request.', 'GUI install endpoint called without add argument', 400);
|
|
316
|
-
}
|
|
317
|
-
try {
|
|
318
|
-
await install(...parseInstallOptions(conf.options, add));
|
|
319
|
-
conf.resetOptions(conf.options.projectRoot);
|
|
320
|
-
updateGraphData(tmp, conf.options, hasDashboard);
|
|
321
|
-
return jsonOk('ok');
|
|
322
|
-
}
|
|
323
|
-
catch (err) {
|
|
324
|
-
return jsonError('Install failed', err, 500);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
case `POST /uninstall`: {
|
|
328
|
-
const { remove } = await json();
|
|
329
|
-
if (!remove) {
|
|
330
|
-
return jsonError('Bad request.', 'GUI uninstall endpoint called with no arguments', 400);
|
|
331
|
-
}
|
|
332
|
-
try {
|
|
333
|
-
await uninstall(...parseUninstallOptions(conf.options, remove));
|
|
334
|
-
conf.resetOptions(conf.options.projectRoot);
|
|
335
|
-
updateGraphData(tmp, conf.options, hasDashboard);
|
|
336
|
-
return jsonOk('ok');
|
|
337
|
-
}
|
|
338
|
-
catch (err) {
|
|
339
|
-
return jsonError('Uninstall failed', err, 500);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
/* c8 ignore next 3 */
|
|
343
|
-
default: {
|
|
344
|
-
return staticHandler(req, res);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
});
|
|
348
|
-
return new Promise(res => {
|
|
349
|
-
const route = startingRoute || getDefaultStartingRoute(conf.options);
|
|
350
|
-
server.listen(port, 'localhost', () => {
|
|
351
|
-
stdout(`⚡️ vlt GUI running at http://${HOST}:${port}`);
|
|
352
|
-
void urlOpen(`http://${HOST}:${port}${route}`);
|
|
353
|
-
res(server);
|
|
354
|
-
});
|
|
13
|
+
export const startGUI = async (conf, startingRoute) => {
|
|
14
|
+
const server = createServer(conf.options);
|
|
15
|
+
server.on('needConfigUpdate', dir => {
|
|
16
|
+
conf.resetOptions(dir);
|
|
17
|
+
server.updateOptions(conf.options);
|
|
355
18
|
});
|
|
19
|
+
const { projectRoot, scurry } = conf.options;
|
|
20
|
+
await server.start();
|
|
21
|
+
stdout(`⚡️ vlt GUI running at ${server.address()}`);
|
|
22
|
+
void urlOpen(server.address(await getDefaultStartingRoute({
|
|
23
|
+
startingRoute,
|
|
24
|
+
projectRoot,
|
|
25
|
+
scurry,
|
|
26
|
+
})));
|
|
27
|
+
return server;
|
|
356
28
|
};
|
|
357
29
|
//# sourceMappingURL=start-gui.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-gui.js","sourceRoot":"","sources":["../../src/start-gui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AASrC,OAAO,EACL,MAAM,EACN,YAAY,EACZ,OAAO,EACP,SAAS,GACV,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAGzD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACZ,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAA;AAMhB,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,OAAO,MAAM,eAAe,CAAA;AAEnC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,GAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,MAAM,IAAI,GAAG,WAAW,CAAA;AACxB,MAAM,IAAI,GAAG,IAAI,CAAA;AAEjB,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,EACpB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAG5C,CAAA;AA8BD,MAAM,+BACJ,SAAQ,GAAG;IAGX,oBAAoB,GAAG,KAAK,CAAA;CAC7B;AAED,MAAM,kCACJ,SAAQ,GAAG;IAGX,oBAAoB,GAAG,KAAK,CAAA;CAC7B;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAqC,EACrC,IAAuB,EACwB,EAAE;IACjD,MAAM,OAAO,GAAG,IAAI,+BAA+B,EAAE,CAAA;IACrD,KAAK,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAA;QAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,GAAG,CACR,IAAI,EACJ,YAAY,CAAC;gBACX,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;gBACxC,IAAI;aACL,CAAC,CACH,CAAA;YACD,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAA;QACrC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAC3B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,OAAyB,EACzB,IAAyB,EAC2B,EAAE;IACtD,MAAM,UAAU,GAAG,IAAI,kCAAkC,EAAE,CAAA;IAC3D,KAAK,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;QAChC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAA;QAC3C,UAAU,CAAC,oBAAoB,GAAG,IAAI,CAAA;IACxC,CAAC;IACD,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;AAC9B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,cAA0B,EAC1B,aAAuB,EACvB,MAAkB,EAClB,WAAwB,EACxB,EAAE;IACF,MAAM,uBAAuB,GAAG,CAC9B,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CACvD,IAAI,CAAC,EAAE,CACL,CAAC;QACC,IAAI;QACJ,YAAY,EAAE,eAAe,CAAC,IAAI,CAAC;KACpC,CAAsB,CAC1B,CAAA;IACD,MAAM,MAAM,GAAkB;QAC5B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,YAAY,EAAE,OAAO;QACrB,yBAAyB,EAAE,cAAc;aACtC,GAAG,CAAC,CAAC,GAAa,EAAE,EAAE;YACrB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;YACpC,MAAM,GAAG,GAAsB;gBAC7B,IAAI;gBACJ,YAAY,EAAE,eAAe,CAAC,IAAI,CAAC;aACpC,CAAA;YACD,OAAO,GAAG,CAAA;QACZ,CAAC,CAAC;aACD,MAAM,CAAC,uBAAuB,CAAC;aAC/B,MAAM,CAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACzC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC,EAAE,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;QAChE,aAAa,EAAE,oBAAoB,CACjC,MAAM,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CACvC;QACD,QAAQ,EAAE,EAAE;KACb,CAAA;IACD,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,uBAAuB,CAAC,MAAM,EAAE;YAClD,MAAM;YACN,WAAW;SACZ,CAAC,CAAA;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CACtB,GAAW,EACX,OAA0B,EAC1B,YAAqB,EACrB,EAAE;IACF,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IACpD,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,GAAG,OAAO;QACV,YAAY;QACZ,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAC9B;QACE,YAAY;QACZ,SAAS;QACT,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,mBAAmB,CAC9B,EAAE,WAAW,EAAE,MAAM,EAAE,EACvB,MAAM,CACP;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAA;IACD,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAA;AACtD,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,KAAK,EAC/B,GAAW,EACX,OAIC,EACD,EAAE;IACF,MAAM,EACJ,gBAAgB,EAAE,uBAAuB,GAAG,EAAE,EAC9C,MAAM,EACN,WAAW,GACZ,GAAG,OAAO,CAAA;IACX,MAAM,SAAS,GAAG,MAAM,mBAAmB,CACzC,MAAM,kBAAkB,CAAC;QACvB,MAAM;QACN,uBAAuB;KACxB,CAAC,EACF,uBAAuB,EACvB,MAAM,EACN,WAAW,CACZ,CAAA;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACxD,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,aAAa,CAAC,CAAA;IAC5D,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,CAAC,OAGhC,EAAE,EAAE;IACH,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,WAAW,eAAe,CAAC,CAAA;IAC5D,OAAO,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7C,kBAAkB,kBAAkB,CAAC,OAAO,CAAC,EAAE;QACjD,CAAC,CAAC,YAAY,CAAA;AAClB,CAAC,CAAA;AAED,qBAAqB;AACrB,MAAM,mBAAmB,GAAG,CAAC,EAC3B,SAAS,EACT,SAAS,GAIV,EAAE,EAAE;IACH,MAAM,IAAI,GAAG;QACX,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE;YACR,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE;YAC3C,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;YAChD,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE;YAClD,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE;YACpD,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE;YAClD,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE;YACjD,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE;SACvD;KACF,CAAA;IACD,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,GAAmB,EAAE,EAAE;QACvD,MAAM,CAAC,GAAG,CAAC,CAAA;QACX,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;QACpB,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IAClC,CAAC,CAAA;IACD,MAAM,aAAa,GAAG,CAAC,GAAoB,EAAE,GAAmB,EAAE,EAAE,CAClE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAC7C,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CACrB,CAAA;IAEH,gEAAgE;IAChE,kEAAkE;IAClE,6DAA6D;IAC7D,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC;QAC3C,wEAAwE;QACxE,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB;YACE,kDAAkD;YAClD,SAAS;YACT,8DAA8D;YAC9D,GAAG,WAAW,CAAC,SAAS,EAAE;gBACxB,aAAa,EAAE,IAAI;gBACnB,SAAS,EAAE,IAAI;aAChB,CAAC;iBACC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CACP,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CACnD;SACJ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CACpB,CAAA;QACD,OAAO,CAAC,GAAoB,EAAE,GAAmB,EAAE,EAAE,CACnD,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,KAAK,GAAG,CAAC,IAAI,CACX,OAAO,CACL;gBACE,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,GAAG,CAAC,GAAG;gBACb,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,EACD,KAAK,CAAC,EAAE;gBACN,oEAAoE;gBACpE,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,UAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBAC/C,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;YAChC,CAAC,CACF,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;gBAClB,kEAAkE;gBAClE,0CAA0C;gBAC1C,IACE,GAAG,YAAY,KAAK;oBACpB,MAAM,IAAI,GAAG;oBACb,GAAG,CAAC,IAAI,KAAK,cAAc,EAC3B,CAAC;oBACD,6DAA6D;oBAC7D,4CAA4C;oBAC5C,IAAI,GAAG,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;wBAC3B,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;wBACpB,OAAO,GAAG,CAAC,GAAG,EAAE,CAAA;oBAClB,CAAC;oBACD,OAAO,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;gBAChC,CAAC;gBACD,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YACtB,CAAC,CAAC,EACF,EAAE,GAAG,EAAE,IAAI,EAAE,CACd;YACH,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AAED,qBAAqB;AACrB,MAAM,YAAY,GAAG,GAAG,EAAE;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAA;IACzD,oEAAoE;IACpE,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACpB,MAAM,CACJ,OAAO,EACP,qEAAqE,CACtE,CAAA;IACH,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;AAC1D,CAAC,CAAA;AACD,oBAAoB;AAEpB,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,EAC7B,IAAI,EACJ,SAAS,GAAG,YAAY,EAAE,EAC1B,IAAI,GAAG,IAAI,EACX,aAAa,GAAG,SAAS,EACzB,MAAM,GAAG,MAAM,EAAE,GACD,EAAE,EAAE;IACpB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACrC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnC,oEAAoE;IACpE,sFAAsF;IACtF,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE;QACzC,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,IAAI;KAChB,CAAC,EAAE,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,SAAQ;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;QACxD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/C,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;IAC7C,CAAC;IAED,mEAAmE;IACnE,kDAAkD;IAClD,IAAI,YAAY,GAAG,KAAK,CAAA;IAExB,MAAM,EACJ,MAAM,EACN,gBAAgB,EAAE,aAAa,EAC/B,WAAW,GACZ,GAAG,IAAI,CAAC,OAAO,CAAA;IAEhB,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;QACjC,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE;gBAC5C,MAAM;gBACN,gBAAgB,EAAE,aAAa;gBAC/B,WAAW;aACZ,CAAC,CAAA;YACF,oBAAoB;QACtB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACzD,CAAC;IACH,CAAC,CAAA;IAED,MAAM,eAAe,EAAE,CAAA;IAEvB,uEAAuE;IACvE,uEAAuE;IACvE,mDAAmD;IACnD,IAAI,CAAC;QACH,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,MAAM,aAAa,GAAG,mBAAmB,CAAC;QACxC,SAAS,EAAE,GAAG;QACd,SAAS;KACV,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,GAAkB,EAAE,CAC/B,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACpB,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;YACvB,IAAI,IAAI,GAAG,EAAE,CAAA;YACb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;YAC1C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;QACJ,MAAM,SAAS,GAAG,CAChB,OAAe,EACf,GAAY,EACZ,IAAY,EACZ,EAAE;YACF,MAAM,CAAC,GAAG,CAAC,CAAA;YACX,GAAG,CAAC,UAAU,GAAG,IAAI,CAAA;YACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,CAAA;QAC/C,CAAC,CAAA;QACD,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,EAAE;YAChC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC1D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QACjC,CAAC,CAAA;QACD,QAAQ,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;YACnC,KAAK,sBAAsB,CAAC,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,EAAqB,CAAA;gBAC5C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;gBACpC,MAAM,eAAe,EAAE,CAAA;gBACvB,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;gBAChD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;YACrB,CAAC;YACD,KAAK,sBAAsB,CAAC,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,EAInB,CAAA;gBACJ,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAClC,OAAO,SAAS,CACd,cAAc,EACd,+BAA+B,EAC/B,GAAG,CACJ,CAAA;gBACH,CAAC;gBACD,IACE,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,EAC9B,CAAC;oBACD,OAAO,SAAS,CACd,cAAc,EACd,uEAAuE,EACvE,GAAG,CACJ,CAAA;gBACH,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBAClC,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;oBAC/B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;oBACnC,MAAM,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAA;oBAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;oBACtB,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;oBAC3C,MAAM,eAAe,EAAE,CAAA;oBACvB,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;gBAClD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBAClB,OAAO,SAAS,CAAC,WAAW,EAAG,GAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;gBAC5D,CAAC;gBACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;YACrB,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,EAA+B,CAAA;gBACzD,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,SAAS,CACd,cAAc,EACd,kDAAkD,EAClD,GAAG,CACJ,CAAA;gBACH,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;oBACxD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;oBAC3C,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;oBAChD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;gBACrB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,SAAS,CAAC,gBAAgB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;gBAC9C,CAAC;YACH,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,EAEzB,CAAA;gBACJ,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,SAAS,CACd,cAAc,EACd,iDAAiD,EACjD,GAAG,CACJ,CAAA;gBACH,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,SAAS,CACb,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAC/C,CAAA;oBACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;oBAC3C,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;oBAChD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;gBACrB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,SAAS,CAAC,kBAAkB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;gBAChD,CAAC;YACH,CAAC;YACD,sBAAsB;YACtB,OAAO,CAAC,CAAC,CAAC;gBACR,OAAO,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAChC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,OAAO,CAAS,GAAG,CAAC,EAAE;QAC/B,MAAM,KAAK,GACT,aAAa,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,gCAAgC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAA;YACtD,KAAK,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,CAAA;YAC9C,GAAG,CAAC,MAAM,CAAC,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA","sourcesContent":["import { asDepID } from '@vltpkg/dep-id'\nimport { getUser } from '@vltpkg/git'\nimport type {\n ActualLoadOptions,\n AddImportersDependenciesMap,\n Dependency,\n InstallOptions,\n RemoveImportersDependenciesMap,\n UninstallOptions,\n} from '@vltpkg/graph'\nimport {\n actual,\n asDependency,\n install,\n uninstall,\n} from '@vltpkg/graph'\nimport { getAuthorFromGitUser, init } from '@vltpkg/init'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport { Spec } from '@vltpkg/spec'\nimport type { DependencyTypeShort } from '@vltpkg/types'\nimport { urlOpen } from '@vltpkg/url-open'\nimport assert from 'node:assert'\nimport {\n mkdirSync,\n readdirSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport type {\n IncomingMessage,\n Server,\n ServerResponse,\n} from 'node:http'\nimport { createServer, request } from 'node:http'\nimport { homedir, tmpdir } from 'node:os'\nimport { dirname, relative, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { loadPackageJson } from 'package-json-from-dist'\nimport type { PathBase, PathScurry } from 'path-scurry'\nimport handler from 'serve-handler'\nimport type { LoadedConfig } from './config/index.ts'\nimport { stderr, stdout } from './output.ts'\nimport type { DashboardProjectData } from './project-info.ts'\nimport {\n getDashboardProjectData,\n getGraphProjectData,\n getReadablePath,\n} from './project-info.ts'\nimport { readProjectFolders } from './read-project-folders.ts'\n\nconst HOST = 'localhost'\nconst PORT = 7017\n\nconst { version } = loadPackageJson(\n import.meta.filename,\n process.env.__VLT_INTERNAL_CLI_PACKAGE_JSON,\n) as {\n version: string\n}\n\nexport type GUIInstallOptions = Record<\n string,\n Record<string, { version: string; type: DependencyTypeShort }>\n>\n\nexport type GUIUninstallOptions = Record<string, Set<string>>\n\nexport type StartGUIOptions = {\n assetsDir?: string\n conf: LoadedConfig\n port?: number\n startingRoute?: string\n tmpDir?: string\n}\n\nexport type DashboardLocation = {\n path: string\n readablePath: string\n}\n\nexport type DashboardData = {\n cwd: string\n buildVersion: string\n dashboardProjectLocations: DashboardLocation[]\n defaultAuthor: string\n projects: DashboardProjectData[]\n}\n\nclass AddImportersDependenciesMapImpl\n extends Map\n implements AddImportersDependenciesMap\n{\n modifiedDependencies = false\n}\n\nclass RemoveImportersDependenciesMapImpl\n extends Map\n implements RemoveImportersDependenciesMap\n{\n modifiedDependencies = false\n}\n\nexport const parseInstallOptions = (\n options: InstallOptions & SpecOptions,\n args: GUIInstallOptions,\n): [InstallOptions, AddImportersDependenciesMap] => {\n const addArgs = new AddImportersDependenciesMapImpl()\n for (const [importerId, deps] of Object.entries(args)) {\n const depMap = new Map<string, Dependency>()\n for (const [name, { version, type }] of Object.entries(deps)) {\n depMap.set(\n name,\n asDependency({\n spec: Spec.parse(name, version, options),\n type,\n }),\n )\n addArgs.modifiedDependencies = true\n }\n addArgs.set(asDepID(importerId), depMap)\n }\n return [options, addArgs]\n}\n\nexport const parseUninstallOptions = (\n options: UninstallOptions,\n args: GUIUninstallOptions,\n): [UninstallOptions, RemoveImportersDependenciesMap] => {\n const removeArgs = new RemoveImportersDependenciesMapImpl()\n for (const [importerId, deps] of Object.entries(args)) {\n const depMap = new Set<string>()\n for (const name of deps) {\n depMap.add(name)\n }\n removeArgs.set(asDepID(importerId), depMap)\n removeArgs.modifiedDependencies = true\n }\n return [options, removeArgs]\n}\n\nexport const formatDashboardJson = async (\n projectFolders: PathBase[],\n dashboardRoot: string[],\n scurry: PathScurry,\n packageJson: PackageJson,\n) => {\n const userDefinedProjectPaths = (\n dashboardRoot.length ? dashboardRoot : [homedir()]).map(\n path =>\n ({\n path,\n readablePath: getReadablePath(path),\n }) as DashboardLocation,\n )\n const result: DashboardData = {\n cwd: process.cwd(),\n buildVersion: version,\n dashboardProjectLocations: projectFolders\n .map((dir: PathBase) => {\n const path = dirname(dir.fullpath())\n const res: DashboardLocation = {\n path,\n readablePath: getReadablePath(path),\n }\n return res\n })\n .concat(userDefinedProjectPaths)\n .reduce<DashboardLocation[]>((acc, curr) => {\n if (acc.every(obj => obj.path !== curr.path)) {\n acc.push(curr)\n }\n return acc\n }, [])\n .sort((a, b) => a.readablePath.length - b.readablePath.length),\n defaultAuthor: getAuthorFromGitUser(\n await getUser().catch(() => undefined),\n ),\n projects: [],\n }\n for (const folder of projectFolders) {\n const projectData = getDashboardProjectData(folder, {\n scurry,\n packageJson,\n })\n if (projectData) {\n result.projects.push(projectData)\n }\n }\n return result\n}\n\nconst updateGraphData = (\n tmp: string,\n options: ActualLoadOptions,\n hasDashboard: boolean,\n) => {\n const { packageJson, projectRoot, scurry } = options\n const mainManifest = packageJson.read(projectRoot)\n const graph = actual.load({\n ...options,\n mainManifest,\n loadManifests: true,\n })\n const importers = [...graph.importers]\n const folder = scurry.lstatSync(projectRoot)\n const graphJson = JSON.stringify(\n {\n hasDashboard,\n importers,\n lockfile: graph,\n projectInfo: getGraphProjectData(\n { packageJson, scurry },\n folder,\n ),\n },\n null,\n 2,\n )\n rmSync(resolve(tmp, 'graph.json'), { force: true })\n writeFileSync(resolve(tmp, 'graph.json'), graphJson)\n}\n\nconst updateDashboardData = async (\n tmp: string,\n options: {\n scurry: PathScurry\n 'dashboard-root'?: string[]\n packageJson: PackageJson\n },\n) => {\n const {\n 'dashboard-root': userDefinedProjectPaths = [],\n scurry,\n packageJson,\n } = options\n const dashboard = await formatDashboardJson(\n await readProjectFolders({\n scurry,\n userDefinedProjectPaths,\n }),\n userDefinedProjectPaths,\n scurry,\n packageJson,\n )\n const dashboardJson = JSON.stringify(dashboard, null, 2)\n writeFileSync(resolve(tmp, 'dashboard.json'), dashboardJson)\n return dashboard.projects.length > 0\n}\n\nconst getDefaultStartingRoute = (options: {\n projectRoot: string\n scurry: PathScurry\n}) => {\n const { projectRoot, scurry } = options\n const stat = scurry.lstatSync(`${projectRoot}/package.json`)\n return stat?.isFile() && !stat.isSymbolicLink() ?\n `/explore?query=${encodeURIComponent(':root')}`\n : '/dashboard'\n}\n\n/* c8 ignore start */\nconst createStaticHandler = ({\n assetsDir,\n publicDir,\n}: {\n assetsDir: string\n publicDir: string\n}) => {\n const opts = {\n cleanUrls: true,\n public: publicDir,\n rewrites: [\n { source: '/', destination: '/index.html' },\n { source: '/error', destination: '/index.html' },\n { source: '/explore', destination: '/index.html' },\n { source: '/dashboard', destination: '/index.html' },\n { source: '/queries', destination: '/index.html' },\n { source: '/labels', destination: '/index.html' },\n { source: '/new-project', destination: '/index.html' },\n ],\n }\n const errHandler = (err: unknown, res: ServerResponse) => {\n stderr(err)\n res.statusCode = 500\n res.end('Internal server error')\n }\n const staticHandler = (req: IncomingMessage, res: ServerResponse) =>\n handler(req, res, opts).catch((err: unknown) =>\n errHandler(err, res),\n )\n\n // It's important for this guard to check to not be destructured\n // because `infra/build` will replace the whole thing with `false`\n // causing it to be stripped entirely from production builds.\n if (process.env.__VLT_INTERNAL_LIVE_RELOAD) {\n // Generate a set of routes that should be proxied to the esbuild server\n const proxyRoutes = new Set(\n [\n // `/esbuild` is an SSE endpoint served by esbuild\n 'esbuild',\n // Also proxy anything that currently exists in the assets dir\n ...readdirSync(assetsDir, {\n withFileTypes: true,\n recursive: true,\n })\n .filter(f => f.isFile())\n .map(f =>\n relative(assetsDir, resolve(f.parentPath, f.name)),\n ),\n ].map(p => `/${p}`),\n )\n return (req: IncomingMessage, res: ServerResponse) =>\n req.url && proxyRoutes.has(req.url) ?\n void req.pipe(\n request(\n {\n hostname: HOST,\n port: 7018,\n path: req.url,\n method: req.method,\n headers: req.headers,\n },\n proxy => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n res.writeHead(proxy.statusCode!, proxy.headers)\n proxy.pipe(res, { end: true })\n },\n ).on('error', err => {\n // If we get an ECONNREFUSED error, fallback to the static handler\n // since the esbuild server is not running\n if (\n err instanceof Error &&\n 'code' in err &&\n err.code === 'ECONNREFUSED'\n ) {\n // In this case the /esbuild route is expected to fail so the\n // EventSource in the browser will be closed\n if (req.url === '/esbuild') {\n res.statusCode = 404\n return res.end()\n }\n return staticHandler(req, res)\n }\n errHandler(err, res)\n }),\n { end: true },\n )\n : staticHandler(req, res)\n }\n\n return staticHandler\n}\n\n/* c8 ignore start */\nconst getAssetsDir = () => {\n const fromEnv = process.env.__VLT_INTERNAL_GUI_ASSETS_DIR\n // workaround for the import.meta.resolve issue not working with tap\n if (process.env.TAP) {\n assert(\n fromEnv,\n 'assets dir must be set from environment variable when running tests',\n )\n }\n if (fromEnv) {\n return resolve(import.meta.dirname, fromEnv)\n }\n return fileURLToPath(import.meta.resolve('@vltpkg/gui'))\n}\n/* c8 ignore stop */\n\nexport const startGUI = async ({\n conf,\n assetsDir = getAssetsDir(),\n port = PORT,\n startingRoute = undefined,\n tmpDir = tmpdir(),\n}: StartGUIOptions) => {\n const tmp = resolve(tmpDir, 'vltgui')\n rmSync(tmp, { recursive: true, force: true })\n mkdirSync(tmp, { recursive: true })\n // This is the same as `cpSync(assetsDir, tmp, { recursive: true })`\n // but that does not work in Deno yet (https://github.com/denoland/deno/issues/27494).\n for (const asset of readdirSync(assetsDir, {\n withFileTypes: true,\n recursive: true,\n })) {\n if (!asset.isFile()) continue\n const source = resolve(asset.parentPath, asset.name)\n const target = resolve(tmp, relative(assetsDir, source))\n mkdirSync(dirname(target), { recursive: true })\n writeFileSync(target, readFileSync(source))\n }\n\n // dashboard data is optional since the GUI might be started from a\n // project in order to just explore its graph data\n let hasDashboard = false\n\n const {\n scurry,\n 'dashboard-root': dashboardRoot,\n packageJson,\n } = conf.options\n\n const updateDashboard = async () => {\n try {\n hasDashboard = await updateDashboardData(tmp, {\n scurry,\n 'dashboard-root': dashboardRoot,\n packageJson,\n })\n /* c8 ignore next */\n } catch {}\n if (!hasDashboard) {\n rmSync(resolve(tmp, 'dashboard.json'), { force: true })\n }\n }\n\n await updateDashboard()\n\n // reading graph data is optional since the command might be run from a\n // parend directory of any given project root, in which case the GUI is\n // going to render only the dashboard to start with\n try {\n updateGraphData(tmp, conf.options, hasDashboard)\n } catch {\n rmSync(resolve(tmp, 'graph.json'), { force: true })\n }\n\n const staticHandler = createStaticHandler({\n publicDir: tmp,\n assetsDir,\n })\n\n const server = createServer(async (req, res) => {\n const json = <T>(): Promise<T> =>\n new Promise(resolve => {\n req.setEncoding('utf8')\n let json = ''\n req.on('data', (d: string) => (json += d))\n req.on('end', () => resolve(JSON.parse(json) as T))\n })\n const jsonError = (\n errType: string,\n err: unknown,\n code: number,\n ) => {\n stderr(err)\n res.statusCode = code\n res.end(JSON.stringify(`${errType}\\n${err}`))\n }\n const jsonOk = (result: string) => {\n res.writeHead(200, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify(result))\n }\n switch (`${req.method} ${req.url}`) {\n case 'POST /select-project': {\n const data = await json<{ path: unknown }>()\n conf.resetOptions(String(data.path))\n await updateDashboard()\n updateGraphData(tmp, conf.options, hasDashboard)\n return jsonOk('ok')\n }\n case 'POST /create-project': {\n const data = await json<{\n path: unknown\n name: unknown\n author: unknown\n }>()\n if (typeof data.path !== 'string') {\n return jsonError(\n 'Bad request.',\n 'Project path must be a string',\n 400,\n )\n }\n if (\n !/^[a-z0-9-]+$/.test(String(data.name)) ||\n String(data.name).length > 128\n ) {\n return jsonError(\n 'Bad request.',\n 'Project name must be lowercase, alphanumeric, and may contain hyphens',\n 400,\n )\n }\n const path = String(data.path)\n const name = String(data.name)\n const author = String(data.author)\n try {\n const cwd = resolve(path, name)\n mkdirSync(cwd, { recursive: true })\n await init({ cwd, author })\n conf.resetOptions(cwd)\n await install(conf.options)\n conf.resetOptions(conf.options.projectRoot)\n await updateDashboard()\n updateGraphData(tmp, conf.options, hasDashboard)\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err)\n return jsonError('CLI Error', (err as Error).message, 500)\n }\n return jsonOk('ok')\n }\n case `POST /install`: {\n const { add } = await json<{ add?: GUIInstallOptions }>()\n if (!add) {\n return jsonError(\n 'Bad request.',\n 'GUI install endpoint called without add argument',\n 400,\n )\n }\n try {\n await install(...parseInstallOptions(conf.options, add))\n conf.resetOptions(conf.options.projectRoot)\n updateGraphData(tmp, conf.options, hasDashboard)\n return jsonOk('ok')\n } catch (err) {\n return jsonError('Install failed', err, 500)\n }\n }\n case `POST /uninstall`: {\n const { remove } = await json<{\n remove?: GUIUninstallOptions\n }>()\n if (!remove) {\n return jsonError(\n 'Bad request.',\n 'GUI uninstall endpoint called with no arguments',\n 400,\n )\n }\n try {\n await uninstall(\n ...parseUninstallOptions(conf.options, remove),\n )\n conf.resetOptions(conf.options.projectRoot)\n updateGraphData(tmp, conf.options, hasDashboard)\n return jsonOk('ok')\n } catch (err) {\n return jsonError('Uninstall failed', err, 500)\n }\n }\n /* c8 ignore next 3 */\n default: {\n return staticHandler(req, res)\n }\n }\n })\n\n return new Promise<Server>(res => {\n const route =\n startingRoute || getDefaultStartingRoute(conf.options)\n server.listen(port, 'localhost', () => {\n stdout(`⚡️ vlt GUI running at http://${HOST}:${port}`)\n void urlOpen(`http://${HOST}:${port}${route}`)\n res(server)\n })\n })\n}\n"]}
|
|
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;AAEpC,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,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,IAAkB,EAClB,aAAsB,EACtB,EAAE;IACF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACzC,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'\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\nexport const startGUI = async (\n conf: LoadedConfig,\n startingRoute?: string,\n) => {\n const server = createServer(conf.options)\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"]}
|
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-
|
|
4
|
+
"version": "0.0.0-5",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/vltpkg/vltpkg.git",
|
|
@@ -32,25 +32,26 @@
|
|
|
32
32
|
"react-devtools-core": "^4.28.5",
|
|
33
33
|
"serve-handler": "^6.1.5",
|
|
34
34
|
"walk-up-path": "^4.0.0",
|
|
35
|
-
"@vltpkg/dep-id": "0.0.0-
|
|
36
|
-
"@vltpkg/
|
|
37
|
-
"@vltpkg/
|
|
38
|
-
"@vltpkg/
|
|
39
|
-
"@vltpkg/
|
|
40
|
-
"@vltpkg/
|
|
41
|
-
"@vltpkg/output": "0.0.0-
|
|
42
|
-
"@vltpkg/package-info": "0.0.0-
|
|
43
|
-
"@vltpkg/package-json": "0.0.0-
|
|
44
|
-
"@vltpkg/
|
|
45
|
-
"@vltpkg/
|
|
46
|
-
"@vltpkg/
|
|
47
|
-
"@vltpkg/
|
|
48
|
-
"@vltpkg/
|
|
49
|
-
"@vltpkg/
|
|
50
|
-
"@vltpkg/
|
|
51
|
-
"@vltpkg/
|
|
52
|
-
"@vltpkg/
|
|
53
|
-
"@vltpkg/
|
|
35
|
+
"@vltpkg/dep-id": "0.0.0-5",
|
|
36
|
+
"@vltpkg/git": "0.0.0-5",
|
|
37
|
+
"@vltpkg/error-cause": "0.0.0-5",
|
|
38
|
+
"@vltpkg/graph": "0.0.0-5",
|
|
39
|
+
"@vltpkg/gui": "0.0.0-5",
|
|
40
|
+
"@vltpkg/init": "0.0.0-5",
|
|
41
|
+
"@vltpkg/output": "0.0.0-5",
|
|
42
|
+
"@vltpkg/package-info": "0.0.0-5",
|
|
43
|
+
"@vltpkg/package-json": "0.0.0-5",
|
|
44
|
+
"@vltpkg/promise-spawn": "0.0.0-5",
|
|
45
|
+
"@vltpkg/query": "0.0.0-5",
|
|
46
|
+
"@vltpkg/registry-client": "0.0.0-5",
|
|
47
|
+
"@vltpkg/run": "0.0.0-5",
|
|
48
|
+
"@vltpkg/dot-prop": "0.0.0-5",
|
|
49
|
+
"@vltpkg/server": "0.0.0-5",
|
|
50
|
+
"@vltpkg/url-open": "0.0.0-5",
|
|
51
|
+
"@vltpkg/spec": "0.0.0-5",
|
|
52
|
+
"@vltpkg/types": "0.0.0-5",
|
|
53
|
+
"@vltpkg/workspaces": "0.0.0-5",
|
|
54
|
+
"@vltpkg/xdg": "0.0.0-5"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
57
|
"@eslint/js": "^9.20.0",
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A list of folder names that are ignored when reading the user's home dir.
|
|
3
|
-
*
|
|
4
|
-
* Note: these are lower-case, must be compared case-insensitively.
|
|
5
|
-
*/
|
|
6
|
-
export declare const ignoredHomedirFolderNames: string[];
|
|
7
|
-
//# sourceMappingURL=ignored-homedir-folder-names.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ignored-homedir-folder-names.d.ts","sourceRoot":"","sources":["../../src/ignored-homedir-folder-names.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,UA8BrC,CAAA"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A list of folder names that are ignored when reading the user's home dir.
|
|
3
|
-
*
|
|
4
|
-
* Note: these are lower-case, must be compared case-insensitively.
|
|
5
|
-
*/
|
|
6
|
-
export const ignoredHomedirFolderNames = [
|
|
7
|
-
'downloads',
|
|
8
|
-
'movies',
|
|
9
|
-
'music',
|
|
10
|
-
'pictures',
|
|
11
|
-
'private',
|
|
12
|
-
'library',
|
|
13
|
-
'desktop',
|
|
14
|
-
'dropbox',
|
|
15
|
-
].concat(process.platform === 'darwin' ?
|
|
16
|
-
[
|
|
17
|
-
'public',
|
|
18
|
-
'private',
|
|
19
|
-
'applications',
|
|
20
|
-
'applications (parallels)',
|
|
21
|
-
'sites',
|
|
22
|
-
'sync',
|
|
23
|
-
]
|
|
24
|
-
: process.platform === 'win32' ?
|
|
25
|
-
[
|
|
26
|
-
'appdata',
|
|
27
|
-
'application data',
|
|
28
|
-
'favorites',
|
|
29
|
-
'links',
|
|
30
|
-
'videos',
|
|
31
|
-
'contacts',
|
|
32
|
-
'searches',
|
|
33
|
-
]
|
|
34
|
-
: ['videos', 'public']);
|
|
35
|
-
//# sourceMappingURL=ignored-homedir-folder-names.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ignored-homedir-folder-names.js","sourceRoot":"","sources":["../../src/ignored-homedir-folder-names.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,WAAW;IACX,QAAQ;IACR,OAAO;IACP,UAAU;IACV,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC,MAAM,CACN,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC7B;QACE,QAAQ;QACR,SAAS;QACT,cAAc;QACd,0BAA0B;QAC1B,OAAO;QACP,MAAM;KACP;IACH,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAC9B;YACE,SAAS;YACT,kBAAkB;YAClB,WAAW;YACX,OAAO;YACP,QAAQ;YACR,UAAU;YACV,UAAU;SACX;QACH,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACvB,CAAA","sourcesContent":["/**\n * A list of folder names that are ignored when reading the user's home dir.\n *\n * Note: these are lower-case, must be compared case-insensitively.\n */\nexport const ignoredHomedirFolderNames = [\n 'downloads',\n 'movies',\n 'music',\n 'pictures',\n 'private',\n 'library',\n 'desktop',\n 'dropbox',\n].concat(\n process.platform === 'darwin' ?\n [\n 'public',\n 'private',\n 'applications',\n 'applications (parallels)',\n 'sites',\n 'sync',\n ]\n : process.platform === 'win32' ?\n [\n 'appdata',\n 'application data',\n 'favorites',\n 'links',\n 'videos',\n 'contacts',\n 'searches',\n ]\n : ['videos', 'public'],\n)\n"]}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { PackageJson } from '@vltpkg/package-json';
|
|
2
|
-
import type { Manifest } from '@vltpkg/types';
|
|
3
|
-
import type { PathBase, PathScurry } from 'path-scurry';
|
|
4
|
-
export type ProjectTools = 'vlt' | 'node' | 'deno' | 'bun' | 'npm' | 'pnpm' | 'yarn' | 'js';
|
|
5
|
-
export type DashboardProjectData = {
|
|
6
|
-
name: string;
|
|
7
|
-
readablePath: string;
|
|
8
|
-
path: string;
|
|
9
|
-
manifest: Manifest;
|
|
10
|
-
tools: ProjectTools[];
|
|
11
|
-
mtime?: number;
|
|
12
|
-
};
|
|
13
|
-
export type GraphProjectData = {
|
|
14
|
-
tools: ProjectTools[];
|
|
15
|
-
vltInstalled: boolean;
|
|
16
|
-
};
|
|
17
|
-
export declare const isProjectTools: (str: string) => str is ProjectTools;
|
|
18
|
-
export declare const asProjectTools: (str: string) => ProjectTools;
|
|
19
|
-
export declare const inferTools: (manifest: Manifest, folder: PathBase, scurry: PathScurry) => ProjectTools[];
|
|
20
|
-
export declare const getReadablePath: (path: string) => string;
|
|
21
|
-
export declare const getDashboardProjectData: (folder: PathBase, { packageJson, scurry, }: {
|
|
22
|
-
packageJson: PackageJson;
|
|
23
|
-
scurry: PathScurry;
|
|
24
|
-
}) => DashboardProjectData | undefined;
|
|
25
|
-
export declare const getGraphProjectData: ({ packageJson, scurry, }: {
|
|
26
|
-
packageJson: PackageJson;
|
|
27
|
-
scurry: PathScurry;
|
|
28
|
-
}, folder?: PathBase) => {
|
|
29
|
-
tools: ProjectTools[];
|
|
30
|
-
vltInstalled: boolean;
|
|
31
|
-
};
|
|
32
|
-
//# sourceMappingURL=project-info.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-info.d.ts","sourceRoot":"","sources":["../../src/project-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEvD,MAAM,MAAM,YAAY,GACpB,KAAK,GACL,MAAM,GACN,MAAM,GACN,KAAK,GACL,KAAK,GACL,MAAM,GACN,MAAM,GACN,IAAI,CAAA;AAER,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,YAAY,EAAE,OAAO,CAAA;CACtB,CAAA;AAwBD,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,GAAG,IAAI,YACf,CAAA;AAErC,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,YAK5C,CAAA;AAED,eAAO,MAAM,UAAU,aACX,QAAQ,UACV,QAAQ,UACR,UAAU,mBA4BnB,CAAA;AAED,eAAO,MAAM,eAAe,SAAU,MAAM,WACd,CAAA;AAE9B,eAAO,MAAM,uBAAuB,WAC1B,QAAQ,4BAIb;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,KAClD,oBAAoB,GAAG,SAgBzB,CAAA;AAED,eAAO,MAAM,mBAAmB,6BAI3B;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,WAC1C,QAAQ;;;CAuBlB,CAAA"}
|
package/dist/esm/project-info.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
const knownTools = new Map([
|
|
3
|
-
[
|
|
4
|
-
'vlt',
|
|
5
|
-
[
|
|
6
|
-
'vlt-lock.json',
|
|
7
|
-
'vlt-workspaces.json',
|
|
8
|
-
'vlt.json',
|
|
9
|
-
'node_modules/.vlt',
|
|
10
|
-
'node_modules/.vlt-lock.json',
|
|
11
|
-
],
|
|
12
|
-
],
|
|
13
|
-
['node', []],
|
|
14
|
-
['deno', ['deno.json']],
|
|
15
|
-
['bun', ['bun.lockb', 'bunfig.toml']],
|
|
16
|
-
['npm', ['package-lock.json', 'node_modules/.package-lock.json']],
|
|
17
|
-
[
|
|
18
|
-
'pnpm',
|
|
19
|
-
['pnpm-lock.yaml', 'pnpm-workspace.yaml', 'node_modules/.pnpm'],
|
|
20
|
-
],
|
|
21
|
-
['yarn', ['yarn.lock']],
|
|
22
|
-
]);
|
|
23
|
-
export const isProjectTools = (str) => knownTools.has(str);
|
|
24
|
-
export const asProjectTools = (str) => {
|
|
25
|
-
if (!isProjectTools(str)) {
|
|
26
|
-
throw new Error(`Invalid dashboard tool: ${str}`);
|
|
27
|
-
}
|
|
28
|
-
return str;
|
|
29
|
-
};
|
|
30
|
-
export const inferTools = (manifest, folder, scurry) => {
|
|
31
|
-
const tools = [];
|
|
32
|
-
// check if known tools names are found in the manifest file
|
|
33
|
-
for (const knownName of knownTools.keys()) {
|
|
34
|
-
if (Object.hasOwn(manifest, knownName) ||
|
|
35
|
-
(manifest.engines && Object.hasOwn(manifest.engines, knownName))) {
|
|
36
|
-
tools.push(asProjectTools(knownName));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
// check for known file names
|
|
40
|
-
for (const [knownName, files] of knownTools) {
|
|
41
|
-
for (const file of files) {
|
|
42
|
-
if (scurry.lstatSync(folder.resolve(file))) {
|
|
43
|
-
tools.push(asProjectTools(knownName));
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
// defaults to js if no tools are found
|
|
49
|
-
if (tools.length === 0) {
|
|
50
|
-
tools.push('js');
|
|
51
|
-
}
|
|
52
|
-
return tools;
|
|
53
|
-
};
|
|
54
|
-
export const getReadablePath = (path) => path.replace(homedir(), '~');
|
|
55
|
-
export const getDashboardProjectData = (folder, { packageJson, scurry, }) => {
|
|
56
|
-
let manifest;
|
|
57
|
-
try {
|
|
58
|
-
manifest = packageJson.read(folder.fullpath());
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const path = folder.fullpath();
|
|
64
|
-
return {
|
|
65
|
-
name: manifest.name || folder.name,
|
|
66
|
-
readablePath: getReadablePath(path),
|
|
67
|
-
path,
|
|
68
|
-
manifest,
|
|
69
|
-
tools: inferTools(manifest, folder, scurry),
|
|
70
|
-
mtime: folder.lstatSync()?.mtimeMs,
|
|
71
|
-
};
|
|
72
|
-
};
|
|
73
|
-
export const getGraphProjectData = ({ packageJson, scurry, }, folder) => {
|
|
74
|
-
if (!folder) {
|
|
75
|
-
return {
|
|
76
|
-
tools: [],
|
|
77
|
-
vltInstalled: false,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
return {
|
|
81
|
-
tools: inferTools(packageJson.read(folder.fullpath()), folder, scurry),
|
|
82
|
-
vltInstalled: !!scurry
|
|
83
|
-
.lstatSync(folder.resolve('node_modules/.vlt'))
|
|
84
|
-
?.isDirectory() ||
|
|
85
|
-
!!scurry
|
|
86
|
-
.lstatSync(folder.resolve('node_modules/.vlt-lock.json'))
|
|
87
|
-
?.isFile(),
|
|
88
|
-
};
|
|
89
|
-
};
|
|
90
|
-
//# sourceMappingURL=project-info.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-info.js","sourceRoot":"","sources":["../../src/project-info.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageJson } from '@vltpkg/package-json'\nimport type { Manifest } from '@vltpkg/types'\nimport { homedir } from 'node:os'\nimport type { PathBase, PathScurry } from 'path-scurry'\n\nexport type ProjectTools =\n | 'vlt'\n | 'node'\n | 'deno'\n | 'bun'\n | 'npm'\n | 'pnpm'\n | 'yarn'\n | 'js'\n\nexport type DashboardProjectData = {\n name: string\n readablePath: string\n path: string\n manifest: Manifest\n tools: ProjectTools[]\n mtime?: number\n}\n\nexport type GraphProjectData = {\n tools: ProjectTools[]\n vltInstalled: boolean\n}\n\nconst knownTools = new Map<ProjectTools, string[]>([\n [\n 'vlt',\n [\n 'vlt-lock.json',\n 'vlt-workspaces.json',\n 'vlt.json',\n 'node_modules/.vlt',\n 'node_modules/.vlt-lock.json',\n ],\n ],\n ['node', []],\n ['deno', ['deno.json']],\n ['bun', ['bun.lockb', 'bunfig.toml']],\n ['npm', ['package-lock.json', 'node_modules/.package-lock.json']],\n [\n 'pnpm',\n ['pnpm-lock.yaml', 'pnpm-workspace.yaml', 'node_modules/.pnpm'],\n ],\n ['yarn', ['yarn.lock']],\n])\n\nexport const isProjectTools = (str: string): str is ProjectTools =>\n knownTools.has(str as ProjectTools)\n\nexport const asProjectTools = (str: string): ProjectTools => {\n if (!isProjectTools(str)) {\n throw new Error(`Invalid dashboard tool: ${str}`)\n }\n return str\n}\n\nexport const inferTools = (\n manifest: Manifest,\n folder: PathBase,\n scurry: PathScurry,\n) => {\n const tools: ProjectTools[] = []\n // check if known tools names are found in the manifest file\n for (const knownName of knownTools.keys()) {\n if (\n Object.hasOwn(manifest, knownName) ||\n (manifest.engines && Object.hasOwn(manifest.engines, knownName))\n ) {\n tools.push(asProjectTools(knownName))\n }\n }\n\n // check for known file names\n for (const [knownName, files] of knownTools) {\n for (const file of files) {\n if (scurry.lstatSync(folder.resolve(file))) {\n tools.push(asProjectTools(knownName))\n break\n }\n }\n }\n\n // defaults to js if no tools are found\n if (tools.length === 0) {\n tools.push('js')\n }\n return tools\n}\n\nexport const getReadablePath = (path: string) =>\n path.replace(homedir(), '~')\n\nexport const getDashboardProjectData = (\n folder: PathBase,\n {\n packageJson,\n scurry,\n }: { packageJson: PackageJson; scurry: PathScurry },\n): DashboardProjectData | undefined => {\n let manifest\n try {\n manifest = packageJson.read(folder.fullpath())\n } catch {\n return\n }\n const path = folder.fullpath()\n return {\n name: manifest.name || folder.name,\n readablePath: getReadablePath(path),\n path,\n manifest,\n tools: inferTools(manifest, folder, scurry),\n mtime: folder.lstatSync()?.mtimeMs,\n }\n}\n\nexport const getGraphProjectData = (\n {\n packageJson,\n scurry,\n }: { packageJson: PackageJson; scurry: PathScurry },\n folder?: PathBase,\n) => {\n if (!folder) {\n return {\n tools: [],\n vltInstalled: false,\n }\n }\n\n return {\n tools: inferTools(\n packageJson.read(folder.fullpath()),\n folder,\n scurry,\n ),\n vltInstalled:\n !!scurry\n .lstatSync(folder.resolve('node_modules/.vlt'))\n ?.isDirectory() ||\n !!scurry\n .lstatSync(folder.resolve('node_modules/.vlt-lock.json'))\n ?.isFile(),\n }\n}\n"]}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { PathBase, PathScurry } from 'path-scurry';
|
|
2
|
-
type ProjectFolderOptions = {
|
|
3
|
-
/**
|
|
4
|
-
* The standard path to read from, defaults to the user's home directory.
|
|
5
|
-
*/
|
|
6
|
-
path?: string;
|
|
7
|
-
/**
|
|
8
|
-
* A {@link PathScurry} object, for use in globs.
|
|
9
|
-
*/
|
|
10
|
-
scurry: PathScurry;
|
|
11
|
-
/**
|
|
12
|
-
* A list of user defined project paths set in the configuration file.
|
|
13
|
-
*/
|
|
14
|
-
userDefinedProjectPaths: string[];
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* Retrieves folders from a given directory, if that directory is
|
|
18
|
-
* recognized to be the current cli project root folder then we
|
|
19
|
-
* proceed to read its siblings.
|
|
20
|
-
*
|
|
21
|
-
* Traverses nested directory recursively until project folders can
|
|
22
|
-
* be find, always stopping at the first level where a package.json
|
|
23
|
-
* is present.
|
|
24
|
-
*/
|
|
25
|
-
export declare const readProjectFolders: ({ path, scurry, userDefinedProjectPaths, }: ProjectFolderOptions) => Promise<PathBase[]>;
|
|
26
|
-
export {};
|
|
27
|
-
//# sourceMappingURL=read-project-folders.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read-project-folders.d.ts","sourceRoot":"","sources":["../../src/read-project-folders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAOvD,KAAK,oBAAoB,GAAG;IAC1B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;OAEG;IACH,uBAAuB,EAAE,MAAM,EAAE,CAAA;CAClC,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,+CAI5B,oBAAoB,KAAG,OAAO,CAAC,QAAQ,EAAE,CAiC3C,CAAA"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { availableParallelism, homedir } from 'os';
|
|
2
|
-
import { callLimit } from 'promise-call-limit';
|
|
3
|
-
import { ignoredHomedirFolderNames } from "./ignored-homedir-folder-names.js";
|
|
4
|
-
const limit = Math.max(availableParallelism() - 1, 1) * 8;
|
|
5
|
-
const home = homedir();
|
|
6
|
-
/**
|
|
7
|
-
* Retrieves folders from a given directory, if that directory is
|
|
8
|
-
* recognized to be the current cli project root folder then we
|
|
9
|
-
* proceed to read its siblings.
|
|
10
|
-
*
|
|
11
|
-
* Traverses nested directory recursively until project folders can
|
|
12
|
-
* be find, always stopping at the first level where a package.json
|
|
13
|
-
* is present.
|
|
14
|
-
*/
|
|
15
|
-
export const readProjectFolders = async ({ path = home, scurry, userDefinedProjectPaths, }) => {
|
|
16
|
-
const result = [];
|
|
17
|
-
const homeEntry = scurry.cwd.resolve(home);
|
|
18
|
-
// read entry point folders to collect which ones
|
|
19
|
-
// should we recursively traverse to collect project folders
|
|
20
|
-
const paths = userDefinedProjectPaths.length ? userDefinedProjectPaths : [path];
|
|
21
|
-
const step = (entry) => async () => {
|
|
22
|
-
for (const child of await entry.readdir()) {
|
|
23
|
-
if (collectResult(child, result, scurry, entry === homeEntry)) {
|
|
24
|
-
traverse.push(step(child));
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
let traverse = (await Promise.all(paths.map(path => scurry.lstat(path))))
|
|
29
|
-
.filter(p => !!p)
|
|
30
|
-
.map(step);
|
|
31
|
-
// have to do it in phases this way because pushing into the queue
|
|
32
|
-
// during the promise-call-limit confuses its tracking.
|
|
33
|
-
let t;
|
|
34
|
-
do {
|
|
35
|
-
t = traverse;
|
|
36
|
-
traverse = [];
|
|
37
|
-
await callLimit(t, { limit });
|
|
38
|
-
} while (traverse.length);
|
|
39
|
-
return result;
|
|
40
|
-
};
|
|
41
|
-
// collectResult will return true in case it finds a directory that
|
|
42
|
-
// has no package.json file in it but that can still be potentially
|
|
43
|
-
// recursive traversed in the future
|
|
44
|
-
const collectResult = (entry, result, scurry, fromHome) => {
|
|
45
|
-
if (!entry.isDirectory() ||
|
|
46
|
-
entry.isSymbolicLink() ||
|
|
47
|
-
entry.name === 'node_modules' ||
|
|
48
|
-
(fromHome &&
|
|
49
|
-
ignoredHomedirFolderNames.includes(entry.name.toLowerCase())) ||
|
|
50
|
-
entry.name.startsWith('.')) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
const resolved = entry.fullpath();
|
|
54
|
-
const statPackageJson = scurry.lstatSync(`${resolved}/package.json`);
|
|
55
|
-
const hasDotGit = scurry.lstatSync(`${resolved}/.git`);
|
|
56
|
-
const hasValidPackageJson = statPackageJson &&
|
|
57
|
-
statPackageJson.isFile() &&
|
|
58
|
-
!statPackageJson.isSymbolicLink();
|
|
59
|
-
if (hasValidPackageJson)
|
|
60
|
-
result.push(entry);
|
|
61
|
-
// do not descend if we're in a root of a git project or C project
|
|
62
|
-
// TODO: make this more consistent with how we determine
|
|
63
|
-
// "project-root-ness" in the walk up the folder tree.
|
|
64
|
-
return !hasDotGit && !hasValidPackageJson;
|
|
65
|
-
};
|
|
66
|
-
//# sourceMappingURL=read-project-folders.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read-project-folders.js","sourceRoot":"","sources":["../../src/read-project-folders.ts"],"names":[],"mappings":"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","sourcesContent":["import { availableParallelism, homedir } from 'os'\nimport type { PathBase, PathScurry } from 'path-scurry'\nimport { callLimit } from 'promise-call-limit'\nimport { ignoredHomedirFolderNames } from './ignored-homedir-folder-names.ts'\n\nconst limit = Math.max(availableParallelism() - 1, 1) * 8\nconst home = homedir()\n\ntype ProjectFolderOptions = {\n /**\n * The standard path to read from, defaults to the user's home directory.\n */\n path?: string\n /**\n * A {@link PathScurry} object, for use in globs.\n */\n scurry: PathScurry\n /**\n * A list of user defined project paths set in the configuration file.\n */\n userDefinedProjectPaths: string[]\n}\n\n/**\n * Retrieves folders from a given directory, if that directory is\n * recognized to be the current cli project root folder then we\n * proceed to read its siblings.\n *\n * Traverses nested directory recursively until project folders can\n * be find, always stopping at the first level where a package.json\n * is present.\n */\nexport const readProjectFolders = async ({\n path = home,\n scurry,\n userDefinedProjectPaths,\n}: ProjectFolderOptions): Promise<PathBase[]> => {\n const result: PathBase[] = []\n const homeEntry = scurry.cwd.resolve(home)\n\n // read entry point folders to collect which ones\n // should we recursively traverse to collect project folders\n const paths =\n userDefinedProjectPaths.length ? userDefinedProjectPaths : [path]\n\n const step = (entry: PathBase) => async () => {\n for (const child of await entry.readdir()) {\n if (collectResult(child, result, scurry, entry === homeEntry)) {\n traverse.push(step(child))\n }\n }\n }\n\n let traverse = (\n await Promise.all(paths.map(path => scurry.lstat(path)))\n )\n .filter(p => !!p)\n .map(step)\n\n // have to do it in phases this way because pushing into the queue\n // during the promise-call-limit confuses its tracking.\n let t: (() => Promise<void>)[]\n do {\n t = traverse\n traverse = []\n await callLimit(t, { limit })\n } while (traverse.length)\n\n return result\n}\n\n// collectResult will return true in case it finds a directory that\n// has no package.json file in it but that can still be potentially\n// recursive traversed in the future\nconst collectResult = (\n entry: PathBase,\n result: PathBase[],\n scurry: PathScurry,\n fromHome: boolean,\n): boolean => {\n if (\n !entry.isDirectory() ||\n entry.isSymbolicLink() ||\n entry.name === 'node_modules' ||\n (fromHome &&\n ignoredHomedirFolderNames.includes(entry.name.toLowerCase())) ||\n entry.name.startsWith('.')\n ) {\n return false\n }\n\n const resolved = entry.fullpath()\n const statPackageJson = scurry.lstatSync(`${resolved}/package.json`)\n const hasDotGit = scurry.lstatSync(`${resolved}/.git`)\n const hasValidPackageJson =\n statPackageJson &&\n statPackageJson.isFile() &&\n !statPackageJson.isSymbolicLink()\n\n if (hasValidPackageJson) result.push(entry)\n\n // do not descend if we're in a root of a git project or C project\n // TODO: make this more consistent with how we determine\n // \"project-root-ness\" in the walk up the folder tree.\n return !hasDotGit && !hasValidPackageJson\n}\n"]}
|