yargs-file-commands 0.0.20 → 1.1.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.
Files changed (61) hide show
  1. package/README.md +73 -109
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/Command.js +1 -0
  6. package/dist/lib/Command.js.map +1 -0
  7. package/dist/lib/buildSegmentTree.d.ts +1 -1
  8. package/dist/lib/buildSegmentTree.js +7 -3
  9. package/dist/lib/buildSegmentTree.js.map +1 -0
  10. package/dist/lib/buildSegmentTree.test.js +279 -26
  11. package/dist/lib/buildSegmentTree.test.js.map +1 -0
  12. package/dist/lib/defineCommand.d.ts +37 -0
  13. package/dist/lib/defineCommand.js +5 -0
  14. package/dist/lib/defineCommand.js.map +1 -0
  15. package/dist/lib/fileCommands.d.ts +2 -1
  16. package/dist/lib/fileCommands.js +39 -21
  17. package/dist/lib/fileCommands.js.map +1 -0
  18. package/dist/lib/fileCommands.test.js +107 -30
  19. package/dist/lib/fileCommands.test.js.map +1 -0
  20. package/dist/lib/fixtures/commands/$default.js +1 -0
  21. package/dist/lib/fixtures/commands/$default.js.map +1 -0
  22. package/dist/lib/fixtures/commands/create.js +1 -0
  23. package/dist/lib/fixtures/commands/create.js.map +1 -0
  24. package/dist/lib/fixtures/commands/db/health.d.ts +2 -1
  25. package/dist/lib/fixtures/commands/db/health.js +2 -3
  26. package/dist/lib/fixtures/commands/db/health.js.map +1 -0
  27. package/dist/lib/fixtures/commands/db/migration/command.d.ts +9 -2
  28. package/dist/lib/fixtures/commands/db/migration/command.js +6 -7
  29. package/dist/lib/fixtures/commands/db/migration/command.js.map +1 -0
  30. package/dist/lib/importCommand.d.ts +3 -3
  31. package/dist/lib/importCommand.js +39 -27
  32. package/dist/lib/importCommand.js.map +1 -0
  33. package/dist/lib/importCommand.test.js +157 -33
  34. package/dist/lib/importCommand.test.js.map +1 -0
  35. package/dist/lib/scanDirectory.js +54 -25
  36. package/dist/lib/scanDirectory.js.map +1 -0
  37. package/dist/lib/scanDirectory.test.js +148 -25
  38. package/dist/lib/scanDirectory.test.js.map +1 -0
  39. package/dist/lib/segmentPath.js +8 -6
  40. package/dist/lib/segmentPath.js.map +1 -0
  41. package/dist/lib/segmentPath.test.js +10 -38
  42. package/dist/lib/segmentPath.test.js.map +1 -0
  43. package/dist/tsconfig.tsbuildinfo +1 -0
  44. package/package.json +6 -9
  45. package/CHANGELOG.md +0 -62
  46. package/src/index.ts +0 -1
  47. package/src/lib/Command.ts +0 -16
  48. package/src/lib/buildSegmentTree.test.ts +0 -90
  49. package/src/lib/buildSegmentTree.ts +0 -149
  50. package/src/lib/fileCommands.test.ts +0 -55
  51. package/src/lib/fileCommands.ts +0 -149
  52. package/src/lib/fixtures/commands/$default.ts +0 -5
  53. package/src/lib/fixtures/commands/create.ts +0 -6
  54. package/src/lib/fixtures/commands/db/health.ts +0 -9
  55. package/src/lib/fixtures/commands/db/migration/command.ts +0 -12
  56. package/src/lib/importCommand.test.ts +0 -60
  57. package/src/lib/importCommand.ts +0 -196
  58. package/src/lib/scanDirectory.test.ts +0 -75
  59. package/src/lib/scanDirectory.ts +0 -109
  60. package/src/lib/segmentPath.test.ts +0 -71
  61. package/src/lib/segmentPath.ts +0 -38
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildSegmentTree.test.js","sourceRoot":"","sources":["../../src/lib/buildSegmentTree.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { ArgumentsCamelCase, Argv, CommandModule, InferredOptionTypes, Options } from 'yargs';
2
+ /**
3
+ * Helper to define a command with type inference for arguments.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * export const command = defineCommand({
8
+ * command: 'my-command',
9
+ * builder: (yargs) => yargs.option('name', { type: 'string', demandOption: true }),
10
+ * handler: (argv) => {
11
+ * // argv.name is correctly typed as string
12
+ * console.log(argv.name);
13
+ * },
14
+ * });
15
+ * ```
16
+ */
17
+ export declare function defineCommand<T = {}, U = {}>(module: {
18
+ command?: string | ReadonlyArray<string>;
19
+ aliases?: string | ReadonlyArray<string>;
20
+ describe?: string | false;
21
+ deprecated?: boolean | string;
22
+ builder: (yargs: Argv<T>) => Argv<U> | PromiseLike<Argv<U>>;
23
+ handler: (args: ArgumentsCamelCase<U>) => void | Promise<void>;
24
+ }): CommandModule<T, U>;
25
+ /**
26
+ * Helper to define a command with type inference for arguments using an options object builder.
27
+ */
28
+ export declare function defineCommand<O extends {
29
+ [key: string]: Options;
30
+ }, T = {}>(module: {
31
+ command?: string | ReadonlyArray<string>;
32
+ aliases?: string | ReadonlyArray<string>;
33
+ describe?: string | false;
34
+ deprecated?: boolean | string;
35
+ builder: O;
36
+ handler: (args: ArgumentsCamelCase<InferredOptionTypes<O>>) => void | Promise<void>;
37
+ }): CommandModule<T, InferredOptionTypes<O>>;
@@ -0,0 +1,5 @@
1
+ // biome-ignore lint/suspicious/noExplicitAny: required to return a CommandModule
2
+ export function defineCommand(module) {
3
+ return module;
4
+ }
5
+ //# sourceMappingURL=defineCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineCommand.js","sourceRoot":"","sources":["../../src/lib/defineCommand.ts"],"names":[],"mappings":"AA0CA,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,MAAW,EAAO;IAC9C,OAAO,MAAM,CAAC;AAAA,CACf"}
@@ -1,3 +1,4 @@
1
+ import type { CommandModule } from 'yargs';
1
2
  import { type ScanDirectoryOptions } from './scanDirectory.js';
2
3
  /**
3
4
  * Configuration options for file-based command generation
@@ -30,4 +31,4 @@ export declare const DefaultFileCommandsOptions: Required<FileCommandsOptions>;
30
31
  * 3. Build a tree structure based on file paths
31
32
  * 4. Convert the tree into a command hierarchy
32
33
  */
33
- export declare const fileCommands: (options: FileCommandsOptions) => Promise<import("yargs").CommandModule<{}, {}>[]>;
34
+ export declare const fileCommands: (options: FileCommandsOptions) => Promise<CommandModule<{}, {}>[]>;
@@ -1,4 +1,4 @@
1
- import path from 'path';
1
+ import path from 'node:path';
2
2
  import { buildSegmentTree, createCommand, logCommandTree } from './buildSegmentTree.js';
3
3
  import { importCommandFromFile } from './importCommand.js';
4
4
  import { scanDirectory } from './scanDirectory.js';
@@ -13,17 +13,19 @@ export const DefaultFileCommandsOptions = {
13
13
  commandDirs: [],
14
14
  /** Default file extensions to process */
15
15
  extensions: ['.js', '.ts'],
16
- /** Default patterns to ignore when scanning directories */
16
+ /** Default patterns to ignore when scanning directories.
17
+ * Note: System files (files starting with '.') are ALWAYS ignored regardless of these patterns.
18
+ * These defaults can be overridden by providing your own ignorePatterns.
19
+ */
17
20
  ignorePatterns: [
18
- /^[.|_].*/, // Hidden files and underscore files
19
21
  /\.(?:test|spec)\.[jt]s$/, // Test files
20
22
  /__(?:test|spec)__/, // Test directories
21
- /\.d\.ts$/ // TypeScript declaration files
23
+ /\.d\.ts$/, // TypeScript declaration files
22
24
  ],
23
25
  /** Default logging level */
24
26
  logLevel: 'info',
25
27
  /** Default log prefix */
26
- logPrefix: ' '
28
+ logPrefix: ' ',
27
29
  };
28
30
  /**
29
31
  * Generates a command tree structure from files in specified directories
@@ -45,7 +47,7 @@ export const DefaultFileCommandsOptions = {
45
47
  export const fileCommands = async (options) => {
46
48
  const fullOptions = {
47
49
  ...DefaultFileCommandsOptions,
48
- ...options
50
+ ...options,
49
51
  };
50
52
  // validate extensions have dots in them
51
53
  if (fullOptions.extensions.some((ext) => !ext.startsWith('.'))) {
@@ -61,29 +63,44 @@ export const fileCommands = async (options) => {
61
63
  throw new Error(`Command directories must be absolute paths: ${nonAbsoluteDirs.join(', ')}`);
62
64
  }
63
65
  const commands = [];
64
- for (const commandDir of fullOptions.commandDirs) {
66
+ // Process all command directories in parallel
67
+ const directoryResults = await Promise.all(fullOptions.commandDirs.map(async (commandDir) => {
65
68
  const fullPath = path.resolve(commandDir);
66
69
  if (fullOptions.logLevel === 'debug') {
67
70
  console.debug(`Scanning directory for commands: ${fullPath}`);
68
71
  }
69
72
  const filePaths = await scanDirectory(commandDir, commandDir, fullOptions);
73
+ return { commandDir, filePaths };
74
+ }));
75
+ if (fullOptions.logLevel === 'debug') {
76
+ console.debug(`Importing found commands:`);
77
+ }
78
+ // Process all files in parallel
79
+ const fileResults = await Promise.all(directoryResults.flatMap(({ commandDir, filePaths }) => filePaths.map(async (filePath) => {
80
+ const localPath = path.relative(commandDir, filePath);
81
+ const segments = segmentPath(filePath, commandDir);
82
+ // Remove extension (last segment) if there are multiple segments
83
+ // If there's only one segment, it means the file has no name (e.g., .js)
84
+ if (segments.length > 1) {
85
+ segments.pop(); // remove extension.
86
+ }
87
+ else if (segments.length === 0) {
88
+ throw new Error(`No segments found for file: ${filePath}`);
89
+ }
70
90
  if (fullOptions.logLevel === 'debug') {
71
- console.debug(`Importing found commands:`);
91
+ console.debug(` ${localPath} - importing command module`);
72
92
  }
73
- for (const filePath of filePaths) {
74
- const localPath = path.relative(commandDir, filePath);
75
- const segments = segmentPath(filePath, commandDir);
76
- segments.pop(); // remove extension.
77
- if (fullOptions.logLevel === 'debug') {
78
- console.debug(` ${localPath} - importing command module`);
79
- }
80
- commands.push({
81
- fullPath: filePath,
82
- segments,
83
- commandModule: await importCommandFromFile(filePath, segments[segments.length - 1], fullOptions)
84
- });
93
+ const lastSegment = segments[segments.length - 1];
94
+ if (lastSegment === undefined) {
95
+ throw new Error(`No segments found for file: ${filePath}`);
85
96
  }
86
- }
97
+ return {
98
+ fullPath: filePath,
99
+ segments,
100
+ commandModule: await importCommandFromFile(filePath, lastSegment, fullOptions),
101
+ };
102
+ })));
103
+ commands.push(...fileResults);
87
104
  // check if no commands were found
88
105
  if (commands.length === 0) {
89
106
  throw new Error(`No commands found in specified directories: ${fullOptions.commandDirs.join(', ')}`);
@@ -96,3 +113,4 @@ export const fileCommands = async (options) => {
96
113
  const rootCommands = commandRootNodes.map((node) => createCommand(node));
97
114
  return rootCommands;
98
115
  };
116
+ //# sourceMappingURL=fileCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileCommands.js","sourceRoot":"","sources":["../../src/lib/fileCommands.ts"],"names":[],"mappings":"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"}
@@ -1,36 +1,113 @@
1
- import path from 'path';
2
- import { test } from 'node:test';
3
- import assert from 'node:assert';
1
+ import { mkdir, rm, writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import path from 'node:path';
4
+ import { describe, expect, it } from 'vitest';
4
5
  import { fileCommands } from './fileCommands.js';
5
6
  // get __dirname in ESM style
6
7
  const __dirname = path.dirname(new URL(import.meta.url).pathname);
7
- test('should load commands from directory structure', async () => {
8
- const commands = await fileCommands({
9
- commandDirs: [path.join(__dirname, 'fixtures', 'commands')],
10
- logLevel: 'debug'
8
+ describe('fileCommands', () => {
9
+ it('should load commands from directory structure', async () => {
10
+ const commands = await fileCommands({
11
+ commandDirs: [path.join(__dirname, 'fixtures', 'commands')],
12
+ logLevel: 'debug',
13
+ });
14
+ expect(commands.length).toBeGreaterThan(0);
11
15
  });
12
- assert.ok(commands.length > 0);
13
- });
14
- test('should respect ignore patterns', async () => {
15
- const commands = await fileCommands({
16
- commandDirs: [path.join(__dirname, 'fixtures', 'commands')],
17
- ignorePatterns: [/health/, /.d.ts/],
18
- logLevel: 'debug'
16
+ it('should respect ignore patterns', async () => {
17
+ const commands = await fileCommands({
18
+ commandDirs: [path.join(__dirname, 'fixtures', 'commands')],
19
+ ignorePatterns: [/health/, /.d.ts/],
20
+ logLevel: 'debug',
21
+ });
22
+ expect(commands.length).toBeGreaterThan(0);
23
+ });
24
+ it('should handle explicit commands and default command', async () => {
25
+ const commands = await fileCommands({
26
+ commandDirs: [path.join(__dirname, 'fixtures', 'commands')],
27
+ logLevel: 'debug',
28
+ });
29
+ console.log('commands', JSON.stringify(commands.map((c) => c.command), null, 2));
30
+ // Find the explicit command
31
+ const explicitCommand = commands.find((cmd) => cmd.command?.toString().includes('create [name]'));
32
+ expect(explicitCommand).toBeDefined();
33
+ expect(explicitCommand?.describe).toBe('Create something with a name');
34
+ // Find the default command
35
+ const defaultCommand = commands.find((cmd) => cmd.command === '$0');
36
+ expect(defaultCommand).toBeDefined();
37
+ expect(defaultCommand?.describe).toBe('Default command');
38
+ });
39
+ it('should throw error for invalid extensions (missing dot)', async () => {
40
+ await expect(fileCommands({
41
+ commandDirs: [path.join(__dirname, 'fixtures', 'commands')],
42
+ extensions: ['js', 'ts'], // Missing dots
43
+ })).rejects.toThrow(/Invalid extensions provided, must start with a dot/);
44
+ });
45
+ it('should throw error for empty command directories', async () => {
46
+ await expect(fileCommands({
47
+ commandDirs: [],
48
+ })).rejects.toThrow(/No command directories provided/);
49
+ });
50
+ it('should throw error for non-absolute directory paths', async () => {
51
+ await expect(fileCommands({
52
+ commandDirs: ['relative/path'], // Relative path
53
+ })).rejects.toThrow(/Command directories must be absolute paths/);
54
+ });
55
+ it('should throw error for non-absolute directory paths (multiple)', async () => {
56
+ await expect(fileCommands({
57
+ commandDirs: [path.join(__dirname, 'fixtures', 'commands'), 'relative/path', 'another/relative'],
58
+ })).rejects.toThrow(/Command directories must be absolute paths/);
59
+ await expect(fileCommands({
60
+ commandDirs: [path.join(__dirname, 'fixtures', 'commands'), 'relative/path', 'another/relative'],
61
+ })).rejects.toThrow(/relative\/path, another\/relative/);
62
+ });
63
+ it('should throw error when no commands found', async () => {
64
+ // Create a temporary empty directory
65
+ // Use a unique timestamp to avoid collisions with other tests
66
+ const tempDir = path.join(tmpdir(), `yargs-empty-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
67
+ await mkdir(tempDir, { recursive: true });
68
+ try {
69
+ // Ensure directory is truly empty (system files like .DS_Store are automatically ignored)
70
+ await expect(fileCommands({
71
+ commandDirs: [tempDir],
72
+ extensions: ['.js', '.ts'], // Only look for JS/TS files
73
+ })).rejects.toThrow(/No commands found in specified directories/);
74
+ }
75
+ finally {
76
+ await rm(tempDir, { recursive: true, force: true });
77
+ }
78
+ });
79
+ it('should handle multiple command directories', async () => {
80
+ const tempDir1 = path.join(tmpdir(), `yargs-test-1-${Date.now()}`);
81
+ const tempDir2 = path.join(tmpdir(), `yargs-test-2-${Date.now()}`);
82
+ await mkdir(tempDir1, { recursive: true });
83
+ await mkdir(tempDir2, { recursive: true });
84
+ try {
85
+ // Create a command file in each directory
86
+ await writeFile(path.join(tempDir1, 'cmd1.ts'), "export const describe = 'Command 1';\nexport const handler = async () => {};");
87
+ await writeFile(path.join(tempDir2, 'cmd2.ts'), "export const describe = 'Command 2';\nexport const handler = async () => {};");
88
+ const commands = await fileCommands({
89
+ commandDirs: [tempDir1, tempDir2],
90
+ });
91
+ expect(commands.length).toBeGreaterThanOrEqual(2);
92
+ }
93
+ finally {
94
+ await rm(tempDir1, { recursive: true, force: true });
95
+ await rm(tempDir2, { recursive: true, force: true });
96
+ }
97
+ });
98
+ it('should use default options when not provided', async () => {
99
+ const commands = await fileCommands({
100
+ commandDirs: [path.join(__dirname, 'fixtures', 'commands')],
101
+ // No other options provided - should use defaults
102
+ });
103
+ expect(commands.length).toBeGreaterThan(0);
104
+ });
105
+ it('should handle custom extensions', async () => {
106
+ const commands = await fileCommands({
107
+ commandDirs: [path.join(__dirname, 'fixtures', 'commands')],
108
+ extensions: ['.ts'], // Only TypeScript files
109
+ });
110
+ expect(commands.length).toBeGreaterThan(0);
19
111
  });
20
- assert.ok(commands.length > 0);
21
- });
22
- test('should handle explicit commands and default command', async () => {
23
- const commands = await fileCommands({
24
- commandDirs: [path.join(__dirname, 'fixtures', 'commands')],
25
- logLevel: 'debug'
26
- });
27
- console.log('commands', JSON.stringify(commands.map((c) => c.command), null, 2));
28
- // Find the explicit command
29
- const explicitCommand = commands.find((cmd) => cmd.command?.toString().includes('create [name]'));
30
- assert.ok(explicitCommand, 'Should find explicit command');
31
- assert.equal(explicitCommand?.describe, 'Create something with a name');
32
- // Find the default command
33
- const defaultCommand = commands.find((cmd) => cmd.command === '$0');
34
- assert.ok(defaultCommand, 'Should find default command');
35
- assert.equal(defaultCommand?.describe, 'Default command');
36
112
  });
113
+ //# sourceMappingURL=fileCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileCommands.test.js","sourceRoot":"","sources":["../../src/lib/fileCommands.test.ts"],"names":[],"mappings":"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"}
@@ -2,3 +2,4 @@ export const describe = 'Default command';
2
2
  export const handler = async () => {
3
3
  // Default command implementation
4
4
  };
5
+ //# sourceMappingURL=$default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"$default.js","sourceRoot":"","sources":["../../../../src/lib/fixtures/commands/$default.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AAE1C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;IACjC,iCAAiC;AADC,CAEnC,CAAC"}
@@ -3,3 +3,4 @@ export const describe = 'Create something with a name';
3
3
  export const handler = async () => {
4
4
  // Create command implementation
5
5
  };
6
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/lib/fixtures/commands/create.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC;AACvC,MAAM,CAAC,MAAM,QAAQ,GAAG,8BAA8B,CAAC;AAEvD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;IACjC,gCAAgC;AADE,CAEnC,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { Argv } from 'yargs';
1
2
  export declare const describe = "Database health check";
2
- export declare const builder: (yargs: any) => any;
3
+ export declare const builder: (yargs: Argv<{}>) => Argv<{}>;
3
4
  export declare const handler: () => Promise<void>;
@@ -1,7 +1,6 @@
1
1
  export const describe = 'Database health check';
2
- export const builder = (yargs) => {
3
- return yargs;
4
- };
2
+ export const builder = (yargs) => yargs;
5
3
  export const handler = async () => {
6
4
  console.log('Health check handler called');
7
5
  };
6
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../../../src/lib/fixtures/commands/db/health.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,uBAAuB,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAW,EAAE,EAAE,CAAC,KAAK,CAAC;AAE9C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAAA,CAC5C,CAAC"}
@@ -1,3 +1,10 @@
1
+ import type { ArgumentsCamelCase, Argv } from 'yargs';
1
2
  export declare const describe = "Database migration command";
2
- export declare const builder: (yargs: any) => any;
3
- export declare const handler: (argv: any) => Promise<void>;
3
+ export declare const builder: (yargs: Argv<{}>) => Argv<{
4
+ force: boolean | undefined;
5
+ }>;
6
+ type Options = {
7
+ force?: boolean;
8
+ };
9
+ export declare const handler: (_argv: ArgumentsCamelCase<Options>) => Promise<void>;
10
+ export {};
@@ -1,10 +1,9 @@
1
1
  export const describe = 'Database migration command';
2
- export const builder = (yargs) => {
3
- return yargs.option('force', {
4
- type: 'boolean',
5
- describe: 'Force migration'
6
- });
7
- };
8
- export const handler = async (argv) => {
2
+ export const builder = (yargs) => yargs.option('force', {
3
+ type: 'boolean',
4
+ describe: 'Force migration',
5
+ });
6
+ export const handler = async (_argv) => {
9
7
  console.log('Migration handler called');
10
8
  };
9
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../../../../src/lib/fixtures/commands/db/migration/command.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAErD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAW,EAAE,EAAE,CACrC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;IACpB,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,iBAAiB;CAC5B,CAAC,CAAC;AAML,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,KAAkC,EAAE,EAAE,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAAA,CACzC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type ArgumentsCamelCase, type CommandBuilder, type CommandModule } from 'yargs';
1
+ import type { ArgumentsCamelCase, CommandBuilder, CommandModule } from 'yargs';
2
2
  /**
3
3
  * Represents command alias configuration
4
4
  * @type {readonly string[] | string | undefined}
@@ -23,7 +23,7 @@ export type CommandDescribe = string | false | undefined;
23
23
  * Command handler function type
24
24
  * @type {Function}
25
25
  */
26
- export type CommandHandler = (args: ArgumentsCamelCase<any>) => void | Promise<any>;
26
+ export type CommandHandler = (args: ArgumentsCamelCase<Record<string, unknown>>) => undefined | Promise<unknown>;
27
27
  /**
28
28
  * Parameters for file commands configuration
29
29
  * @interface FileCommandsParams
@@ -68,4 +68,4 @@ export interface ImportCommandOptions {
68
68
  * 2. Individual exports of command parts (command, describe, alias, etc.)
69
69
  * If no handler is provided, creates a null implementation.
70
70
  */
71
- export declare const importCommandFromFile: (filePath: string, name: string, options: ImportCommandOptions) => Promise<CommandModule>;
71
+ export declare const importCommandFromFile: (filePath: string, name: string, options: ImportCommandOptions) => Promise<CommandModule<{}, {}>>;
@@ -1,5 +1,6 @@
1
- import fs from 'fs';
2
- import {} from 'yargs';
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
3
4
  /**
4
5
  * Imports a command module from a file
5
6
  * @async
@@ -16,21 +17,38 @@ import {} from 'yargs';
16
17
  * If no handler is provided, creates a null implementation.
17
18
  */
18
19
  export const importCommandFromFile = async (filePath, name, options) => {
19
- // ensure file exists using fs node library
20
- if (!fs.existsSync(filePath)) {
21
- throw new Error(`Can not import command from non-existent file path: ${filePath}`);
20
+ // Resolve to absolute path first
21
+ const resolvedPath = path.resolve(filePath);
22
+ // Ensure file exists using fs node library
23
+ if (!fs.existsSync(resolvedPath)) {
24
+ const originalPath = filePath !== resolvedPath ? ` (original: ${filePath})` : '';
25
+ throw new Error(`Cannot import command from non-existent file path: ${resolvedPath}${originalPath}. ` +
26
+ `Ensure the file exists and the path is correct. If using a relative path, consider using an absolute path or path.resolve().`);
22
27
  }
23
- const url = 'file://' + filePath;
28
+ // Get the real (canonical) path to handle symlinks consistently
29
+ // This ensures the path matches what pathToFileURL will resolve to
30
+ const realPath = fs.realpathSync.native(resolvedPath);
31
+ // Construct file URL using Node.js's pathToFileURL which properly handles
32
+ // path normalization, special characters, and cross-platform compatibility
33
+ // Use the real path to avoid symlink resolution mismatches
34
+ const url = pathToFileURL(realPath).href;
24
35
  const { logLevel = 'info' } = options;
25
36
  // Import the module
26
- const imported = await import(url);
37
+ let imported;
38
+ try {
39
+ imported = await import(url);
40
+ }
41
+ catch (error) {
42
+ const errorMessage = error instanceof Error ? error.message : String(error);
43
+ throw new Error(`Failed to import command module from ${realPath}: ${errorMessage}. ` +
44
+ `Ensure the file is a valid JavaScript/TypeScript module and the path is correct.`);
45
+ }
27
46
  // Check if this is the default command
28
47
  const isDefault = name === '$default';
29
48
  // First try to use the CommandModule export if it exists
30
- if ('command' in imported &&
31
- typeof imported.command === 'object' &&
32
- imported.command !== null) {
33
- const commandModule = imported.command;
49
+ const importedRecord = imported;
50
+ if ('command' in importedRecord && typeof importedRecord.command === 'object' && importedRecord.command !== null) {
51
+ const commandModule = importedRecord.command;
34
52
  // Ensure the command property exists or use the filename
35
53
  if (!commandModule.command && !isDefault) {
36
54
  commandModule.command = name;
@@ -39,7 +57,7 @@ export const importCommandFromFile = async (filePath, name, options) => {
39
57
  commandModule.command = '$0';
40
58
  }
41
59
  if (logLevel === 'debug') {
42
- console.debug('Importing CommandModule from', filePath, 'as', name, 'with description', commandModule.describe);
60
+ console.debug('Importing CommandModule from', realPath, 'as', name, 'with description', commandModule.describe);
43
61
  }
44
62
  // Return the command module directly without wrapping
45
63
  return {
@@ -48,11 +66,11 @@ export const importCommandFromFile = async (filePath, name, options) => {
48
66
  builder: commandModule.builder,
49
67
  handler: commandModule.handler,
50
68
  deprecated: commandModule.deprecated,
51
- aliases: commandModule.aliases
69
+ aliases: commandModule.aliases,
52
70
  };
53
71
  }
54
72
  // Fall back to individual exports
55
- const handlerModule = imported;
73
+ const handlerModule = importedRecord;
56
74
  const command = {
57
75
  command: handlerModule.command ?? (isDefault ? '$0' : name),
58
76
  describe: handlerModule.describe,
@@ -60,26 +78,20 @@ export const importCommandFromFile = async (filePath, name, options) => {
60
78
  builder: handlerModule.builder,
61
79
  deprecated: handlerModule.deprecated,
62
80
  handler: handlerModule.handler ??
63
- (async (args) => {
81
+ (async (_args) => {
64
82
  // null implementation
65
- })
83
+ }),
66
84
  };
67
85
  // Validate exports
68
- const supportedNames = [
69
- 'command',
70
- 'describe',
71
- 'alias',
72
- 'builder',
73
- 'deprecated',
74
- 'handler'
75
- ];
76
- const module = imported;
86
+ const supportedNames = ['command', 'describe', 'alias', 'builder', 'deprecated', 'handler'];
87
+ const module = importedRecord;
77
88
  const unsupportedExports = Object.keys(module).filter((key) => !supportedNames.includes(key));
78
89
  if (unsupportedExports.length > 0) {
79
- throw new Error(`Command module ${name} in ${filePath} has some unsupported exports, probably a misspelling: ${unsupportedExports.join(', ')}`);
90
+ throw new Error(`Command module ${name} in ${realPath} has some unsupported exports, probably a misspelling: ${unsupportedExports.join(', ')}. Supported exports are: ${supportedNames.join(', ')}.`);
80
91
  }
81
92
  if (logLevel === 'debug') {
82
- console.debug('Importing individual exports from', filePath, 'as', name, 'with description', command.describe);
93
+ console.debug('Importing individual exports from', realPath, 'as', name, 'with description', command.describe);
83
94
  }
84
95
  return command;
85
96
  };
97
+ //# sourceMappingURL=importCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importCommand.js","sourceRoot":"","sources":["../../src/lib/importCommand.ts"],"names":[],"mappings":"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"}