@ecmaos/coreutils 0.1.1 → 0.1.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.
@@ -1,5 +1,5 @@
1
1
 
2
2
 
3
- > @ecmaos/coreutils@0.1.1 build /home/archmag0s/code/ecmaos/core/utils
3
+ > @ecmaos/coreutils@0.1.2 build /home/archmag0s/code/ecmaos/core/utils
4
4
  > tsc
5
5
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,173 @@
1
1
  # @ecmaos/coreutils
2
2
 
3
+ ## 0.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - ae8f619: OVERVIEW
8
+
9
+ Total Commits: 5
10
+ Files Changed: 56 files
11
+ Additions: +1,632 lines
12
+ Deletions: -539 lines
13
+ Net Change: +1,093 lines
14
+
15
+ ***
16
+
17
+ COMMIT DETAILS
18
+
19
+ 1. c6f2d9c - docs: Update NEWS and README files; add tilde expansion feature in shell commands
20
+
21
+ Type: Documentation & Enhancement
22
+ Date: Wed Dec 31 11:52:52 2025
23
+
24
+ Changes:
25
+
26
+ - Updated NEWS.md and README.md with new features and improvements
27
+ - Added tilde expansion feature in shell commands (~ expands to home directory)
28
+ - Enhanced filesystem type recognition
29
+ - Improved terminal command handling
30
+ - Removed 292 lines from core/kernel/src/tree/lib/commands/index.ts (edit command moved to separate package)
31
+ - Added shell functionality in core/kernel/src/tree/shell.ts (71 new lines)
32
+ - Enhanced terminal and filesystem modules
33
+
34
+ Files Modified: 9 files (+166, -327)
35
+
36
+ ***
37
+
38
+ 2. b4454a1 - chore: Bump turbo package version from 2.5.4 to 2.7.2
39
+
40
+ Type: Dependency Update
41
+
42
+ Changes:
43
+
44
+ - Updated Turbo monorepo tool from version 2.5.4 to 2.7.2
45
+ - Updated package.json and pnpm-lock.yaml files
46
+
47
+ Impact: Infrastructure improvement for better monorepo tooling support
48
+
49
+ ***
50
+
51
+ 3. 6660f4c - chore: Update pnpm-lock.yaml files across multiple applications and modules
52
+
53
+ Type: Dependency Maintenance
54
+
55
+ Changes:
56
+
57
+ - Cleaned up outdated checksum entries in pnpm-lock.yaml files
58
+ - Ensured consistency in package versions across the monorepo
59
+ - Updated lockfiles in:
60
+ - Multiple apps (ai, boilerplate, code, news, python, webamp)
61
+ - Core packages (bios, jaffa, kernel, metal, swapi, types, utils)
62
+ - Device packages (audio, battery, bluetooth, echo, gamepad, geo, gpu, hid, midi, presentation, sensors, serial, usb, webgl)
63
+ - Modules and utils
64
+
65
+ Impact: Improved dependency consistency and resolved potential checksum issues
66
+
67
+ ***
68
+
69
+ 4. 01da80e - feat: improve and move edit command to its own package
70
+
71
+ Type: Feature (Major Refactor)
72
+ Date: Wed Dec 31 12:48:45 2025
73
+
74
+ Changes:
75
+
76
+ - Extracted edit command from kernel into standalone apps/edit package
77
+ - Created comprehensive editor implementation with:
78
+ - Multiple editing modes: normal, insert, replace, command
79
+ - File operations support
80
+ - Renderer for terminal-based editing
81
+ - Type definitions for editor state
82
+ - Removed 292 lines of edit command code from core/kernel/src/tree/lib/commands/index.ts
83
+ - Added build configuration (build.cjs)
84
+ - Updated package dependencies
85
+
86
+ Files Modified: 14 files (+1,054, -304)
87
+
88
+ Impact: Better separation of concerns, improved maintainability, and enhanced editor functionality
89
+
90
+ ***
91
+
92
+ 5. 90072ec - feat: add 'ln' command and enhance 'ls' command to support symbolic and hard link information
93
+
94
+ Type: Feature
95
+ Date: Wed Dec 31 13:11:53 2025
96
+
97
+ Changes:
98
+
99
+ - Added new ln command for creating symbolic and hard links (core/utils/src/commands/ln.ts - 108 lines)
100
+ - Enhanced ls command to display link information:
101
+ - Shows link count for files
102
+ - Displays target path for symbolic links
103
+ - Improved file listing with link details
104
+ - Updated command exports in core/utils/src/index.ts
105
+
106
+ Files Modified: 3 files (+196, -11)
107
+
108
+ Impact: Better filesystem management capabilities, improved visibility into file relationships
109
+
110
+ ***
111
+
112
+ SUMMARY BY CATEGORY
113
+
114
+ Features:
115
+
116
+ - Edit Command Package: Extracted and improved editor into standalone package with multiple modes
117
+ - Link Command: New ln command for creating symbolic and hard links
118
+ - Enhanced LS: Improved ls command with link information display
119
+ - Tilde Expansion: Shell command support for ~ home directory expansion
120
+
121
+ Documentation:
122
+
123
+ - Updated NEWS and README files with latest changes
124
+
125
+ Infrastructure:
126
+
127
+ - Turbo version bump (2.5.4 -> 2.7.2)
128
+ - Dependency lockfile cleanup across entire monorepo
129
+
130
+ Code Quality:
131
+
132
+ - Better separation of concerns (edit command extraction)
133
+ - Improved filesystem type recognition
134
+ - Enhanced terminal command handling
135
+
136
+ ***
137
+
138
+ AFFECTED PACKAGES
139
+
140
+ Core Packages:
141
+
142
+ - @ecmaos/kernel - Shell, terminal, filesystem enhancements
143
+ - @ecmaos/types - Shell type updates
144
+ - @ecmaos/utils - New ln command, enhanced ls command
145
+
146
+ Applications:
147
+
148
+ - apps/edit - New standalone editor package
149
+
150
+ Dependencies:
151
+
152
+ - All packages: Lockfile updates for consistency
153
+
154
+ ***
155
+
156
+ BREAKING CHANGES
157
+
158
+ None identified. All changes appear to be additive or internal refactoring.
159
+
160
+ ***
161
+
162
+ MIGRATION NOTES
163
+
164
+ - The edit command has been moved from the kernel to apps/edit package. Any code referencing the edit command in the kernel should be updated to use the new package.
165
+ - The ls command now shows additional link information, which may affect scripts parsing its output.
166
+ - Shell commands now support tilde expansion (~), which may affect scripts that previously handled paths differently.
167
+
168
+ - Updated dependencies [ae8f619]
169
+ - @ecmaos/types@0.4.2
170
+
3
171
  ## 0.1.1
4
172
 
5
173
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"cd.d.ts","sourceRoot":"","sources":["../../src/commands/cd.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CA2B/F"}
1
+ {"version":3,"file":"cd.d.ts","sourceRoot":"","sources":["../../src/commands/cd.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAoB/F"}
@@ -12,13 +12,7 @@ export function createCommand(kernel, shell, terminal) {
12
12
  { name: 'path', type: String, typeLabel: '{underline path}', defaultOption: true, description: 'The path to the directory to change to' }
13
13
  ],
14
14
  run: async (argv) => {
15
- let destination = argv.path || shell.cwd;
16
- if (destination && destination.startsWith('~')) {
17
- const home = shell.env.get('HOME');
18
- if (home) {
19
- destination = destination.replace(/^~(?=$|\/)/, home);
20
- }
21
- }
15
+ const destination = argv.path || shell.cwd;
22
16
  const fullPath = destination ? path.resolve(shell.cwd, destination) : shell.cwd;
23
17
  await shell.context.fs.promises.access(fullPath);
24
18
  shell.cwd = fullPath;
@@ -1 +1 @@
1
- {"version":3,"file":"cd.js","sourceRoot":"","sources":["../../src/commands/cd.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,KAAY,EAAE,QAAkB;IAC5E,OAAO,IAAI,eAAe,CAAC;QACzB,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,oCAAoC;QACjD,MAAM;QACN,KAAK;QACL,QAAQ;QACR,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE;YAC3E,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,wCAAwC,EAAE;SAC1I;QACD,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,IAAI,WAAW,GAAI,IAAI,CAAC,IAAe,IAAI,KAAK,CAAC,GAAG,CAAA;YACpD,IAAI,WAAW,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBAClC,IAAI,IAAI,EAAE,CAAC;oBACT,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;gBACvD,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA;YAC/E,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YAChD,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAA;YACpB,YAAY,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC9D,OAAO,CAAC,CAAA;QACV,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"cd.js","sourceRoot":"","sources":["../../src/commands/cd.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,KAAY,EAAE,QAAkB;IAC5E,OAAO,IAAI,eAAe,CAAC;QACzB,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,oCAAoC;QACjD,MAAM;QACN,KAAK;QACL,QAAQ;QACR,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE;YAC3E,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,wCAAwC,EAAE;SAC1I;QACD,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,MAAM,WAAW,GAAI,IAAI,CAAC,IAAe,IAAI,KAAK,CAAC,GAAG,CAAA;YACtD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA;YAC/E,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YAChD,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAA;YACpB,YAAY,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC9D,OAAO,CAAC,CAAA;QACV,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Kernel, Shell, Terminal } from '@ecmaos/types';
2
+ import { TerminalCommand } from '../shared/terminal-command.js';
3
+ export declare function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal): TerminalCommand;
4
+ //# sourceMappingURL=ln.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ln.d.ts","sourceRoot":"","sources":["../../src/commands/ln.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAW,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAoG/F"}
@@ -0,0 +1,104 @@
1
+ import path from 'path';
2
+ import chalk from 'chalk';
3
+ import { TerminalCommand } from '../shared/terminal-command.js';
4
+ import { writelnStdout, writelnStderr } from '../shared/helpers.js';
5
+ export function createCommand(kernel, shell, terminal) {
6
+ return new TerminalCommand({
7
+ command: 'ln',
8
+ description: 'Create links between files',
9
+ kernel,
10
+ shell,
11
+ terminal,
12
+ options: [
13
+ { name: 'help', type: Boolean, description: kernel.i18n.t('Display help') },
14
+ { name: 'symbolic', type: Boolean, alias: 's', description: 'Create symbolic links instead of hard links' },
15
+ { name: 'force', type: Boolean, alias: 'f', description: 'Remove existing destination files' },
16
+ { name: 'verbose', type: Boolean, alias: 'v', description: 'Print name of each linked file' },
17
+ { name: 'args', type: String, multiple: true, defaultOption: true, description: 'The target and optional link name' }
18
+ ],
19
+ run: async (argv, process) => {
20
+ const args = argv.args || [];
21
+ const symbolic = argv.symbolic || false;
22
+ const force = argv.force || false;
23
+ const verbose = argv.verbose || false;
24
+ if (args.length === 0) {
25
+ await writelnStderr(process, terminal, chalk.red('ln: missing file operand'));
26
+ await writelnStderr(process, terminal, 'Try \'ln --help\' for more information.');
27
+ return 1;
28
+ }
29
+ const target = args[0];
30
+ if (!target) {
31
+ await writelnStderr(process, terminal, chalk.red('ln: missing file operand'));
32
+ return 1;
33
+ }
34
+ const targetPath = path.resolve(shell.cwd, target);
35
+ let targetStats;
36
+ try {
37
+ targetStats = await shell.context.fs.promises.stat(targetPath);
38
+ if (!targetStats.isFile() && !targetStats.isDirectory()) {
39
+ await writelnStderr(process, terminal, chalk.red(`ln: ${target}: invalid target`));
40
+ return 1;
41
+ }
42
+ if (!symbolic && targetStats.isDirectory()) {
43
+ await writelnStderr(process, terminal, chalk.red(`ln: ${target}: hard link not allowed for directory`));
44
+ return 1;
45
+ }
46
+ }
47
+ catch (error) {
48
+ await writelnStderr(process, terminal, chalk.red(`ln: ${target}: No such file or directory`));
49
+ return 1;
50
+ }
51
+ let linkName;
52
+ if (args.length === 1) {
53
+ linkName = path.join(shell.cwd, path.basename(target));
54
+ }
55
+ else {
56
+ const linkNameInput = args[1];
57
+ if (!linkNameInput) {
58
+ await writelnStderr(process, terminal, chalk.red('ln: missing link name'));
59
+ return 1;
60
+ }
61
+ const linkNamePath = path.resolve(shell.cwd, linkNameInput);
62
+ const linkNameStats = await shell.context.fs.promises.stat(linkNamePath).catch(() => null);
63
+ if (linkNameStats?.isDirectory()) {
64
+ linkName = path.join(linkNamePath, path.basename(target));
65
+ }
66
+ else {
67
+ linkName = linkNamePath;
68
+ }
69
+ }
70
+ try {
71
+ const linkExists = await shell.context.fs.promises.stat(linkName).catch(() => null);
72
+ if (linkExists) {
73
+ if (force) {
74
+ if (linkExists.isDirectory()) {
75
+ await shell.context.fs.promises.rmdir(linkName);
76
+ }
77
+ else {
78
+ await shell.context.fs.promises.unlink(linkName);
79
+ }
80
+ }
81
+ else {
82
+ await writelnStderr(process, terminal, chalk.red(`ln: ${linkName}: File exists`));
83
+ return 1;
84
+ }
85
+ }
86
+ if (symbolic) {
87
+ await shell.context.fs.promises.symlink(targetPath, linkName);
88
+ }
89
+ else {
90
+ await shell.context.fs.promises.link(targetPath, linkName);
91
+ }
92
+ if (verbose) {
93
+ await writelnStdout(process, terminal, linkName);
94
+ }
95
+ return 0;
96
+ }
97
+ catch (error) {
98
+ await writelnStderr(process, terminal, chalk.red(`ln: ${error.message}`));
99
+ return 1;
100
+ }
101
+ }
102
+ });
103
+ }
104
+ //# sourceMappingURL=ln.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ln.js","sourceRoot":"","sources":["../../src/commands/ln.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../src/commands/ls.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAW,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAmJ/F"}
1
+ {"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../src/commands/ls.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAW,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CA6N/F"}
@@ -36,8 +36,10 @@ export function createCommand(kernel, shell, terminal) {
36
36
  type = 's';
37
37
  return type;
38
38
  };
39
- const getModeString = (stats) => {
40
- return getModeType(stats) + (Number(stats.mode) & parseInt('777', 8)).toString(8).padStart(3, '0')
39
+ const getModeString = (stats, targetStats) => {
40
+ const type = getModeType(stats);
41
+ const modeStats = targetStats || stats;
42
+ const permissions = (Number(modeStats.mode) & parseInt('777', 8)).toString(8).padStart(3, '0')
41
43
  .replace(/0/g, '---')
42
44
  .replace(/1/g, '--' + chalk.red('x'))
43
45
  .replace(/2/g, '-' + chalk.yellow('w') + '-')
@@ -46,6 +48,7 @@ export function createCommand(kernel, shell, terminal) {
46
48
  .replace(/5/g, chalk.green('r') + '-' + chalk.red('x'))
47
49
  .replace(/6/g, chalk.green('r') + chalk.yellow('w') + '-')
48
50
  .replace(/7/g, chalk.green('r') + chalk.yellow('w') + chalk.red('x'));
51
+ return type + permissions;
49
52
  };
50
53
  const getTimestampString = (timestamp) => {
51
54
  const diff = (new Date().getTime() - timestamp.getTime()) / 1000;
@@ -69,14 +72,42 @@ export function createCommand(kernel, shell, terminal) {
69
72
  else
70
73
  return chalk.gray(`${owner?.username || stats.uid}:${owner?.username || stats.gid}`);
71
74
  };
75
+ const getLinkInfo = (linkTarget, linkStats, stats) => {
76
+ if (linkTarget || (linkStats && linkStats.isSymbolicLink()))
77
+ return kernel.i18n.t('Symbolic Link');
78
+ if (stats && stats.nlink > 1)
79
+ return kernel.i18n.t('Hard Link');
80
+ return '';
81
+ };
72
82
  const filesMap = await Promise.all(entries
73
83
  .map(async (entry) => {
74
84
  const target = path.resolve(fullPath, entry);
75
85
  try {
76
- return { target, name: entry, stats: await shell.context.fs.promises.stat(target) };
86
+ let linkTarget = null;
87
+ let linkStats = null;
88
+ let stats = null;
89
+ try {
90
+ linkStats = await shell.context.fs.promises.lstat(target);
91
+ if (linkStats.isSymbolicLink()) {
92
+ try {
93
+ linkTarget = await shell.context.fs.promises.readlink(target);
94
+ stats = await shell.context.fs.promises.stat(target);
95
+ }
96
+ catch {
97
+ stats = linkStats;
98
+ }
99
+ }
100
+ else {
101
+ stats = linkStats;
102
+ }
103
+ }
104
+ catch {
105
+ stats = await shell.context.fs.promises.stat(target);
106
+ }
107
+ return { target, name: entry, stats, linkStats, linkTarget };
77
108
  }
78
109
  catch {
79
- return { target, name: entry, stats: null };
110
+ return { target, name: entry, stats: null, linkStats: null, linkTarget: null };
80
111
  }
81
112
  }));
82
113
  const files = filesMap
@@ -86,10 +117,31 @@ export function createCommand(kernel, shell, terminal) {
86
117
  .map(async (entry) => {
87
118
  const target = path.resolve(fullPath, entry);
88
119
  try {
89
- return { target, name: entry, stats: await shell.context.fs.promises.stat(target) };
120
+ let linkTarget = null;
121
+ let linkStats = null;
122
+ let stats = null;
123
+ try {
124
+ linkStats = await shell.context.fs.promises.lstat(target);
125
+ if (linkStats.isSymbolicLink()) {
126
+ try {
127
+ linkTarget = await shell.context.fs.promises.readlink(target);
128
+ stats = await shell.context.fs.promises.stat(target);
129
+ }
130
+ catch {
131
+ stats = linkStats;
132
+ }
133
+ }
134
+ else {
135
+ stats = linkStats;
136
+ }
137
+ }
138
+ catch {
139
+ stats = await shell.context.fs.promises.stat(target);
140
+ }
141
+ return { target, name: entry, stats, linkStats, linkTarget };
90
142
  }
91
143
  catch {
92
- return { target, name: entry, stats: null };
144
+ return { target, name: entry, stats: null, linkStats: null, linkTarget: null };
93
145
  }
94
146
  }));
95
147
  const directories = directoryMap
@@ -99,22 +151,45 @@ export function createCommand(kernel, shell, terminal) {
99
151
  const data = [
100
152
  ['Name', 'Size', 'Modified', 'Mode', 'Owner', 'Info'],
101
153
  ...directories.sort((a, b) => a.name.localeCompare(b.name)).map(directory => {
154
+ const displayName = directory.linkTarget
155
+ ? `${directory.name} ${chalk.cyan('⟶')} ${directory.linkTarget}`
156
+ : directory.name;
157
+ const modeStats = directory.linkStats && directory.linkStats.isSymbolicLink()
158
+ ? directory.linkStats
159
+ : directory.stats;
160
+ const modeString = modeStats
161
+ ? getModeString(modeStats, directory.linkStats?.isSymbolicLink() ? directory.stats : undefined)
162
+ : '';
163
+ const linkInfo = getLinkInfo(directory.linkTarget, directory.linkStats, directory.stats);
102
164
  return [
103
- directory.name,
165
+ displayName,
104
166
  '',
105
167
  directory.stats ? getTimestampString(directory.stats.mtime) : '',
106
- directory.stats ? getModeString(directory.stats) : '',
168
+ modeString,
107
169
  directory.stats ? getOwnerString(directory.stats) : '',
170
+ linkInfo
108
171
  ];
109
172
  }),
110
173
  ...files.sort((a, b) => a.name.localeCompare(b.name)).map(file => {
174
+ const displayName = file.linkTarget
175
+ ? `${file.name} ${chalk.cyan('⟶')} ${file.linkTarget}`
176
+ : file.name;
177
+ const modeStats = file.linkStats && file.linkStats.isSymbolicLink()
178
+ ? file.linkStats
179
+ : file.stats;
180
+ const modeString = modeStats
181
+ ? getModeString(modeStats, file.linkStats?.isSymbolicLink() ? file.stats : undefined)
182
+ : '';
111
183
  return [
112
- file.name,
184
+ displayName,
113
185
  file.stats ? humanFormat(file.stats.size) : '',
114
186
  file.stats ? getTimestampString(file.stats.mtime) : '',
115
- file.stats ? getModeString(file.stats) : '',
187
+ modeString,
116
188
  file.stats ? getOwnerString(file.stats) : '',
117
189
  (() => {
190
+ const linkInfo = getLinkInfo(file.linkTarget, file.linkStats, file.stats);
191
+ if (linkInfo)
192
+ return linkInfo;
118
193
  if (descriptions.has(path.resolve(fullPath, file.name)))
119
194
  return descriptions.get(path.resolve(fullPath, file.name));
120
195
  const ext = file.name.split('.').pop();
@@ -144,7 +219,12 @@ export function createCommand(kernel, shell, terminal) {
144
219
  .map((cell, index) => {
145
220
  const paddedCell = cell.padEnd(columnWidths?.[index] ?? 0);
146
221
  if (index === 0 && rowIndex > 0) {
147
- return row[3]?.startsWith('d') ? chalk.blue(paddedCell) : chalk.green(paddedCell);
222
+ if (row[3]?.startsWith('d'))
223
+ return chalk.blue(paddedCell);
224
+ else if (row[3]?.startsWith('l'))
225
+ return chalk.cyan(paddedCell);
226
+ else
227
+ return chalk.green(paddedCell);
148
228
  }
149
229
  else
150
230
  return rowIndex === 0 ? chalk.bold(paddedCell) : chalk.gray(paddedCell);
@@ -1 +1 @@
1
- {"version":3,"file":"ls.js","sourceRoot":"","sources":["../../src/commands/ls.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ls.js","sourceRoot":"","sources":["../../src/commands/ls.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export { createCommand as createCd } from './commands/cd.js';
8
8
  export { createCommand as createChmod } from './commands/chmod.js';
9
9
  export { createCommand as createCp } from './commands/cp.js';
10
10
  export { createCommand as createEcho } from './commands/echo.js';
11
+ export { createCommand as createLn } from './commands/ln.js';
11
12
  export { createCommand as createLs } from './commands/ls.js';
12
13
  export { createCommand as createMkdir } from './commands/mkdir.js';
13
14
  export { createCommand as createMv } from './commands/mv.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAkB5F,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAElE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;CAAE,CAgBtH;AAGD,OAAO,EAAE,iBAAiB,IAAI,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAmB5F,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAElE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;CAAE,CAiBtH;AAGD,OAAO,EAAE,iBAAiB,IAAI,gBAAgB,EAAE,CAAA"}
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import { createCommand as createCd } from './commands/cd.js';
7
7
  import { createCommand as createChmod } from './commands/chmod.js';
8
8
  import { createCommand as createCp } from './commands/cp.js';
9
9
  import { createCommand as createEcho } from './commands/echo.js';
10
+ import { createCommand as createLn } from './commands/ln.js';
10
11
  import { createCommand as createLs } from './commands/ls.js';
11
12
  import { createCommand as createMkdir } from './commands/mkdir.js';
12
13
  import { createCommand as createMv } from './commands/mv.js';
@@ -21,6 +22,7 @@ export { createCommand as createCd } from './commands/cd.js';
21
22
  export { createCommand as createChmod } from './commands/chmod.js';
22
23
  export { createCommand as createCp } from './commands/cp.js';
23
24
  export { createCommand as createEcho } from './commands/echo.js';
25
+ export { createCommand as createLn } from './commands/ln.js';
24
26
  export { createCommand as createLs } from './commands/ls.js';
25
27
  export { createCommand as createMkdir } from './commands/mkdir.js';
26
28
  export { createCommand as createMv } from './commands/mv.js';
@@ -40,6 +42,7 @@ export function createAllCommands(kernel, shell, terminal) {
40
42
  chmod: createChmod(kernel, shell, terminal),
41
43
  cp: createCp(kernel, shell, terminal),
42
44
  echo: createEcho(kernel, shell, terminal),
45
+ ln: createLn(kernel, shell, terminal),
43
46
  ls: createLs(kernel, shell, terminal),
44
47
  mkdir: createMkdir(kernel, shell, terminal),
45
48
  mv: createMv(kernel, shell, terminal),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,+BAA+B;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAE5F,2BAA2B;AAC3B,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAElE,sCAAsC;AACtC,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAElE;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,KAAY,EAAE,QAAkB;IAChF,OAAO;QACL,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACvC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACrC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC3C,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACrC,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACzC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACrC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACrC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC3C,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACrC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACvC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACrC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC3C,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACzC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;KAC5C,CAAA;AACH,CAAC;AAED,yDAAyD;AACzD,OAAO,EAAE,iBAAiB,IAAI,gBAAgB,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ecmaos/coreutils",
3
3
  "description": "ecmaOS: Core utilities for the ecmaOS framework",
4
- "version": "0.1.1",
4
+ "version": "0.1.2",
5
5
  "license": "MIT+Apache-2.0",
6
6
  "homepage": "https://ecmaos.sh",
7
7
  "repository": "https://github.com/ecmaos/ecmaos",
@@ -28,7 +28,7 @@
28
28
  "command-line-args": "^6.0.0",
29
29
  "command-line-usage": "^7.0.3",
30
30
  "human-format": "^1.2.1",
31
- "@ecmaos/types": "^0.4.1"
31
+ "@ecmaos/types": "^0.4.2"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/command-line-args": "^5.2.3",
@@ -14,14 +14,7 @@ export function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal):
14
14
  { name: 'path', type: String, typeLabel: '{underline path}', defaultOption: true, description: 'The path to the directory to change to' }
15
15
  ],
16
16
  run: async (argv) => {
17
- let destination = (argv.path as string) || shell.cwd
18
- if (destination && destination.startsWith('~')) {
19
- const home = shell.env.get('HOME')
20
- if (home) {
21
- destination = destination.replace(/^~(?=$|\/)/, home)
22
- }
23
- }
24
-
17
+ const destination = (argv.path as string) || shell.cwd
25
18
  const fullPath = destination ? path.resolve(shell.cwd, destination) : shell.cwd
26
19
  await shell.context.fs.promises.access(fullPath)
27
20
  shell.cwd = fullPath
@@ -0,0 +1,108 @@
1
+ import path from 'path'
2
+ import chalk from 'chalk'
3
+ import type { CommandLineOptions } from 'command-line-args'
4
+ import type { Kernel, Process, Shell, Terminal } from '@ecmaos/types'
5
+ import { TerminalCommand } from '../shared/terminal-command.js'
6
+ import { writelnStdout, writelnStderr } from '../shared/helpers.js'
7
+
8
+ export function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal): TerminalCommand {
9
+ return new TerminalCommand({
10
+ command: 'ln',
11
+ description: 'Create links between files',
12
+ kernel,
13
+ shell,
14
+ terminal,
15
+ options: [
16
+ { name: 'help', type: Boolean, description: kernel.i18n.t('Display help') },
17
+ { name: 'symbolic', type: Boolean, alias: 's', description: 'Create symbolic links instead of hard links' },
18
+ { name: 'force', type: Boolean, alias: 'f', description: 'Remove existing destination files' },
19
+ { name: 'verbose', type: Boolean, alias: 'v', description: 'Print name of each linked file' },
20
+ { name: 'args', type: String, multiple: true, defaultOption: true, description: 'The target and optional link name' }
21
+ ],
22
+ run: async (argv: CommandLineOptions, process?: Process) => {
23
+ const args = (argv.args as string[]) || []
24
+ const symbolic = argv.symbolic as boolean || false
25
+ const force = argv.force as boolean || false
26
+ const verbose = argv.verbose as boolean || false
27
+
28
+ if (args.length === 0) {
29
+ await writelnStderr(process, terminal, chalk.red('ln: missing file operand'))
30
+ await writelnStderr(process, terminal, 'Try \'ln --help\' for more information.')
31
+ return 1
32
+ }
33
+
34
+ const target = args[0]
35
+ if (!target) {
36
+ await writelnStderr(process, terminal, chalk.red('ln: missing file operand'))
37
+ return 1
38
+ }
39
+
40
+ const targetPath = path.resolve(shell.cwd, target)
41
+
42
+ let targetStats
43
+ try {
44
+ targetStats = await shell.context.fs.promises.stat(targetPath)
45
+ if (!targetStats.isFile() && !targetStats.isDirectory()) {
46
+ await writelnStderr(process, terminal, chalk.red(`ln: ${target}: invalid target`))
47
+ return 1
48
+ }
49
+ if (!symbolic && targetStats.isDirectory()) {
50
+ await writelnStderr(process, terminal, chalk.red(`ln: ${target}: hard link not allowed for directory`))
51
+ return 1
52
+ }
53
+ } catch (error) {
54
+ await writelnStderr(process, terminal, chalk.red(`ln: ${target}: No such file or directory`))
55
+ return 1
56
+ }
57
+
58
+ let linkName: string
59
+ if (args.length === 1) {
60
+ linkName = path.join(shell.cwd, path.basename(target))
61
+ } else {
62
+ const linkNameInput = args[1]
63
+ if (!linkNameInput) {
64
+ await writelnStderr(process, terminal, chalk.red('ln: missing link name'))
65
+ return 1
66
+ }
67
+ const linkNamePath = path.resolve(shell.cwd, linkNameInput)
68
+ const linkNameStats = await shell.context.fs.promises.stat(linkNamePath).catch(() => null)
69
+ if (linkNameStats?.isDirectory()) {
70
+ linkName = path.join(linkNamePath, path.basename(target))
71
+ } else {
72
+ linkName = linkNamePath
73
+ }
74
+ }
75
+
76
+ try {
77
+ const linkExists = await shell.context.fs.promises.stat(linkName).catch(() => null)
78
+ if (linkExists) {
79
+ if (force) {
80
+ if (linkExists.isDirectory()) {
81
+ await shell.context.fs.promises.rmdir(linkName)
82
+ } else {
83
+ await shell.context.fs.promises.unlink(linkName)
84
+ }
85
+ } else {
86
+ await writelnStderr(process, terminal, chalk.red(`ln: ${linkName}: File exists`))
87
+ return 1
88
+ }
89
+ }
90
+
91
+ if (symbolic) {
92
+ await shell.context.fs.promises.symlink(targetPath, linkName)
93
+ } else {
94
+ await shell.context.fs.promises.link(targetPath, linkName)
95
+ }
96
+
97
+ if (verbose) {
98
+ await writelnStdout(process, terminal, linkName)
99
+ }
100
+
101
+ return 0
102
+ } catch (error) {
103
+ await writelnStderr(process, terminal, chalk.red(`ln: ${(error as Error).message}`))
104
+ return 1
105
+ }
106
+ }
107
+ })
108
+ }
@@ -35,8 +35,10 @@ export function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal):
35
35
  return type
36
36
  }
37
37
 
38
- const getModeString = (stats: Awaited<ReturnType<typeof shell.context.fs.promises.stat>>) => {
39
- return getModeType(stats) + (Number(stats.mode) & parseInt('777', 8)).toString(8).padStart(3, '0')
38
+ const getModeString = (stats: Awaited<ReturnType<typeof shell.context.fs.promises.stat>>, targetStats?: Awaited<ReturnType<typeof shell.context.fs.promises.stat>>) => {
39
+ const type = getModeType(stats)
40
+ const modeStats = targetStats || stats
41
+ const permissions = (Number(modeStats.mode) & parseInt('777', 8)).toString(8).padStart(3, '0')
40
42
  .replace(/0/g, '---')
41
43
  .replace(/1/g, '--' + chalk.red('x'))
42
44
  .replace(/2/g, '-' + chalk.yellow('w') + '-')
@@ -45,6 +47,7 @@ export function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal):
45
47
  .replace(/5/g, chalk.green('r') + '-' + chalk.red('x'))
46
48
  .replace(/6/g, chalk.green('r') + chalk.yellow('w') + '-')
47
49
  .replace(/7/g, chalk.green('r') + chalk.yellow('w') + chalk.red('x'))
50
+ return type + permissions
48
51
  }
49
52
 
50
53
  const getTimestampString = (timestamp: Date) => {
@@ -65,13 +68,39 @@ export function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal):
65
68
  else return chalk.gray(`${owner?.username || stats.uid}:${owner?.username || stats.gid}`)
66
69
  }
67
70
 
71
+ const getLinkInfo = (linkTarget: string | null, linkStats: Awaited<ReturnType<typeof shell.context.fs.promises.stat>> | null, stats: Awaited<ReturnType<typeof shell.context.fs.promises.stat>> | null) => {
72
+ if (linkTarget || (linkStats && linkStats.isSymbolicLink())) return kernel.i18n.t('Symbolic Link')
73
+ if (stats && stats.nlink > 1) return kernel.i18n.t('Hard Link')
74
+ return ''
75
+ }
76
+
68
77
  const filesMap = await Promise.all(entries
69
78
  .map(async entry => {
70
79
  const target = path.resolve(fullPath, entry)
71
80
  try {
72
- return { target, name: entry, stats: await shell.context.fs.promises.stat(target) }
81
+ let linkTarget: string | null = null
82
+ let linkStats = null
83
+ let stats = null
84
+
85
+ try {
86
+ linkStats = await shell.context.fs.promises.lstat(target)
87
+ if (linkStats.isSymbolicLink()) {
88
+ try {
89
+ linkTarget = await shell.context.fs.promises.readlink(target)
90
+ stats = await shell.context.fs.promises.stat(target)
91
+ } catch {
92
+ stats = linkStats
93
+ }
94
+ } else {
95
+ stats = linkStats
96
+ }
97
+ } catch {
98
+ stats = await shell.context.fs.promises.stat(target)
99
+ }
100
+
101
+ return { target, name: entry, stats, linkStats, linkTarget }
73
102
  } catch {
74
- return { target, name: entry, stats: null }
103
+ return { target, name: entry, stats: null, linkStats: null, linkTarget: null }
75
104
  }
76
105
  }))
77
106
 
@@ -83,9 +112,29 @@ export function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal):
83
112
  .map(async entry => {
84
113
  const target = path.resolve(fullPath, entry)
85
114
  try {
86
- return { target, name: entry, stats: await shell.context.fs.promises.stat(target) }
115
+ let linkTarget: string | null = null
116
+ let linkStats = null
117
+ let stats = null
118
+
119
+ try {
120
+ linkStats = await shell.context.fs.promises.lstat(target)
121
+ if (linkStats.isSymbolicLink()) {
122
+ try {
123
+ linkTarget = await shell.context.fs.promises.readlink(target)
124
+ stats = await shell.context.fs.promises.stat(target)
125
+ } catch {
126
+ stats = linkStats
127
+ }
128
+ } else {
129
+ stats = linkStats
130
+ }
131
+ } catch {
132
+ stats = await shell.context.fs.promises.stat(target)
133
+ }
134
+
135
+ return { target, name: entry, stats, linkStats, linkTarget }
87
136
  } catch {
88
- return { target, name: entry, stats: null }
137
+ return { target, name: entry, stats: null, linkStats: null, linkTarget: null }
89
138
  }
90
139
  }))
91
140
 
@@ -97,22 +146,45 @@ export function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal):
97
146
  const data = [
98
147
  ['Name', 'Size', 'Modified', 'Mode', 'Owner', 'Info'],
99
148
  ...directories.sort((a, b) => a.name.localeCompare(b.name)).map(directory => {
149
+ const displayName = directory.linkTarget
150
+ ? `${directory.name} ${chalk.cyan('⟶')} ${directory.linkTarget}`
151
+ : directory.name
152
+ const modeStats = directory.linkStats && directory.linkStats.isSymbolicLink()
153
+ ? directory.linkStats
154
+ : directory.stats
155
+ const modeString = modeStats
156
+ ? getModeString(modeStats, directory.linkStats?.isSymbolicLink() ? directory.stats : undefined)
157
+ : ''
158
+ const linkInfo = getLinkInfo(directory.linkTarget, directory.linkStats, directory.stats)
100
159
  return [
101
- directory.name,
160
+ displayName,
102
161
  '',
103
162
  directory.stats ? getTimestampString(directory.stats.mtime) : '',
104
- directory.stats ? getModeString(directory.stats) : '',
163
+ modeString,
105
164
  directory.stats ? getOwnerString(directory.stats) : '',
165
+ linkInfo
106
166
  ]
107
167
  }),
108
168
  ...files.sort((a, b) => a.name.localeCompare(b.name)).map(file => {
169
+ const displayName = file.linkTarget
170
+ ? `${file.name} ${chalk.cyan('⟶')} ${file.linkTarget}`
171
+ : file.name
172
+ const modeStats = file.linkStats && file.linkStats.isSymbolicLink()
173
+ ? file.linkStats
174
+ : file.stats
175
+ const modeString = modeStats
176
+ ? getModeString(modeStats, file.linkStats?.isSymbolicLink() ? file.stats : undefined)
177
+ : ''
109
178
  return [
110
- file.name,
179
+ displayName,
111
180
  file.stats ? humanFormat(file.stats.size) : '',
112
181
  file.stats ? getTimestampString(file.stats.mtime) : '',
113
- file.stats ? getModeString(file.stats) : '',
182
+ modeString,
114
183
  file.stats ? getOwnerString(file.stats) : '',
115
184
  (() => {
185
+ const linkInfo = getLinkInfo(file.linkTarget, file.linkStats, file.stats)
186
+ if (linkInfo) return linkInfo
187
+
116
188
  if (descriptions.has(path.resolve(fullPath, file.name))) return descriptions.get(path.resolve(fullPath, file.name))
117
189
  const ext = file.name.split('.').pop()
118
190
  if (ext && descriptions.has('.' + ext)) return descriptions.get('.' + ext)
@@ -142,7 +214,9 @@ export function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal):
142
214
  .map((cell, index) => {
143
215
  const paddedCell = cell.padEnd(columnWidths?.[index] ?? 0)
144
216
  if (index === 0 && rowIndex > 0) {
145
- return row[3]?.startsWith('d') ? chalk.blue(paddedCell) : chalk.green(paddedCell)
217
+ if (row[3]?.startsWith('d')) return chalk.blue(paddedCell)
218
+ else if (row[3]?.startsWith('l')) return chalk.cyan(paddedCell)
219
+ else return chalk.green(paddedCell)
146
220
  } else return rowIndex === 0 ? chalk.bold(paddedCell) : chalk.gray(paddedCell)
147
221
  })
148
222
  .join(' ')
package/src/index.ts CHANGED
@@ -12,6 +12,7 @@ import { createCommand as createCd } from './commands/cd.js'
12
12
  import { createCommand as createChmod } from './commands/chmod.js'
13
13
  import { createCommand as createCp } from './commands/cp.js'
14
14
  import { createCommand as createEcho } from './commands/echo.js'
15
+ import { createCommand as createLn } from './commands/ln.js'
15
16
  import { createCommand as createLs } from './commands/ls.js'
16
17
  import { createCommand as createMkdir } from './commands/mkdir.js'
17
18
  import { createCommand as createMv } from './commands/mv.js'
@@ -27,6 +28,7 @@ export { createCommand as createCd } from './commands/cd.js'
27
28
  export { createCommand as createChmod } from './commands/chmod.js'
28
29
  export { createCommand as createCp } from './commands/cp.js'
29
30
  export { createCommand as createEcho } from './commands/echo.js'
31
+ export { createCommand as createLn } from './commands/ln.js'
30
32
  export { createCommand as createLs } from './commands/ls.js'
31
33
  export { createCommand as createMkdir } from './commands/mkdir.js'
32
34
  export { createCommand as createMv } from './commands/mv.js'
@@ -47,6 +49,7 @@ export function createAllCommands(kernel: Kernel, shell: Shell, terminal: Termin
47
49
  chmod: createChmod(kernel, shell, terminal),
48
50
  cp: createCp(kernel, shell, terminal),
49
51
  echo: createEcho(kernel, shell, terminal),
52
+ ln: createLn(kernel, shell, terminal),
50
53
  ls: createLs(kernel, shell, terminal),
51
54
  mkdir: createMkdir(kernel, shell, terminal),
52
55
  mv: createMv(kernel, shell, terminal),