@vlandoss/clibuddy 0.0.3 → 0.0.4-git-b7a02eb.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -135,9 +135,12 @@ var ShellService = class _ShellService {
135
135
  #shell;
136
136
  #options;
137
137
  constructor(options) {
138
- this.#options = options;
138
+ this.#options = Object.freeze(options);
139
139
  this.#shell = (0, import_zx.$)(options);
140
140
  }
141
+ get options() {
142
+ return this.#options;
143
+ }
141
144
  get $() {
142
145
  return this.#shell;
143
146
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/colors.ts","../src/services/pkg.ts","../src/services/shell/create.ts","../src/services/shell/shell.ts","../src/services/shell/utils.ts","../src/version.ts"],"sourcesContent":["export * from \"./colors\";\nexport * from \"./services\";\nexport * from \"./version\";\n","import chalk, { type ChalkInstance } from \"chalk\";\nimport supportsColor from \"supports-color\";\n\n// https://no-color.org/\nconst colorIsSupported = () => supportsColor.stdout && !process.env.NO_COLOR;\n\nconst identity = <T>(x: T) => x;\nconst safe = (style: ChalkInstance) => (colorIsSupported() ? style : identity);\n\nexport const colors = {\n blueBright: safe(chalk.blueBright),\n redBright: safe(chalk.redBright),\n greenBright: safe(chalk.greenBright),\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { findWorkspacePackages, type Project } from \"@pnpm/workspace.find-packages\";\nimport { readWorkspaceManifest } from \"@pnpm/workspace.read-manifest\";\nimport { type NormalizedPackageJson, readPackageUp } from \"read-package-up\";\n\nexport type { Project };\n\nexport class PkgService {\n #packageJson: NormalizedPackageJson;\n #dirPath: string;\n\n get dirPath() {\n return this.#dirPath;\n }\n\n get packageJson() {\n return this.#packageJson;\n }\n\n constructor(packageJson: NormalizedPackageJson, pkgPath: string) {\n this.#packageJson = packageJson;\n this.#dirPath = path.dirname(pkgPath);\n }\n\n info() {\n return {\n packageJson: this.#packageJson,\n dirPath: this.#dirPath,\n };\n }\n\n hasFile(name: string, dir?: string) {\n const filepath = dir ? path.join(dir, name) : this.#fromApp(name);\n return fs.existsSync(filepath);\n }\n\n isMonorepo() {\n return this.#packageJson.workspaces !== undefined || this.#hasPnpmWorkspace();\n }\n\n async getWorkspaceProjects() {\n let patterns: string[];\n\n if (this.#hasPnpmWorkspace()) {\n const manifest = await readWorkspaceManifest(this.#dirPath);\n\n if (!manifest) {\n throw new Error(\"Can't read pnpm workspace manifest\");\n }\n\n patterns = manifest.packages;\n } else {\n patterns = Array.isArray(this.#packageJson.workspaces)\n ? this.#packageJson.workspaces\n : (this.#packageJson.workspaces?.packages ?? []);\n }\n\n if (!Array.isArray(patterns) || patterns.some((p) => typeof p !== \"string\")) {\n throw new Error(\"Invalid workspace patterns\");\n }\n\n const projects = await findWorkspacePackages(this.#dirPath, {\n patterns,\n });\n\n const excludeRoot = (projects: Project[]) => {\n return projects.filter((project) => project.rootDir !== this.#dirPath);\n };\n\n return excludeRoot(projects);\n }\n\n #hasPnpmWorkspace() {\n return this.hasFile(\"pnpm-workspace.yaml\");\n }\n\n #fromApp(...args: string[]) {\n return path.join(this.#dirPath, ...args);\n }\n}\n\nexport async function createPkgService(cwd: string): Promise<PkgService | null> {\n const searchResult = await readPackageUp({ cwd });\n\n if (!searchResult) {\n return null;\n }\n\n const { packageJson, path } = searchResult;\n\n return new PkgService(packageJson, path);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ShellService } from \"./shell\";\nimport type { CreateOptions } from \"./types\";\n\nexport const cwd = fs.realpathSync(process.cwd());\n\n// Inspired by https://dub.sh/6tiHVgn\nexport function quote(arg: string) {\n if (/^[\\w./:=@-]+$/i.test(arg) || arg === \"\") {\n return arg;\n }\n\n return arg\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/'/g, \"\\\\'\")\n .replace(/\\f/g, \"\\\\f\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\v/g, \"\\\\v\")\n .replace(/\\0/g, \"\\\\0\");\n}\n\nexport const isRaw = (arg: unknown): arg is { stdout: string } =>\n typeof arg === \"object\" && arg !== null && \"stdout\" in arg && typeof arg.stdout === \"string\";\n\nconst getLocalBinPath = (dirPath: string) => path.join(dirPath, \"node_modules\", \".bin\");\n\nfunction defaultQuote(arg: unknown) {\n if (typeof arg === \"string\") {\n return quote(arg);\n }\n\n if (isRaw(arg)) {\n return arg.stdout;\n }\n\n throw TypeError(`Unsupported argument type: ${typeof arg}`);\n}\n\nexport function createShellService(options: CreateOptions = {}) {\n const preferLocal = !options.localBaseBinPath\n ? undefined\n : Array.isArray(options.localBaseBinPath)\n ? options.localBaseBinPath.map(getLocalBinPath)\n : [options.localBaseBinPath].map(getLocalBinPath);\n\n return new ShellService({\n verbose: true,\n cwd,\n preferLocal,\n quote: defaultQuote,\n ...options,\n });\n}\n","import { $ as make$ } from \"zx\";\nimport type { Shell, ShellOptions } from \"./types\";\n\nexport class ShellService {\n #shell: Shell;\n #options: ShellOptions;\n\n constructor(options: ShellOptions) {\n this.#options = options;\n this.#shell = make$(options);\n }\n\n get $() {\n return this.#shell;\n }\n\n quiet(options?: ShellOptions) {\n return this.child({\n ...options,\n verbose: false,\n });\n }\n\n at(cwd: string, options?: ShellOptions) {\n return this.child({\n ...options,\n cwd,\n });\n }\n\n child(options: ShellOptions) {\n return new ShellService({\n ...this.#options,\n ...options,\n });\n }\n}\n","import { ProcessOutput } from \"zx\";\n\nexport function isProcessOutput(value: unknown): value is ProcessOutput {\n return value instanceof ProcessOutput;\n}\n","import type { PkgService } from \"./services\";\n\nexport function getVersion(pkg: PkgService) {\n return process.env.VERSION || pkg.packageJson.version;\n}\n"],"mappings":"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","names":["supportsColor","chalk","import_workspace","path","fs","projects","cwd","import_node_fs","import_node_path","make$","cwd","fs","path","import_zx"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/colors.ts","../src/services/pkg.ts","../src/services/shell/create.ts","../src/services/shell/shell.ts","../src/services/shell/utils.ts","../src/version.ts"],"sourcesContent":["export * from \"./colors\";\nexport * from \"./services\";\nexport * from \"./version\";\n","import chalk, { type ChalkInstance } from \"chalk\";\nimport supportsColor from \"supports-color\";\n\n// https://no-color.org/\nconst colorIsSupported = () => supportsColor.stdout && !process.env.NO_COLOR;\n\nconst identity = <T>(x: T) => x;\nconst safe = (style: ChalkInstance) => (colorIsSupported() ? style : identity);\n\nexport const colors = {\n blueBright: safe(chalk.blueBright),\n redBright: safe(chalk.redBright),\n greenBright: safe(chalk.greenBright),\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { findWorkspacePackages, type Project } from \"@pnpm/workspace.find-packages\";\nimport { readWorkspaceManifest } from \"@pnpm/workspace.read-manifest\";\nimport { type NormalizedPackageJson, readPackageUp } from \"read-package-up\";\n\nexport type { Project };\n\nexport class PkgService {\n #packageJson: NormalizedPackageJson;\n #dirPath: string;\n\n get dirPath() {\n return this.#dirPath;\n }\n\n get packageJson() {\n return this.#packageJson;\n }\n\n constructor(packageJson: NormalizedPackageJson, pkgPath: string) {\n this.#packageJson = packageJson;\n this.#dirPath = path.dirname(pkgPath);\n }\n\n info() {\n return {\n packageJson: this.#packageJson,\n dirPath: this.#dirPath,\n };\n }\n\n hasFile(name: string, dir?: string) {\n const filepath = dir ? path.join(dir, name) : this.#fromApp(name);\n return fs.existsSync(filepath);\n }\n\n isMonorepo() {\n return this.#packageJson.workspaces !== undefined || this.#hasPnpmWorkspace();\n }\n\n async getWorkspaceProjects() {\n let patterns: string[];\n\n if (this.#hasPnpmWorkspace()) {\n const manifest = await readWorkspaceManifest(this.#dirPath);\n\n if (!manifest) {\n throw new Error(\"Can't read pnpm workspace manifest\");\n }\n\n patterns = manifest.packages;\n } else {\n patterns = Array.isArray(this.#packageJson.workspaces)\n ? this.#packageJson.workspaces\n : (this.#packageJson.workspaces?.packages ?? []);\n }\n\n if (!Array.isArray(patterns) || patterns.some((p) => typeof p !== \"string\")) {\n throw new Error(\"Invalid workspace patterns\");\n }\n\n const projects = await findWorkspacePackages(this.#dirPath, {\n patterns,\n });\n\n const excludeRoot = (projects: Project[]) => {\n return projects.filter((project) => project.rootDir !== this.#dirPath);\n };\n\n return excludeRoot(projects);\n }\n\n #hasPnpmWorkspace() {\n return this.hasFile(\"pnpm-workspace.yaml\");\n }\n\n #fromApp(...args: string[]) {\n return path.join(this.#dirPath, ...args);\n }\n}\n\nexport async function createPkgService(cwd: string): Promise<PkgService | null> {\n const searchResult = await readPackageUp({ cwd });\n\n if (!searchResult) {\n return null;\n }\n\n const { packageJson, path } = searchResult;\n\n return new PkgService(packageJson, path);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ShellService } from \"./shell\";\nimport type { CreateOptions } from \"./types\";\n\nexport const cwd = fs.realpathSync(process.cwd());\n\n// Inspired by https://dub.sh/6tiHVgn\nexport function quote(arg: string) {\n if (/^[\\w./:=@-]+$/i.test(arg) || arg === \"\") {\n return arg;\n }\n\n return arg\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/'/g, \"\\\\'\")\n .replace(/\\f/g, \"\\\\f\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\v/g, \"\\\\v\")\n .replace(/\\0/g, \"\\\\0\");\n}\n\nexport const isRaw = (arg: unknown): arg is { stdout: string } =>\n typeof arg === \"object\" && arg !== null && \"stdout\" in arg && typeof arg.stdout === \"string\";\n\nconst getLocalBinPath = (dirPath: string) => path.join(dirPath, \"node_modules\", \".bin\");\n\nfunction defaultQuote(arg: unknown) {\n if (typeof arg === \"string\") {\n return quote(arg);\n }\n\n if (isRaw(arg)) {\n return arg.stdout;\n }\n\n throw TypeError(`Unsupported argument type: ${typeof arg}`);\n}\n\nexport function createShellService(options: CreateOptions = {}) {\n const preferLocal = !options.localBaseBinPath\n ? undefined\n : Array.isArray(options.localBaseBinPath)\n ? options.localBaseBinPath.map(getLocalBinPath)\n : [options.localBaseBinPath].map(getLocalBinPath);\n\n return new ShellService({\n verbose: true,\n cwd,\n preferLocal,\n quote: defaultQuote,\n ...options,\n });\n}\n","import { $ as make$ } from \"zx\";\nimport type { Shell, ShellOptions } from \"./types\";\n\nexport class ShellService {\n #shell: Shell;\n #options: ShellOptions;\n\n constructor(options: ShellOptions) {\n this.#options = Object.freeze(options);\n this.#shell = make$(options);\n }\n\n get options() {\n return this.#options;\n }\n\n get $() {\n return this.#shell;\n }\n\n quiet(options?: ShellOptions) {\n return this.child({\n ...options,\n verbose: false,\n });\n }\n\n at(cwd: string, options?: ShellOptions) {\n return this.child({\n ...options,\n cwd,\n });\n }\n\n child(options: ShellOptions) {\n return new ShellService({\n ...this.#options,\n ...options,\n });\n }\n}\n","import { ProcessOutput } from \"zx\";\n\nexport function isProcessOutput(value: unknown): value is ProcessOutput {\n return value instanceof ProcessOutput;\n}\n","import type { PkgService } from \"./services\";\n\nexport function getVersion(pkg: PkgService) {\n return process.env.VERSION || pkg.packageJson.version;\n}\n"],"mappings":"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","names":["supportsColor","chalk","import_workspace","path","fs","projects","cwd","import_node_fs","import_node_path","make$","cwd","fs","path","import_zx"]}
package/dist/index.d.cts CHANGED
@@ -2,6 +2,7 @@ import { ChalkInstance } from 'chalk';
2
2
  import { Project } from '@pnpm/workspace.find-packages';
3
3
  export { Project } from '@pnpm/workspace.find-packages';
4
4
  import { NormalizedPackageJson } from 'read-package-up';
5
+ import * as zx from 'zx';
5
6
  import { Options, Shell as Shell$1, ProcessOutput } from 'zx';
6
7
 
7
8
  declare const colors: {
@@ -34,6 +35,7 @@ type CreateOptions = ShellOptions & {
34
35
  declare class ShellService {
35
36
  #private;
36
37
  constructor(options: ShellOptions);
38
+ get options(): Partial<zx.Options>;
37
39
  get $(): Shell;
38
40
  quiet(options?: ShellOptions): ShellService;
39
41
  at(cwd: string, options?: ShellOptions): ShellService;
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import { ChalkInstance } from 'chalk';
2
2
  import { Project } from '@pnpm/workspace.find-packages';
3
3
  export { Project } from '@pnpm/workspace.find-packages';
4
4
  import { NormalizedPackageJson } from 'read-package-up';
5
+ import * as zx from 'zx';
5
6
  import { Options, Shell as Shell$1, ProcessOutput } from 'zx';
6
7
 
7
8
  declare const colors: {
@@ -34,6 +35,7 @@ type CreateOptions = ShellOptions & {
34
35
  declare class ShellService {
35
36
  #private;
36
37
  constructor(options: ShellOptions);
38
+ get options(): Partial<zx.Options>;
37
39
  get $(): Shell;
38
40
  quiet(options?: ShellOptions): ShellService;
39
41
  at(cwd: string, options?: ShellOptions): ShellService;
package/dist/index.js CHANGED
@@ -90,9 +90,12 @@ var ShellService = class _ShellService {
90
90
  #shell;
91
91
  #options;
92
92
  constructor(options) {
93
- this.#options = options;
93
+ this.#options = Object.freeze(options);
94
94
  this.#shell = make$(options);
95
95
  }
96
+ get options() {
97
+ return this.#options;
98
+ }
96
99
  get $() {
97
100
  return this.#shell;
98
101
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/colors.ts","../src/services/pkg.ts","../src/services/shell/create.ts","../src/services/shell/shell.ts","../src/services/shell/utils.ts","../src/version.ts"],"sourcesContent":["import chalk, { type ChalkInstance } from \"chalk\";\nimport supportsColor from \"supports-color\";\n\n// https://no-color.org/\nconst colorIsSupported = () => supportsColor.stdout && !process.env.NO_COLOR;\n\nconst identity = <T>(x: T) => x;\nconst safe = (style: ChalkInstance) => (colorIsSupported() ? style : identity);\n\nexport const colors = {\n blueBright: safe(chalk.blueBright),\n redBright: safe(chalk.redBright),\n greenBright: safe(chalk.greenBright),\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { findWorkspacePackages, type Project } from \"@pnpm/workspace.find-packages\";\nimport { readWorkspaceManifest } from \"@pnpm/workspace.read-manifest\";\nimport { type NormalizedPackageJson, readPackageUp } from \"read-package-up\";\n\nexport type { Project };\n\nexport class PkgService {\n #packageJson: NormalizedPackageJson;\n #dirPath: string;\n\n get dirPath() {\n return this.#dirPath;\n }\n\n get packageJson() {\n return this.#packageJson;\n }\n\n constructor(packageJson: NormalizedPackageJson, pkgPath: string) {\n this.#packageJson = packageJson;\n this.#dirPath = path.dirname(pkgPath);\n }\n\n info() {\n return {\n packageJson: this.#packageJson,\n dirPath: this.#dirPath,\n };\n }\n\n hasFile(name: string, dir?: string) {\n const filepath = dir ? path.join(dir, name) : this.#fromApp(name);\n return fs.existsSync(filepath);\n }\n\n isMonorepo() {\n return this.#packageJson.workspaces !== undefined || this.#hasPnpmWorkspace();\n }\n\n async getWorkspaceProjects() {\n let patterns: string[];\n\n if (this.#hasPnpmWorkspace()) {\n const manifest = await readWorkspaceManifest(this.#dirPath);\n\n if (!manifest) {\n throw new Error(\"Can't read pnpm workspace manifest\");\n }\n\n patterns = manifest.packages;\n } else {\n patterns = Array.isArray(this.#packageJson.workspaces)\n ? this.#packageJson.workspaces\n : (this.#packageJson.workspaces?.packages ?? []);\n }\n\n if (!Array.isArray(patterns) || patterns.some((p) => typeof p !== \"string\")) {\n throw new Error(\"Invalid workspace patterns\");\n }\n\n const projects = await findWorkspacePackages(this.#dirPath, {\n patterns,\n });\n\n const excludeRoot = (projects: Project[]) => {\n return projects.filter((project) => project.rootDir !== this.#dirPath);\n };\n\n return excludeRoot(projects);\n }\n\n #hasPnpmWorkspace() {\n return this.hasFile(\"pnpm-workspace.yaml\");\n }\n\n #fromApp(...args: string[]) {\n return path.join(this.#dirPath, ...args);\n }\n}\n\nexport async function createPkgService(cwd: string): Promise<PkgService | null> {\n const searchResult = await readPackageUp({ cwd });\n\n if (!searchResult) {\n return null;\n }\n\n const { packageJson, path } = searchResult;\n\n return new PkgService(packageJson, path);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ShellService } from \"./shell\";\nimport type { CreateOptions } from \"./types\";\n\nexport const cwd = fs.realpathSync(process.cwd());\n\n// Inspired by https://dub.sh/6tiHVgn\nexport function quote(arg: string) {\n if (/^[\\w./:=@-]+$/i.test(arg) || arg === \"\") {\n return arg;\n }\n\n return arg\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/'/g, \"\\\\'\")\n .replace(/\\f/g, \"\\\\f\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\v/g, \"\\\\v\")\n .replace(/\\0/g, \"\\\\0\");\n}\n\nexport const isRaw = (arg: unknown): arg is { stdout: string } =>\n typeof arg === \"object\" && arg !== null && \"stdout\" in arg && typeof arg.stdout === \"string\";\n\nconst getLocalBinPath = (dirPath: string) => path.join(dirPath, \"node_modules\", \".bin\");\n\nfunction defaultQuote(arg: unknown) {\n if (typeof arg === \"string\") {\n return quote(arg);\n }\n\n if (isRaw(arg)) {\n return arg.stdout;\n }\n\n throw TypeError(`Unsupported argument type: ${typeof arg}`);\n}\n\nexport function createShellService(options: CreateOptions = {}) {\n const preferLocal = !options.localBaseBinPath\n ? undefined\n : Array.isArray(options.localBaseBinPath)\n ? options.localBaseBinPath.map(getLocalBinPath)\n : [options.localBaseBinPath].map(getLocalBinPath);\n\n return new ShellService({\n verbose: true,\n cwd,\n preferLocal,\n quote: defaultQuote,\n ...options,\n });\n}\n","import { $ as make$ } from \"zx\";\nimport type { Shell, ShellOptions } from \"./types\";\n\nexport class ShellService {\n #shell: Shell;\n #options: ShellOptions;\n\n constructor(options: ShellOptions) {\n this.#options = options;\n this.#shell = make$(options);\n }\n\n get $() {\n return this.#shell;\n }\n\n quiet(options?: ShellOptions) {\n return this.child({\n ...options,\n verbose: false,\n });\n }\n\n at(cwd: string, options?: ShellOptions) {\n return this.child({\n ...options,\n cwd,\n });\n }\n\n child(options: ShellOptions) {\n return new ShellService({\n ...this.#options,\n ...options,\n });\n }\n}\n","import { ProcessOutput } from \"zx\";\n\nexport function isProcessOutput(value: unknown): value is ProcessOutput {\n return value instanceof ProcessOutput;\n}\n","import type { PkgService } from \"./services\";\n\nexport function getVersion(pkg: PkgService) {\n return process.env.VERSION || pkg.packageJson.version;\n}\n"],"mappings":"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","names":["projects","cwd","path","fs","path","cwd","fs","path"]}
1
+ {"version":3,"sources":["../src/colors.ts","../src/services/pkg.ts","../src/services/shell/create.ts","../src/services/shell/shell.ts","../src/services/shell/utils.ts","../src/version.ts"],"sourcesContent":["import chalk, { type ChalkInstance } from \"chalk\";\nimport supportsColor from \"supports-color\";\n\n// https://no-color.org/\nconst colorIsSupported = () => supportsColor.stdout && !process.env.NO_COLOR;\n\nconst identity = <T>(x: T) => x;\nconst safe = (style: ChalkInstance) => (colorIsSupported() ? style : identity);\n\nexport const colors = {\n blueBright: safe(chalk.blueBright),\n redBright: safe(chalk.redBright),\n greenBright: safe(chalk.greenBright),\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { findWorkspacePackages, type Project } from \"@pnpm/workspace.find-packages\";\nimport { readWorkspaceManifest } from \"@pnpm/workspace.read-manifest\";\nimport { type NormalizedPackageJson, readPackageUp } from \"read-package-up\";\n\nexport type { Project };\n\nexport class PkgService {\n #packageJson: NormalizedPackageJson;\n #dirPath: string;\n\n get dirPath() {\n return this.#dirPath;\n }\n\n get packageJson() {\n return this.#packageJson;\n }\n\n constructor(packageJson: NormalizedPackageJson, pkgPath: string) {\n this.#packageJson = packageJson;\n this.#dirPath = path.dirname(pkgPath);\n }\n\n info() {\n return {\n packageJson: this.#packageJson,\n dirPath: this.#dirPath,\n };\n }\n\n hasFile(name: string, dir?: string) {\n const filepath = dir ? path.join(dir, name) : this.#fromApp(name);\n return fs.existsSync(filepath);\n }\n\n isMonorepo() {\n return this.#packageJson.workspaces !== undefined || this.#hasPnpmWorkspace();\n }\n\n async getWorkspaceProjects() {\n let patterns: string[];\n\n if (this.#hasPnpmWorkspace()) {\n const manifest = await readWorkspaceManifest(this.#dirPath);\n\n if (!manifest) {\n throw new Error(\"Can't read pnpm workspace manifest\");\n }\n\n patterns = manifest.packages;\n } else {\n patterns = Array.isArray(this.#packageJson.workspaces)\n ? this.#packageJson.workspaces\n : (this.#packageJson.workspaces?.packages ?? []);\n }\n\n if (!Array.isArray(patterns) || patterns.some((p) => typeof p !== \"string\")) {\n throw new Error(\"Invalid workspace patterns\");\n }\n\n const projects = await findWorkspacePackages(this.#dirPath, {\n patterns,\n });\n\n const excludeRoot = (projects: Project[]) => {\n return projects.filter((project) => project.rootDir !== this.#dirPath);\n };\n\n return excludeRoot(projects);\n }\n\n #hasPnpmWorkspace() {\n return this.hasFile(\"pnpm-workspace.yaml\");\n }\n\n #fromApp(...args: string[]) {\n return path.join(this.#dirPath, ...args);\n }\n}\n\nexport async function createPkgService(cwd: string): Promise<PkgService | null> {\n const searchResult = await readPackageUp({ cwd });\n\n if (!searchResult) {\n return null;\n }\n\n const { packageJson, path } = searchResult;\n\n return new PkgService(packageJson, path);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ShellService } from \"./shell\";\nimport type { CreateOptions } from \"./types\";\n\nexport const cwd = fs.realpathSync(process.cwd());\n\n// Inspired by https://dub.sh/6tiHVgn\nexport function quote(arg: string) {\n if (/^[\\w./:=@-]+$/i.test(arg) || arg === \"\") {\n return arg;\n }\n\n return arg\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/'/g, \"\\\\'\")\n .replace(/\\f/g, \"\\\\f\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\v/g, \"\\\\v\")\n .replace(/\\0/g, \"\\\\0\");\n}\n\nexport const isRaw = (arg: unknown): arg is { stdout: string } =>\n typeof arg === \"object\" && arg !== null && \"stdout\" in arg && typeof arg.stdout === \"string\";\n\nconst getLocalBinPath = (dirPath: string) => path.join(dirPath, \"node_modules\", \".bin\");\n\nfunction defaultQuote(arg: unknown) {\n if (typeof arg === \"string\") {\n return quote(arg);\n }\n\n if (isRaw(arg)) {\n return arg.stdout;\n }\n\n throw TypeError(`Unsupported argument type: ${typeof arg}`);\n}\n\nexport function createShellService(options: CreateOptions = {}) {\n const preferLocal = !options.localBaseBinPath\n ? undefined\n : Array.isArray(options.localBaseBinPath)\n ? options.localBaseBinPath.map(getLocalBinPath)\n : [options.localBaseBinPath].map(getLocalBinPath);\n\n return new ShellService({\n verbose: true,\n cwd,\n preferLocal,\n quote: defaultQuote,\n ...options,\n });\n}\n","import { $ as make$ } from \"zx\";\nimport type { Shell, ShellOptions } from \"./types\";\n\nexport class ShellService {\n #shell: Shell;\n #options: ShellOptions;\n\n constructor(options: ShellOptions) {\n this.#options = Object.freeze(options);\n this.#shell = make$(options);\n }\n\n get options() {\n return this.#options;\n }\n\n get $() {\n return this.#shell;\n }\n\n quiet(options?: ShellOptions) {\n return this.child({\n ...options,\n verbose: false,\n });\n }\n\n at(cwd: string, options?: ShellOptions) {\n return this.child({\n ...options,\n cwd,\n });\n }\n\n child(options: ShellOptions) {\n return new ShellService({\n ...this.#options,\n ...options,\n });\n }\n}\n","import { ProcessOutput } from \"zx\";\n\nexport function isProcessOutput(value: unknown): value is ProcessOutput {\n return value instanceof ProcessOutput;\n}\n","import type { PkgService } from \"./services\";\n\nexport function getVersion(pkg: PkgService) {\n return process.env.VERSION || pkg.packageJson.version;\n}\n"],"mappings":"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","names":["projects","cwd","path","fs","path","cwd","fs","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vlandoss/clibuddy",
3
- "version": "0.0.3",
3
+ "version": "0.0.4-git-b7a02eb.0",
4
4
  "description": "A helper library to create CLIs in Variable Land",
5
5
  "homepage": "https://github.com/variableland/dx/tree/main/packages/clibuddy#readme",
6
6
  "bugs": {
@@ -6,10 +6,14 @@ export class ShellService {
6
6
  #options: ShellOptions;
7
7
 
8
8
  constructor(options: ShellOptions) {
9
- this.#options = options;
9
+ this.#options = Object.freeze(options);
10
10
  this.#shell = make$(options);
11
11
  }
12
12
 
13
+ get options() {
14
+ return this.#options;
15
+ }
16
+
13
17
  get $() {
14
18
  return this.#shell;
15
19
  }