@vltpkg/cli-sdk 0.0.0-2
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/LICENSE +15 -0
- package/README.md +20 -0
- package/dist/esm/commands/config.d.ts +5 -0
- package/dist/esm/commands/config.d.ts.map +1 -0
- package/dist/esm/commands/config.js +153 -0
- package/dist/esm/commands/config.js.map +1 -0
- package/dist/esm/commands/exec.d.ts +5 -0
- package/dist/esm/commands/exec.d.ts.map +1 -0
- package/dist/esm/commands/exec.js +22 -0
- package/dist/esm/commands/exec.js.map +1 -0
- package/dist/esm/commands/gui.d.ts +6 -0
- package/dist/esm/commands/gui.d.ts.map +1 -0
- package/dist/esm/commands/gui.js +14 -0
- package/dist/esm/commands/gui.js.map +1 -0
- package/dist/esm/commands/help.d.ts +4 -0
- package/dist/esm/commands/help.d.ts.map +1 -0
- package/dist/esm/commands/help.js +10 -0
- package/dist/esm/commands/help.js.map +1 -0
- package/dist/esm/commands/init.d.ts +9 -0
- package/dist/esm/commands/init.d.ts.map +1 -0
- package/dist/esm/commands/init.js +25 -0
- package/dist/esm/commands/init.js.map +1 -0
- package/dist/esm/commands/install/reporter.d.ts +10 -0
- package/dist/esm/commands/install/reporter.d.ts.map +1 -0
- package/dist/esm/commands/install/reporter.js +66 -0
- package/dist/esm/commands/install/reporter.js.map +1 -0
- package/dist/esm/commands/install-exec.d.ts +4 -0
- package/dist/esm/commands/install-exec.d.ts.map +1 -0
- package/dist/esm/commands/install-exec.js +13 -0
- package/dist/esm/commands/install-exec.js.map +1 -0
- package/dist/esm/commands/install.d.ts +7 -0
- package/dist/esm/commands/install.d.ts.map +1 -0
- package/dist/esm/commands/install.js +21 -0
- package/dist/esm/commands/install.js.map +1 -0
- package/dist/esm/commands/list.d.ts +15 -0
- package/dist/esm/commands/list.d.ts.map +1 -0
- package/dist/esm/commands/list.js +91 -0
- package/dist/esm/commands/list.js.map +1 -0
- package/dist/esm/commands/login.d.ts +4 -0
- package/dist/esm/commands/login.d.ts.map +1 -0
- package/dist/esm/commands/login.js +13 -0
- package/dist/esm/commands/login.js.map +1 -0
- package/dist/esm/commands/logout.d.ts +4 -0
- package/dist/esm/commands/logout.d.ts.map +1 -0
- package/dist/esm/commands/logout.js +13 -0
- package/dist/esm/commands/logout.js.map +1 -0
- package/dist/esm/commands/pkg.d.ts +8 -0
- package/dist/esm/commands/pkg.d.ts.map +1 -0
- package/dist/esm/commands/pkg.js +121 -0
- package/dist/esm/commands/pkg.js.map +1 -0
- package/dist/esm/commands/query.d.ts +16 -0
- package/dist/esm/commands/query.d.ts.map +1 -0
- package/dist/esm/commands/query.js +75 -0
- package/dist/esm/commands/query.js.map +1 -0
- package/dist/esm/commands/run-exec.d.ts +5 -0
- package/dist/esm/commands/run-exec.d.ts.map +1 -0
- package/dist/esm/commands/run-exec.js +13 -0
- package/dist/esm/commands/run-exec.js.map +1 -0
- package/dist/esm/commands/run.d.ts +5 -0
- package/dist/esm/commands/run.d.ts.map +1 -0
- package/dist/esm/commands/run.js +39 -0
- package/dist/esm/commands/run.js.map +1 -0
- package/dist/esm/commands/token.d.ts +4 -0
- package/dist/esm/commands/token.d.ts.map +1 -0
- package/dist/esm/commands/token.js +30 -0
- package/dist/esm/commands/token.js.map +1 -0
- package/dist/esm/commands/uninstall.d.ts +4 -0
- package/dist/esm/commands/uninstall.d.ts.map +1 -0
- package/dist/esm/commands/uninstall.js +15 -0
- package/dist/esm/commands/uninstall.js.map +1 -0
- package/dist/esm/commands/whoami.d.ts +11 -0
- package/dist/esm/commands/whoami.d.ts.map +1 -0
- package/dist/esm/commands/whoami.js +19 -0
- package/dist/esm/commands/whoami.js.map +1 -0
- package/dist/esm/config/definition.d.ts +286 -0
- package/dist/esm/config/definition.d.ts.map +1 -0
- package/dist/esm/config/definition.js +475 -0
- package/dist/esm/config/definition.js.map +1 -0
- package/dist/esm/config/index.d.ts +213 -0
- package/dist/esm/config/index.d.ts.map +1 -0
- package/dist/esm/config/index.js +504 -0
- package/dist/esm/config/index.js.map +1 -0
- package/dist/esm/config/merge.d.ts +2 -0
- package/dist/esm/config/merge.d.ts.map +1 -0
- package/dist/esm/config/merge.js +23 -0
- package/dist/esm/config/merge.js.map +1 -0
- package/dist/esm/config/usage.d.ts +18 -0
- package/dist/esm/config/usage.d.ts.map +1 -0
- package/dist/esm/config/usage.js +40 -0
- package/dist/esm/config/usage.js.map +1 -0
- package/dist/esm/exec-command.d.ts +34 -0
- package/dist/esm/exec-command.d.ts.map +1 -0
- package/dist/esm/exec-command.js +159 -0
- package/dist/esm/exec-command.js.map +1 -0
- package/dist/esm/ignored-homedir-folder-names.d.ts +7 -0
- package/dist/esm/ignored-homedir-folder-names.d.ts.map +1 -0
- package/dist/esm/ignored-homedir-folder-names.js +35 -0
- package/dist/esm/ignored-homedir-folder-names.js.map +1 -0
- package/dist/esm/index.d.ts +17 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +47 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/output.d.ts +25 -0
- package/dist/esm/output.d.ts.map +1 -0
- package/dist/esm/output.js +86 -0
- package/dist/esm/output.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/parse-add-remove-args.d.ts +22 -0
- package/dist/esm/parse-add-remove-args.d.ts.map +1 -0
- package/dist/esm/parse-add-remove-args.js +71 -0
- package/dist/esm/parse-add-remove-args.js.map +1 -0
- package/dist/esm/print-err.d.ts +3 -0
- package/dist/esm/print-err.d.ts.map +1 -0
- package/dist/esm/print-err.js +47 -0
- package/dist/esm/print-err.js.map +1 -0
- package/dist/esm/project-info.d.ts +32 -0
- package/dist/esm/project-info.d.ts.map +1 -0
- package/dist/esm/project-info.js +90 -0
- package/dist/esm/project-info.js.map +1 -0
- package/dist/esm/read-password.d.ts +8 -0
- package/dist/esm/read-password.d.ts.map +1 -0
- package/dist/esm/read-password.js +33 -0
- package/dist/esm/read-password.js.map +1 -0
- package/dist/esm/read-project-folders.d.ts +27 -0
- package/dist/esm/read-project-folders.d.ts.map +1 -0
- package/dist/esm/read-project-folders.js +66 -0
- package/dist/esm/read-project-folders.js.map +1 -0
- package/dist/esm/start-gui.d.ts +36 -0
- package/dist/esm/start-gui.d.ts.map +1 -0
- package/dist/esm/start-gui.js +357 -0
- package/dist/esm/start-gui.js.map +1 -0
- package/dist/esm/view.d.ts +31 -0
- package/dist/esm/view.d.ts.map +1 -0
- package/dist/esm/view.js +31 -0
- package/dist/esm/view.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-add-remove-args.js","sourceRoot":"","sources":["../../src/parse-add-remove-args.ts"],"names":[],"mappings":"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","sourcesContent":["import { joinDepIDTuple } from '@vltpkg/dep-id'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { DependencyTypeShort } from '@vltpkg/types'\nimport { asDependency } from '@vltpkg/graph'\nimport type {\n AddImportersDependenciesMap,\n Dependency,\n RemoveImportersDependenciesMap,\n} from '@vltpkg/graph'\nimport type { LoadedConfig } from './config/index.ts'\nimport { Spec } from '@vltpkg/spec'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { Monorepo } from '@vltpkg/workspaces'\n\nexport type ParsedAddArgs = {\n add: AddImportersDependenciesMap\n}\n\nexport type ParsedRemoveArgs = {\n remove: RemoveImportersDependenciesMap\n}\n\nexport type SaveTypes = {\n 'save-dev'?: boolean\n 'save-optional'?: boolean\n 'save-peer'?: boolean\n 'save-prod'?: boolean\n}\n\nexport type WorkspaceTypes = {\n workspace?: string[]\n 'workspace-group'?: string[]\n}\n\nconst rootDepID = joinDepIDTuple(['file', '.'])\n\n/**\n * Get the list of importers that are currently selected\n * in {@link WorkspaceTypes}.\n */\nconst getImporters = (\n opts: WorkspaceTypes,\n monorepo?: Monorepo,\n): Set<DepID> => {\n const res = new Set<DepID>()\n\n // collects DepID references to any selected workspace\n if (monorepo) {\n for (const ws of monorepo.filter(opts)) {\n res.add(ws.id)\n }\n }\n\n // if no references were found, default behavior is to point to project root\n if (!res.size) {\n res.add(rootDepID)\n }\n\n return res\n}\n\nconst getType = (opts: SaveTypes): DependencyTypeShort =>\n opts['save-prod'] ? 'prod'\n : opts['save-dev'] ? 'dev'\n : opts['save-peer'] ?\n opts['save-optional'] ?\n 'peerOptional'\n : 'peer'\n : opts['save-optional'] ? 'optional'\n : 'prod'\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 parseAddArgs = (\n config: LoadedConfig,\n monorepo?: Monorepo,\n): ParsedAddArgs => {\n const add: AddImportersDependenciesMap =\n new AddImportersDependenciesMapImpl()\n const items = config.positionals\n const type = getType(config.values)\n const importers = getImporters(config.values, monorepo)\n const newDependencies = new Map<string, Dependency>()\n const specOptions: SpecOptions = config.options\n\n // nameless spec definitions will need to use their full\n // stringified spec result instead of their name in order\n // to have an unique key name in the resulting Map\n const getName = (s: Spec): string =>\n s.name === '(unknown)' ? s.spec : s.name\n\n for (const item of items) {\n const spec = Spec.parseArgs(item, specOptions)\n newDependencies.set(getName(spec), asDependency({ spec, type }))\n add.modifiedDependencies = true\n }\n\n for (const importer of importers) {\n add.set(importer, newDependencies)\n }\n\n return {\n add,\n }\n}\n\nexport const parseRemoveArgs = (\n config: LoadedConfig,\n monorepo?: Monorepo,\n): ParsedRemoveArgs => {\n const remove: RemoveImportersDependenciesMap =\n new RemoveImportersDependenciesMapImpl()\n const importers = getImporters(config.values, monorepo)\n\n for (const importer of importers) {\n remove.set(importer, new Set(config.positionals))\n remove.modifiedDependencies = true\n }\n\n return {\n remove,\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-err.d.ts","sourceRoot":"","sources":["../../src/print-err.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI9C,eAAO,MAAM,QAAQ,QACd,OAAO,SACL,YAAY,UACX,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,SAUlC,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { isErrorRoot } from '@vltpkg/error-cause';
|
|
2
|
+
// returns true if error was printed nicely already
|
|
3
|
+
export const printErr = (err, usage, stderr) => {
|
|
4
|
+
if (!isErrorRoot(err)) {
|
|
5
|
+
// TODO: print _something_ here, but we're in weird broken territory
|
|
6
|
+
// don't just dump it and flood the terminal, though, maybe sniff for code
|
|
7
|
+
// message, stack, etc?
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (isErrorRoot(err) && print(err, usage, stderr))
|
|
11
|
+
return;
|
|
12
|
+
stderr(err);
|
|
13
|
+
};
|
|
14
|
+
const print = (err, usage, stderr) => {
|
|
15
|
+
switch (err.cause.code) {
|
|
16
|
+
case 'EUSAGE': {
|
|
17
|
+
stderr(usage().usage());
|
|
18
|
+
stderr(`Error: ${err.message}`);
|
|
19
|
+
if (err.cause.found) {
|
|
20
|
+
stderr(` Found: ${err.cause.found}`);
|
|
21
|
+
}
|
|
22
|
+
if (err.cause.validOptions) {
|
|
23
|
+
stderr(` Valid options: ${err.cause.validOptions.join(', ')}`);
|
|
24
|
+
}
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
case 'ERESOLVE': {
|
|
28
|
+
stderr(`Resolve Error: ${err.message}`);
|
|
29
|
+
const { url, from, response, spec } = err.cause;
|
|
30
|
+
if (url) {
|
|
31
|
+
stderr(` While fetching: ${url}`);
|
|
32
|
+
}
|
|
33
|
+
if (spec) {
|
|
34
|
+
stderr(` To satisfy: ${spec}`);
|
|
35
|
+
}
|
|
36
|
+
if (from) {
|
|
37
|
+
stderr(` From: ${from}`);
|
|
38
|
+
}
|
|
39
|
+
if (response) {
|
|
40
|
+
stderr('Response:', response);
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=print-err.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-err.js","sourceRoot":"","sources":["../../src/print-err.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAKjD,mDAAmD;AACnD,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,GAAY,EACZ,KAAmB,EACnB,MAAiC,EACjC,EAAE;IACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,oEAAoE;QACpE,0EAA0E;QAC1E,uBAAuB;QACvB,OAAM;IACR,CAAC;IACD,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC;QAAE,OAAM;IACzD,MAAM,CAAC,GAAG,CAAC,CAAA;AACb,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CACZ,GAAyB,EACzB,KAAmB,EACnB,MAAiC,EACxB,EAAE;IACX,QAAQ,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;YACvB,MAAM,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YAC/B,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACpB,MAAM,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;YACvC,CAAC;YACD,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC3B,MAAM,CACJ,oBAAoB,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxD,CAAA;YACH,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YACvC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,CAAA;YAC/C,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAA;YACpC,CAAC;YACD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,iBAAiB,IAAqB,EAAE,CAAC,CAAA;YAClD,CAAC;YACD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAA;YAC3B,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YAC/B,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { isErrorRoot } from '@vltpkg/error-cause'\nimport type { ErrorWithCauseObject } from '@vltpkg/error-cause'\nimport type { CommandUsage } from './index.ts'\nimport type { Spec } from '@vltpkg/spec'\n\n// returns true if error was printed nicely already\nexport const printErr = (\n err: unknown,\n usage: CommandUsage,\n stderr: (...a: unknown[]) => void,\n) => {\n if (!isErrorRoot(err)) {\n // TODO: print _something_ here, but we're in weird broken territory\n // don't just dump it and flood the terminal, though, maybe sniff for code\n // message, stack, etc?\n return\n }\n if (isErrorRoot(err) && print(err, usage, stderr)) return\n stderr(err)\n}\n\nconst print = (\n err: ErrorWithCauseObject,\n usage: CommandUsage,\n stderr: (...a: unknown[]) => void,\n): boolean => {\n switch (err.cause.code) {\n case 'EUSAGE': {\n stderr(usage().usage())\n stderr(`Error: ${err.message}`)\n if (err.cause.found) {\n stderr(` Found: ${err.cause.found}`)\n }\n if (err.cause.validOptions) {\n stderr(\n ` Valid options: ${err.cause.validOptions.join(', ')}`,\n )\n }\n return true\n }\n\n case 'ERESOLVE': {\n stderr(`Resolve Error: ${err.message}`)\n const { url, from, response, spec } = err.cause\n if (url) {\n stderr(` While fetching: ${url}`)\n }\n if (spec) {\n stderr(` To satisfy: ${spec as string | Spec}`)\n }\n if (from) {\n stderr(` From: ${from}`)\n }\n if (response) {\n stderr('Response:', response)\n }\n return true\n }\n }\n\n return false\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type Streams = {
|
|
2
|
+
stdin: NodeJS.ReadableStream & {
|
|
3
|
+
setRawMode(mode: boolean): void;
|
|
4
|
+
};
|
|
5
|
+
stdout: NodeJS.WritableStream;
|
|
6
|
+
};
|
|
7
|
+
export declare const readPassword: (prompt: string, { stdin, stdout }?: Streams) => Promise<string>;
|
|
8
|
+
//# sourceMappingURL=read-password.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-password.d.ts","sourceRoot":"","sources":["../../src/read-password.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,OAAO,GAAG;IACpB,KAAK,EAAE,MAAM,CAAC,cAAc,GAAG;QAAE,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAA;IAClE,MAAM,EAAE,MAAM,CAAC,cAAc,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,YAAY,WACf,MAAM,sBACK,OAAO,KACzB,OAAO,CAAC,MAAM,CA4BhB,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { error } from '@vltpkg/error-cause';
|
|
2
|
+
export const readPassword = async (prompt, { stdin, stdout } = process) => {
|
|
3
|
+
let input = '';
|
|
4
|
+
stdout.write(prompt);
|
|
5
|
+
stdin.setRawMode(true);
|
|
6
|
+
await new Promise((res, rej) => {
|
|
7
|
+
stdin.on('data', (c) => {
|
|
8
|
+
// backspace
|
|
9
|
+
if (c.length === 1 && c[0] === 0x7f) {
|
|
10
|
+
input = input.substring(0, input.length - 1);
|
|
11
|
+
stdout.write('\x1b[1D \x1b[1D');
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
input += String(c);
|
|
15
|
+
if (/\r|\n|\x04|\x03/.test(input)) {
|
|
16
|
+
input = input.replace(/(\r|\n|\x04|\x03)/g, '');
|
|
17
|
+
stdin.setRawMode(false);
|
|
18
|
+
stdin.pause();
|
|
19
|
+
// x03 === ^C
|
|
20
|
+
if (c[c.length - 1] === 3) {
|
|
21
|
+
rej(error('canceled', { signal: 'SIGINT' }));
|
|
22
|
+
}
|
|
23
|
+
else
|
|
24
|
+
res();
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
stdout.write('*'.repeat(c.length));
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
return input;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=read-password.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-password.js","sourceRoot":"","sources":["../../src/read-password.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAO3C,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,MAAc,EACd,EAAE,KAAK,EAAE,MAAM,KAAc,OAAO,EACnB,EAAE;IACnB,IAAI,KAAK,GAAG,EAAE,CAAA;IACd,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACpB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACtB,MAAM,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACnC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YAC7B,YAAY;YACZ,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACpC,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAC5C,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;gBAC/B,OAAM;YACR,CAAC;YAED,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;YAClB,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAA;gBAC/C,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;gBACvB,KAAK,CAAC,KAAK,EAAE,CAAA;gBACb,aAAa;gBACb,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;gBAC9C,CAAC;;oBAAM,GAAG,EAAE,CAAA;YACd,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;YACpC,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { error } from '@vltpkg/error-cause'\n\nexport type Streams = {\n stdin: NodeJS.ReadableStream & { setRawMode(mode: boolean): void }\n stdout: NodeJS.WritableStream\n}\n\nexport const readPassword = async (\n prompt: string,\n { stdin, stdout }: Streams = process,\n): Promise<string> => {\n let input = ''\n stdout.write(prompt)\n stdin.setRawMode(true)\n await new Promise<void>((res, rej) => {\n stdin.on('data', (c: Buffer) => {\n // backspace\n if (c.length === 1 && c[0] === 0x7f) {\n input = input.substring(0, input.length - 1)\n stdout.write('\\x1b[1D \\x1b[1D')\n return\n }\n\n input += String(c)\n if (/\\r|\\n|\\x04|\\x03/.test(input)) {\n input = input.replace(/(\\r|\\n|\\x04|\\x03)/g, '')\n stdin.setRawMode(false)\n stdin.pause()\n // x03 === ^C\n if (c[c.length - 1] === 3) {\n rej(error('canceled', { signal: 'SIGINT' }))\n } else res()\n } else {\n stdout.write('*'.repeat(c.length))\n }\n })\n })\n return input\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AddImportersDependenciesMap, InstallOptions, RemoveImportersDependenciesMap, UninstallOptions } from '@vltpkg/graph';
|
|
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';
|
|
7
|
+
import type { LoadedConfig } from './config/index.ts';
|
|
8
|
+
import type { DashboardProjectData } from './project-info.ts';
|
|
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;
|
|
18
|
+
startingRoute?: string;
|
|
19
|
+
tmpDir?: string;
|
|
20
|
+
};
|
|
21
|
+
export type DashboardLocation = {
|
|
22
|
+
path: string;
|
|
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>>;
|
|
36
|
+
//# sourceMappingURL=start-gui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-gui.d.ts","sourceRoot":"","sources":["../../src/start-gui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,2BAA2B,EAE3B,cAAc,EACd,8BAA8B,EAC9B,gBAAgB,EACjB,MAAM,eAAe,CAAA;AAQtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAUxD,OAAO,KAAK,EACV,eAAe,EACf,MAAM,EACN,cAAc,EACf,MAAM,WAAW,CAAA;AAMlB,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAkB7D,MAAM,MAAM,iBAAiB,GAAG,MAAM,CACpC,MAAM,EACN,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAC/D,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;AAE7D,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,YAAY,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,yBAAyB,EAAE,iBAAiB,EAAE,CAAA;IAC9C,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,oBAAoB,EAAE,CAAA;CACjC,CAAA;AAgBD,eAAO,MAAM,mBAAmB,YACrB,cAAc,GAAG,WAAW,QAC/B,iBAAiB,KACtB,CAAC,cAAc,EAAE,2BAA2B,CAiB9C,CAAA;AAED,eAAO,MAAM,qBAAqB,YACvB,gBAAgB,QACnB,mBAAmB,KACxB,CAAC,gBAAgB,EAAE,8BAA8B,CAWnD,CAAA;AAED,eAAO,MAAM,mBAAmB,mBACd,QAAQ,EAAE,iBACX,MAAM,EAAE,UACf,UAAU,eACL,WAAW,2BA6CzB,CAAA;AAqLD,eAAO,MAAM,QAAQ,sDAMlB,eAAe,mEAwLjB,CAAA"}
|